Creación de tipos de contenido

Última modificación: lunes, 01 de noviembre de 2010

Hace referencia a: SharePoint Foundation 2010

En este artículo
Herencia de tipo de contenido
Diseño de tipos de contenido
Creación de un tipo de contenido mediante XML declarativo
Creación de un tipo de contenido mediante código

Disponible en SharePoint Online

Para crear un tipo de contenido, los programadores suelen escribir código XML declarativo o quizás código de servidor. Esto casi siempre es algo que se lleva a cabo como parte de la creación de una característica que otra persona instala, e incluso alguien más activa. Por lo tanto, lo que se hace con un tipo de contenido no es crearlo, sino definirlo.

Finalmente, la característica se instala y alguien la activa. Microsoft SharePoint Foundation ejecuta el código o lee el XML declarativo y pone a disposición el tipo de contenido. Un usuario administrativo con permiso para administrar listas aplica el nuevo tipo de contenido a una lista o biblioteca de documentos, y de este modo ya está en funcionamiento. Cualquier usuario con permiso para agregar elementos a la lista puede usar el tipo de contenido para crear contenido. Los usuarios administrativos pueden modificar el tipo de contenido para que se adapte a sus necesidades mediante la adición o eliminación de columnas o la modificación de otros atributos. Todo eso está fuera de sus manos.

El punto clave, por lo tanto, es que "crear" un tipo de contenido realmente significa crear una definición de tipo de contenido. Una buena definición de tipo de contenido prevé de qué modo se usará finalmente el tipo de contenido.

Herencia de tipo de contenido

Nunca se crea un tipo de contenido desde cero. En cambio, siempre se seleccionará un tipo de contenido existente como base para cualquier tipo de contenido nuevo que se cree. Esto es exactamente lo que Microsoft SharePoint Foundation hace con sus tipos de contenido integrados. Para obtener información acerca de la jerarquía de los tipos de contenido proporcionados con SharePoint Foundation, vea Jerarquía de tipos de contenido base.

El sitio web donde se crea un nuevo tipo de contenido debe estar en el ámbito del tipo de contenido del que deriva, lo que debe tenerse en cuenta al escribir la definición de tipo de contenido. Para obtener más información, vea Ámbito del tipo de contenido.

SharePoint Foundation admite una forma limitada de la herencia de tipo de contenido. Cuando se activa la característica que define un nuevo tipo de contenido, las columnas y otros metadatos definidos para el tipo de contenido primario se pasan al tipo de contenido secundario. Esta es la única parte automática de la herencia.

Nota

En versiones anteriores de SharePoint Foundation, las columnas y los metadatos agregados a un tipo de contenido una vez aprovisionado no se heredaban por parte de tipos de contenido secundarios. En SharePoint Foundation 2010, este comportamiento ha cambiado. Ahora tiene la opción de incluir las columnas y los metadatos que los usuarios han agregado al elemento primario. Para obtener más información, vea la descripción del atributo Inherits en el elemento ContentType.

Una vez que un tipo de contenido se pone a disposición y se encuentra en uso, cualquier persona puede modificar la definición del tipo de contenido primario, pero dicha modificación no se propagará automáticamente a los tipos de contenido derivados. Este aspecto de la herencia debe iniciarse manualmente a través de la interfaz de usuario o en código personalizado. Para obtener más información, vea Actualización de tipos de contenido secundarios.

Sin embargo, la herencia de tipo de contenido permite trabajar con los tipos de contenido del mismo modo que con las clases derivadas. Por ejemplo, al igual que se pueden invalidar las propiedades de una clase base, también se pueden modificar los atributos que el tipo de contenido deriva de su tipo de contenido primario. Puede agregar, modificar o quitar columnas; especificar formularios de creación, de edición o de presentación diferentes; especificar una plantilla de documento diferente; etc. Esto significa que se pueden crear tipos de contenido base del mismo modo en que se crean clases base al desarrollar un marco de aplicación. Por ejemplo, puede definir un tipo de contenido denominado Financial Document con características comunes a todos los documentos financieros de la organización. A continuación, puede usar el tipo de contenido Financial Document como base para nuevos tipos de contenido, como Invoice y Purchase Order. Los tipos de contenido nuevos heredarán las columnas y otros metadatos de Financial Document, por lo que solo será necesario definir los elementos comunes una vez en el tipo de contenido primario.

Puede obtener ideas para crear su propia jerarquía de tipo de contenido si estudia cómo SharePoint Foundation usa los atributos heredados de los tipos de contenido base y cómo los modifica. Un buen punto de partida es la galería de tipos de contenido de la interfaz de usuario. En el menú Acciones del sitio, elija Configuración del sitio. En la página Configuración del sitio, en Galerías, haga clic en Tipos de contenido de sitio. En la página Tipos de contenido de sitio, haga clic en el vínculo de un tipo de contenido interesante.

Otro buen recurso de estudio es el archivo ctypewss.xml de la carpeta %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\ctype. Este archivo contiene las definiciones de gran cantidad de tipos de contenido integrados. Para obtener ayuda para comprender las definiciones, vea Definiciones de tipo de contenido.

Diseño de tipos de contenido

Para obtener una guía completa sobre la planeación de tipos de contenido, vea el tema sobre la planeación de tipos de contenido y flujos de trabajo. Estas son algunas consideraciones generales:

  • Ámbito. ¿Dónde desea que se encuentre disponible el tipo de contenido en la jerarquía de sitios?

    Si el tipo de contenido debe estar disponible en una colección de sitios completa, debe implementarlo en una característica en el ámbito de la colección de sitios y escribir código en el método FeatureActivated de una clase de receptor de características que agregue el tipo de contenido a la colección de tipos de contenido del sitio web raíz.

  • Elemento primario. ¿De qué tipo de contenido existente en el ámbito derivará su tipo de contenido?

    El tipo de contenido no se activará correctamente si se crea en un sitio web donde el tipo de contenido primario no está disponible.

  • Columnas. ¿Qué columnas de sitio existentes están disponibles para su uso?

    Se deben agregar las columnas que no se heredan del tipo de contenido primario. Se deben crear las columnas que no existen.

  • Recursos adicionales. ¿Serán necesarios recursos de idioma para el tipo de contenido? ¿Plantillas de documento? ¿Formularios?

    Si el tipo de contenido requiere alguno de estos recursos, debe conocer cómo se aprovisionarán y cómo obtendrá acceso a ellos el tipo de contenido.

Creación de un tipo de contenido mediante XML declarativo

Un modo de crear un tipo de contenido consiste en usar XML declarativo para definir el tipo de contenido en el archivo de manifiesto de elemento de una característica. Cuando se activa la característica, se crea el tipo de contenido. Para obtener más información, vea Definiciones de tipo de contenido y Uso de características.

Puede definir varios tipos de contenido en el mismo archivo de manifiesto de elemento. Incluya un elemento ContentType para cada tipo de contenido que defina. El atributo ID es obligatorio y el valor especificado debe seguir un formato muy específico. Un identificador de tipo de contenido con el formato correcto no solo identifica el tipo de contenido nuevo, sino también su tipo de contenido primario. Para obtener más información, vea Identificadores de tipo de contenido.

Si desea crear un identificador para un tipo de contenido derivado de un tipo de contenido integrado, empiece por la cadena hexadecimal que identifica el tipo de contenido integrado, anexe dos ceros y, a continuación, agregue un GUID al que se haya quitado toda la puntuación. Por ejemplo, la cadena hexadecimal que identifica el tipo de contenido Item es "0x01". El identificador para un tipo de contenido derivado de Item debería tener un aspecto como el siguiente:

0x0100A33D9AD9805788419BDAAC2CCB37509F

Si desea crear identificadores para tipos de contenido adicionales que hereden de su tipo de contenido, anexe "01", "02" y así sucesivamente.

Otro atributo obligatorio del elemento ContentType es Name, que especifica un nombre para mostrar. El valor puede ser una referencia a un recurso en el formato $Resources:String. Para obtener más información, vea el tema sobre cómo localizar soluciones de SharePoint. El nombre propiamente dicho no puede tener más de 128 caracteres y no puede contener los caracteres \ / : * ? " # % < > { } | ~ &, dos puntos consecutivos (..) ni caracteres especiales como un carácter de tabulación.

Al incluir columnas en un tipo de contenido, no se deben crear en la definición de tipo de contenido, sino que se debe hacer referencia a columnas creadas en otro sitio. Para incluir una referencia de columna, agregue un elemento FieldRef como elemento secundario del elemento ContentType. La columna a la que se hace referencia puede ser una que ya exista como una columna de sitio, o bien una columna nueva creada por la misma característica que crea el tipo de contenido. Para obtener información acerca de la creación de columnas de sitio, vea Definiciones de campo.

También puede usar el elemento FieldRef para hacer referencia a una columna que el tipo de contenido hereda de su tipo de contenido primario. En este caso, la razón por la que se hace referencia a la columna no es para agregarla, sino para cambiar algunas de sus características al usarla en el tipo de contenido.

El atributo ID del elemento FieldRef identifica la columna a la que se hace referencia. El valor debe ser la representación de cadena de un GUID, incluidas las llaves. El valor distingue mayúsculas de minúsculas.

SugerenciaSugerencia

Puede encontrar los identificadores para los campos integrados en el archivo fieldswss.xml ubicado en la siguiente ruta de acceso: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.

Si el tipo de contenido usa una plantilla de documento para el nuevo contenido, puede identificarla en un elemento DocumentTemplate dentro del elemento ContentType. Debe aprovisionar el archivo por separado. Una forma de hacerlo consiste en agregar un elemento Module al manifiesto e incluir el archivo con la característica. Para obtener más información, vea Procedimientoa para aprovisionar un archivo.

La definición de tipo de contenido puede incluir también las definiciones de formularios personalizados por medio de un elemento XMLDocuments. Para obtener más información, vea Información personalizada en tipos de contenido.

Ejemplo

En el siguiente ejemplo se muestra el manifiesto de elemento de una característica que crea cuatro columnas de sitio y tres tipos de contenido de sitio. El primer tipo de contenido, Financial Document, es un elemento secundario del tipo de contenido Document integrado. Los dos tipos de contenido nuevos restantes, Invoice y Purchase Order, derivan de Financial Document.

La definición de Financial Document hace referencia a dos de las nuevas columnas de sitio: DateOpened e Amount. El elemento FieldRef que hace referencia a la columna DateOpened establece el atributo DisplayName de forma que el nombre de la columna se presentará como "Date" en lugar de "Date Opened", como se define en la columna de sitio.

El tipo de contenido Invoice es el primero de dos tipos de contenido nuevos que derivan de Financial Document. La definición del tipo de contenido hace referencia a una tercera columna de sitio nueva, Client, y establece el atributo Required en TRUE para que se requiera una entrada para este campo al crear un nuevo elemento. El tipo Invoice incluye un elemento FieldRef para la columna Title, aunque se hereda, a fin de cambiar el valor del atributo DisplayName de "Title" a "Service".

El segundo tipo de contenido que deriva de Financial Document es Purchase Order. La definición del tipo de contenido hace referencia a la cuarta columna de sitio nueva, CostCenter, y establece el atributo DisplayName para que el nombre de columna se presente como "Department" en lugar de "Cost Center", como está definido en la columna de sitio.

Purchase Order hereda las referencias de columna de su elemento primario, Financial Document, por lo que no es necesario volver a hacer referencia a éstos. El tipo de contenido también hereda una referencia a la columna Title de Financial Document, que hereda la columna de su elemento primario, Document. El tipo Purchase Order incluye un elemento FieldRef para la columna Title a fin de invalidar el atributo DisplayName heredado con un valor propio.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <!-- Document Templates -->
  
  <Module Name="InvoiceDocumentTemplate"
          Path="FinancialDocuments"
          Url="_cts/Invoice" RootWebOnly="TRUE">
    <File Url="Invoice.docx" Type="Ghostable" />
  </Module>
  
  <Module Name="PurchaseOrderDocumentTemplate"
          Path="FinancialDocuments"
          Url="_cts/PurchaseOrder" RootWebOnly="TRUE">
    <File Url="PurchaseOrder.docx" Type="Ghostable" />
  </Module>


  <!-- Site Columns -->
 
  <Field ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}"
         Name="Amount"
         DisplayName="Amount"
         Type="Currency"
         Decimals="2"
         Min="0"
         Required="FALSE"
         Group="Financial Columns" />

   <Field ID="{86811853-7E52-4515-A88D-A8FA9D450905}"
         Name="Client"
         DisplayName="Client Name"
         Type="Text"
         Required="FALSE"
         Group="Financial Columns"/>

    <Field ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}"
         Name="DateOpened"
         DisplayName="Date Opened"
         Type="DateTime"
         Format="DateOnly"
         Required="FALSE"
         Group="Financial Columns">
    <Default>[today]</Default>
  </Field>
  
 <Field ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}"
         Name="CostCenter"
         DisplayName="Department"
         Type="Choice"
         Required="FALSE"
         Group="Financial Columns">
    <CHOICES>
      <CHOICE>Administration</CHOICE>
      <CHOICE>Information</CHOICE>
      <CHOICE>Facilities</CHOICE>
      <CHOICE>Operations</CHOICE>
      <CHOICE>Sales</CHOICE>
      <CHOICE>Marketing</CHOICE>
    </CHOICES>
  </Field>

  <!-- Site Content Types -->
  
  <!-- Parent ContentType: Document (0x0101) -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e"
               Name="Financial Document"
               Group="Financial Content Types"
               Description="Base financial content type"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}" Name="DateOpened" DisplayName="Date" Required="TRUE"/>
      <FieldRef ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}" Name="Amount" DisplayName="Amount" Required="FALSE"/>
    </FieldRefs>
  </ContentType>

  <!-- Parent ContentType: Financial Document -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e01"
                Name="Invoice"
                Group="Financial Content Types"
                Description="Used for creating customer invoices"
                Inherits="TRUE"
                Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Service" Required="TRUE" Sealed="TRUE"/>
      <FieldRef ID="{86811853-7E52-4515-A88D-A8FA9D450905}" Name="Client" DisplayName="Client Name" Required="TRUE"/>
    </FieldRefs>
    <DocumentTemplate TargetName="Invoice.docx" />
  </ContentType>
  
  <!-- Parent ContentType: Financial Document -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e02"
               Name="PurchaseOrder"
               Group="Financial Content Types"
               Description="Used for creating purchase orders"
               Inherits="TRUE"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Item" Required="TRUE" Sealed="TRUE"/>
      <FieldRef ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}" Name="CostCenter" DisplayName="Department" Required="TRUE"/>
    </FieldRefs>
    <DocumentTemplate TargetName="PurchaseOrder.docx"/>
  </ContentType>

</Elements>

Creación de un tipo de contenido mediante código

Como alternativa al uso de XML declarativo para crear un tipo de contenido, puede usar el modelo de objetos de SharePoint Foundation. Normalmente, el XML declarativo es más fácil de escribir. Sin embargo, generalmente ofrece menos flexibilidad que el modelo de objetos, el cual tiene acceso a las funcionalidades de Microsoft .NET Framework completo y se puede depurar en tiempo de ejecución. Ambos enfoques son compatibles con las plantillas proporcionadas por las Herramientas de desarrollo de SharePoint en Microsoft Visual Studio 2010.

Coloque el código que define el tipo de contenido en el método FeatureActivated de una subclase de la clase SPFeatureReceiver.

Para crear un tipo de contenido, se debe llamar al constructor de la clase SPContentType. Antes de llamar al constructor, debe recopilar tres elementos para pasarlos como argumentos:

  • Un objeto SPContentType que representa el tipo de contenido primario.

    Puede recuperar este objeto de la colección devuelta en la propiedad AvailableContentTypes del objeto SPWeb que representa el sitio web donde se crea el tipo de contenido.

  • Un objeto SPContentTypeCollection que representa la colección del sitio web donde se crea el tipo de contenido.

    Para obtener este objeto, debe obtener acceso a la propiedad ContentTypes del objeto SPWeb que representa el sitio web donde se crea el tipo de contenido.

  • Una cadena que contiene el nombre que desea asignar al tipo de contenido.

    El nombre proporcionado se usa como el nombre para mostrar del tipo de contenido. Algunos caracteres no se permiten en los nombres de tipo de contenido. Puede validar el nombre propuesto mediante una llamada al método estático ValidateName(String). Este método comprueba si hay caracteres no válidos, pero no comprueba si hay nombres duplicados.

Después de llamar al constructor para crear un nuevo objeto SPContentType, debe agregarlo a la colección de tipos de contenido del sitio web en una llamada independiente al método Add(SPContentType) del objeto SPContentTypeCollection que representa la colección del sitio web. Con este paso se completa la inicialización del tipo de contenido.

Nota de precauciónPrecaución

El método Add(SPContentType) produce una excepción SPException si ya existe un tipo de contenido con el mismo nombre en la colección.

Si planea establecer las propiedades del tipo de contenido, debe guardar el objeto SPContentType devuelto por el método Add.

Puede agregar columnas al tipo de contenido mediante una referencia a cada columna en un objeto SPFieldLink. A continuación, llame al método Add(SPFieldLink) del objeto SPFieldLinkCollection devuelto por la propiedad FieldLinks del tipo de contenido.

Una vez completada la configuración del tipo de contenido, llame al método Update() para confirmar los cambios en la base de datos.

Ejemplo

En el ejemplo siguiente se crean exactamente las mismas columnas de sitio y tipos de contenido que se crearon en el ejemplo anterior. La única diferencia es que, en lugar de usar XML declarativo, en este ejemplo se usa código en el método FeatureActivated de un receptor de características.

El parámetro properties del método FeatureActivated es un objeto SPFeatureReceiverProperties. La propiedad Feature de este objeto devuelve un objeto SPFeature que tiene una propiedad Parent que contiene un objeto SPSite encuadrado o un objeto SPWeb encuadrado. No debe eliminar estos objetos. No obstante, debe eliminar los objetos SPWeb o SPSite nuevos que cree el código. Para obtener más información, vea Eliminación de objetos.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb web = null;
    if (properties.Feature.Parent is SPSite)
    {
        SPSite sites = (SPSite)properties.Feature.Parent;
        web = sites.RootWeb;
    }
    else
    {
        web = (SPWeb)properties.Feature.Parent;
    }
    if (web == null)
        return;

    /* CREATE SITE COLUMNS */

    string columnGroup = "Financial Columns";

    // Amount
    string amountFieldName = web.Fields.Add("Amount", SPFieldType.Currency, false);
    SPFieldCurrency amountField = (SPFieldCurrency)web.Fields.GetFieldByInternalName(amountFieldName);
    amountField.Group = columnGroup;
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals;
    amountField.MinimumValue = 0;
    amountField.Update();

    // Client Name
    string clientFieldName = web.Fields.Add("Client Name", SPFieldType.Text, false);
    SPFieldText clientField = (SPFieldText)web.Fields.GetFieldByInternalName(clientFieldName);
    clientField.Group = columnGroup;
    clientField.Update();

    // Date Opened
    string dateOpenedFieldName = web.Fields.Add("Date Opened", SPFieldType.DateTime, false);
    SPFieldDateTime dateOpenedField = (SPFieldDateTime)web.Fields.GetFieldByInternalName(dateOpenedFieldName);
    dateOpenedField.Group = columnGroup;
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;
    dateOpenedField.DefaultValue = "[today]";
    dateOpenedField.Update();

    // Cost Center Name
    string costCenterFieldName = web.Fields.Add("Cost Center", SPFieldType.Choice, false);
    SPFieldChoice costCenterField = (SPFieldChoice)web.Fields.GetFieldByInternalName(costCenterFieldName);
    costCenterField.Choices.Add("Administration");
    costCenterField.Choices.Add("Information Services");
    costCenterField.Choices.Add("Facilities");
    costCenterField.Choices.Add("Operations");
    costCenterField.Choices.Add("Sales");
    costCenterField.Choices.Add("Marketing");
    costCenterField.Group = columnGroup;
    costCenterField.Update();

    /* CREATE SITE CONTENT TYPES */

    string contentTypeGroup = "Financial Content Types";

    // Get a content type to be the parent of a new Financial Document content type.
    SPContentType documentCType = web.AvailableContentTypes[SPBuiltInContentTypeId.Document];

    // Create the Financial Document content type.
    SPContentType financialDocumentCType = new SPContentType(documentCType, web.ContentTypes, "Financial Document");

    // Note: A content type is not initialized until after it is added.
    financialDocumentCType = web.ContentTypes.Add(financialDocumentCType);
    financialDocumentCType.Group = contentTypeGroup;

    // Add the Date Opened column. Child content types inherit the column.
    SPFieldLink dateOpenedFieldRef = new SPFieldLink(dateOpenedField);
    dateOpenedFieldRef.Required = true;
    financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef);

    // Add the Amount column. Child content types inherit the column.
    SPFieldLink amountFieldRef = new SPFieldLink(amountField);
    financialDocumentCType.FieldLinks.Add(amountFieldRef);

    // Commit changes.
    financialDocumentCType.Update();

    // Create the Invoice content type.
    SPContentType invoiceCType = new SPContentType(financialDocumentCType, web.ContentTypes, "Invoice");
    invoiceCType = web.ContentTypes.Add(invoiceCType);
    invoiceCType.Group = contentTypeGroup;

    // Modify the Title column inherited from the parent.
    SPFieldLink serviceFieldRef = invoiceCType.FieldLinks[SPBuiltInFieldId.Title];
    serviceFieldRef.DisplayName = "Service";
    serviceFieldRef.Required = true;

    // Add the Client column.
    SPFieldLink clientFieldRef = new SPFieldLink(clientField);
    clientFieldRef.Required = true;
    invoiceCType.FieldLinks.Add(clientFieldRef);

    // Specify a document template.
    invoiceCType.DocumentTemplate = "Invoice.docx";

    // Commit changes.
    invoiceCType.Update();

    // Create the Purchase Order content type.
    SPContentType purchaseOrderCType = new SPContentType(financialDocumentCType, web.ContentTypes, "Purchase Order");
    purchaseOrderCType = web.ContentTypes.Add(purchaseOrderCType);
    purchaseOrderCType.Group = contentTypeGroup;

    // Modify the Title column inherited from the parent.
    SPFieldLink itemFieldRef = purchaseOrderCType.FieldLinks[SPBuiltInFieldId.Title];
    itemFieldRef.DisplayName = "Item";
    itemFieldRef.Required = true;

    // Add the Department column.
    SPFieldLink departmentFieldRef = new SPFieldLink(costCenterField);
    departmentFieldRef.DisplayName = "Department";
    departmentFieldRef.Required = true;
    purchaseOrderCType.FieldLinks.Add(departmentFieldRef);

    // Specify a document template.
    purchaseOrderCType.DocumentTemplate = "PurchaseOrder.docx";

    // Commit changes.
    purchaseOrderCType.Update();

}
Public Overrides Sub FeatureActivated(ByVal properties As Microsoft.SharePoint.SPFeatureReceiverProperties)
    Dim web As SPWeb = Nothing
    If TypeOf properties.Feature.Parent Is SPSite Then
        Dim sites As SPSite = DirectCast(properties.Feature.Parent, SPSite)
        web = sites.RootWeb
    Else
        web = DirectCast(properties.Feature.Parent, SPWeb)
    End If
    If web Is Nothing Then
        Return
    End If

    ' CREATE SITE COLUMNS 

    Dim columnGroup As String = "Financial Columns"

    ' Amount
    Dim amountFieldName As String = web.Fields.Add("Amount", SPFieldType.Currency, False)
    Dim amountField As SPFieldCurrency = DirectCast(web.Fields.GetFieldByInternalName(amountFieldName), SPFieldCurrency)
    amountField.Group = columnGroup
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals
    amountField.MinimumValue = 0
    amountField.Update()

    ' Client Name
    Dim clientFieldName As String = web.Fields.Add("Client Name", SPFieldType.Text, False)
    Dim clientField As SPFieldText = DirectCast(web.Fields.GetFieldByInternalName(clientFieldName), SPFieldText)
    clientField.Group = columnGroup
    clientField.Update()

    ' Date Opened
    Dim dateOpenedFieldName As String = web.Fields.Add("Date Opened", SPFieldType.DateTime, False)
    Dim dateOpenedField As SPFieldDateTime = DirectCast(web.Fields.GetFieldByInternalName(dateOpenedFieldName), SPFieldDateTime)
    dateOpenedField.Group = columnGroup
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly
    dateOpenedField.DefaultValue = "[today]"
    dateOpenedField.Update()

    ' Cost Center Name
    Dim costCenterFieldName As String = web.Fields.Add("Cost Center", SPFieldType.Choice, False)
    Dim costCenterField As SPFieldChoice = DirectCast(web.Fields.GetFieldByInternalName(costCenterFieldName), SPFieldChoice)
    costCenterField.Choices.Add("Administration")
    costCenterField.Choices.Add("Information Services")
    costCenterField.Choices.Add("Facilities")
    costCenterField.Choices.Add("Operations")
    costCenterField.Choices.Add("Sales")
    costCenterField.Choices.Add("Marketing")
    costCenterField.Group = columnGroup
    costCenterField.Update()

    ' CREATE SITE CONTENT TYPES 

    Dim contentTypeGroup As String = "Financial Content Types"

    ' Get a content type to be the parent of a new Financial Document content type.
    Dim documentCType As SPContentType = web.AvailableContentTypes(SPBuiltInContentTypeId.Document)

    ' Create the Financial Document content type.
    Dim financialDocumentCType As New SPContentType(documentCType, web.ContentTypes, "Financial Document")

    ' Note: A content type is not initialized until after it is added.
    financialDocumentCType = web.ContentTypes.Add(financialDocumentCType)
    financialDocumentCType.Group = contentTypeGroup

    ' Add the Date Opened column. Child content types inherit the column.
    Dim dateOpenedFieldRef As New SPFieldLink(dateOpenedField)
    dateOpenedFieldRef.Required = True
    financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef)

    ' Add the Amount column. Child content types inherit the column.
    Dim amountFieldRef As New SPFieldLink(amountField)
    financialDocumentCType.FieldLinks.Add(amountFieldRef)

    ' Commit changes.
    financialDocumentCType.Update()

    ' Create the Invoice content type.
    Dim invoiceCType As New SPContentType(financialDocumentCType, web.ContentTypes, "Invoice")
    invoiceCType = web.ContentTypes.Add(invoiceCType)
    invoiceCType.Group = contentTypeGroup

    ' Modify the Title column inherited from the parent.
    Dim serviceFieldRef As SPFieldLink = invoiceCType.FieldLinks(SPBuiltInFieldId.Title)
    serviceFieldRef.DisplayName = "Service"
    serviceFieldRef.Required = True

    ' Add the Client column.
    Dim clientFieldRef As New SPFieldLink(clientField)
    clientFieldRef.Required = True
    invoiceCType.FieldLinks.Add(clientFieldRef)

    ' Specify a document template.
    invoiceCType.DocumentTemplate = "Invoice.docx"

    ' Commit changes.
    invoiceCType.Update()

    ' Create the Purchase Order content type.
    Dim purchaseOrderCType As New SPContentType(financialDocumentCType, web.ContentTypes, "Purchase Order")
    purchaseOrderCType = web.ContentTypes.Add(purchaseOrderCType)
    purchaseOrderCType.Group = contentTypeGroup

    ' Modify the Title column inherited from the parent.
    Dim itemFieldRef As SPFieldLink = purchaseOrderCType.FieldLinks(SPBuiltInFieldId.Title)
    itemFieldRef.DisplayName = "Item"
    itemFieldRef.Required = True

    ' Add the Department column.
    Dim departmentFieldRef As New SPFieldLink(costCenterField)
    departmentFieldRef.DisplayName = "Department"
    departmentFieldRef.Required = True
    purchaseOrderCType.FieldLinks.Add(departmentFieldRef)

    ' Specify a document template.
    purchaseOrderCType.DocumentTemplate = "PurchaseOrder.docx"

    ' Commit changes.
    purchaseOrderCType.Update()

End Sub

Vea también

Tareas

Procedimiento para hacer referencia a una columna en un tipo de contenido

Procedimiento para agregar un tipo de contenido a un sitio

Procedimiento para agregar un tipo de contenido a un sitio

Conceptos

Tipos de contenido de listas y sitios

Ámbito del tipo de contenido

Definiciones de tipo de contenido

Otros recursos

Planeación de tipos de contenido y flujos de trabajo (SharePoint Server 2010)

Creación de tipos de contenido personalizados en SharePoint 2010

Tutorial: Crear un campo, tipo de contenido, definición de lista e instancia de lista personalizados

Procedimiento para crear tipos de contenido mediante programación