Procedimiento para agregar un tipo de contenido a un sitio
Última modificación: viernes, 27 de mayo de 2011
Hace referencia a: SharePoint Foundation 2010
Disponible en SharePoint Online
Puede hacer referencia a los tipos de contenido en el XML para una definición de lista de modo que, cada vez que un usuario cree una lista de ese tipo, Microsoft SharePoint Foundation 2010 incluya el tipo de contenido en la lista de manera predeterminada. También puede agregar tipos de contenido a una lista existente escribiendo código que use el modelo de objetos de SharePoint Foundation.
Especificación de los tipos de contenido de una definición de lista
Antes de agregar un tipo de contenido a una definición de lista, debe asegurarse de que la lista esté configurada para admitir tipos de contenido. Lo primero que debe comprobar es la plantilla desde la que se crea la instancia de lista. Si el elemento ListTemplate tiene un atributo denominado DisallowContentTypes y está establecido en TRUE, la lista no admite tipos de contenido. Cuando el atributo falta o está establecido en FALSE, la lista admite tipos de contenido.
Lo siguiente que debe comprobar es si los tipos de contenido están habilitados en la instancia de lista. El archivo Schema.xml que define la instancia de lista tiene un elemento List. Este elemento debe incluir un atributo denominado EnableContentTypes, el cual se debe establecer en TRUE. Si se establece en TRUE, equivale a seleccionar Sí en ¿Desea permitir la administración de tipos de contenido? en la sección Configuración avanzada de Configuración de lista.
Para agregar un tipo de contenido a una definición de lista, puede agregar un elemento ContentTypes al esquema de lista. El elemento ContentTypes contiene una colección de elementos ContentTypeRef. Cada elemento ContentTypeRef especifica un tipo de contenido del sitio que SharePoint Foundation debe copiar en la lista localmente cada vez que un usuario crea una nueva lista del tipo especificado. El elemento ContentTypeRef contiene un único atributo, ID, el cual se debe establecer como el identificador del tipo de contenido.
El tipo de contenido del sitio al que hace referencia debe estar en el ámbito para la lista, es decir, debe estar declarado en el mismo nivel del sitio o en un nivel superior de la jerarquía de sitios. Para obtener más información acerca del ámbito del tipo de contenido, vea Ámbito del tipo de contenido.
Nota
Cuando SharePoint Foundation crea una instancia de lista, incluye solo las columnas que se declaran en el esquema de tipo base de la lista o en el esquema de lista. Si hace referencia a un tipo de contenido del sitio en el esquema de lista y dicho tipo de contenido hace referencia a columnas de sitio que no se incluyen en el esquema de tipo base de la lista o en el esquema de lista, dichas columnas no se incluirán. Debe declarar estas columnas en el esquema de lista para que SharePoint Foundation las incluya en la lista.
Para obtener más información acerca de las columnas de sitio, consulte Introducción a las columnas.
Para agregar un tipo de contenido a una definición de lista
En la definición XML de lista, agregue un elemento ContentTypeRef al elemento ContentTypes.
Establezca el atributo ID del elemento ContentTypeRef en el identificador de tipo de contenido que desee incluir en la lista.
En el siguiente ejemplo se muestra marcado parcial de un esquema de definición de lista que incluye un elemento ContentTypeRef.
<List xmlns:ows="Microsoft SharePoint" Title="The List" Direction="$Resources:Direction;" FolderCreation="FALSE" Url="Lists/TheList" BaseType="0" xmlns="https://schemas.microsoft.com/sharepoint/">
<MetaData>
<ContentTypes>
<ContentTypeRef ID="0x01060062efcfca3f4d4036a0c54ed20108fa2e" />
</ContentTypes>
...
</MetaData>
</List>
Para obtener más información sobre el elemento ContentTypes en el esquema de definición de lista, vea Elemento ContentTypes (Lista).
Adición de tipos de contenido a una lista existente
Puede usar el modelo de objetos de SharePoint Foundation para agregar tipos de contenido a una lista existente.
Para agregar un tipo de contenido a una lista
Use la propiedad Lists para obtener una colección de listas del sitio en el que se encuentra la lista.
Declare una variable de tipo SPList y establézcala de la misma manera que el objeto de la colección de la lista de sitios que representa la lista.
Habilite los tipos de contenido de la lista estableciendo el valor de propiedad ContentTypesEnabled de la lista en true.
Use la propiedad AvailableContentTypes para tener acceso a los tipos de contenido disponibles para el sitio en el que se ubica la lista. Este método devuelve un objeto SPContentTypeCollection.
Declare un tipo de variable SPContentType y establézcala de la misma manera que el objeto SPContentType en la colección que representa el tipo de contenido del sitio que desea agregar a la lista.
Compruebe que la lista pueda aceptar el tipo de contenido seleccionado llamando al método IsContentTypeAllowed(SPContentType).
Use la propiedad ContentTypes para tener acceso a la colección de tipos de contenido de lista en la lista especificada. Este método devuelve un objeto SPContentTypeCollection.
Use el método Add para agregar el objeto SPContentType a la colección de tipo de contenido de lista.
Cuando agrega un tipo de contenido de sitio a una lista mediante el modelo de objetos, SharePoint Foundation agrega automáticamente cualquier columna del tipo de contenido que todavía no esté en la lista. Esto difiere de la forma en que se hace referencia a los tipos de contenido en un esquema de lista, en cuyo caso debe agregar de forma explícita las columnas al esquema de lista para que SharePoint Foundation las incluya en las instancias de lista.
Ejemplo
En el siguiente ejemplo se muestra una aplicación de consola que agrega un tipo de contenido de sitio a la lista Documentos compartidos en un sitio. El tipo de contenido que se usa en el ejemplo es el mismo tipo de contenido que se crea en el ejemplo de Procedimiento para agregar un tipo de contenido a un sitio.
Las aplicaciones de consola son útiles para experimentar en un entorno de desarrollo. En un entorno de producción, lo más probable es incluir el código en este ejemplo como parte del método FeatureActivated de un objeto SPFeatureReceiver.
using System;
using Microsoft.SharePoint;
namespace Test
{
class Program
{
static void Main(string[] args)
{
using (SPSite siteCollection = new SPSite("https://localhost"))
{
using (SPWeb site = siteCollection.OpenWeb())
{
// Get a content type.
SPContentType ct = site.AvailableContentTypes["Financial Document"];
// The content type was found.
if (ct != null)
{
// Get a list.
try
{
SPList list = site.Lists["Shared Documents"]; // Throws exception if does not exist.
// Make sure the list accepts content types.
list.ContentTypesEnabled = true;
// Add the content type to the list.
if (!list.IsContentTypeAllowed(ct))
Console.WriteLine("The {0} content type is not allowed on the {1} list",
ct.Name, list.Title);
else if (list.ContentTypes[ct.Name] != null)
Console.WriteLine("The content type name {0} is already in use on the {1} list",
ct.Name, list.Title);
else
list.ContentTypes.Add(ct);
}
catch (ArgumentException ex) // No list is found.
{
Console.WriteLine("The list does not exist.");
}
}
else // No content type is found.
{
Console.WriteLine("The content type is not available in this site.");
}
}
}
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
}
}
Imports System
Imports Microsoft.SharePoint
Module Test
Sub Main()
Using siteCollection As SPSite = New SPSite("https://localhost")
Using site As SPWeb = siteCollection.OpenWeb()
' Get a content type.
Dim ct As SPContentType = site.AvailableContentTypes("Financial Document")
If ct IsNot Nothing Then
' The content type was found.
Try
' Get a list.
Dim list As SPList = site.Lists("Shared Documents")
' Make sure the list accepts content types.
list.ContentTypesEnabled = True
' Add the content type to the list.
If Not list.IsContentTypeAllowed(ct) Then
Console.WriteLine("The {0} content type is not allowed on the {1} list", ct.Name, list.Title)
ElseIf list.ContentTypes(ct.Name) IsNot Nothing Then
Console.WriteLine("The content type name {0} is already in use on the {1} list", ct.Name, list.Title)
Else
list.ContentTypes.Add(ct)
End If
Catch ex As ArgumentException
' No list is found.
Console.WriteLine("The list does not exist.")
End Try
Else
' No content type is found.
Console.WriteLine("The content type is not available in this site.")
End If
End Using
End Using
Console.Write(vbCrLf + "Press ENTER to continue...")
Console.ReadLine()
End Sub
End Module