Compartir a través de


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

Última modificación: miércoles, 10 de noviembre de 2010

Hace referencia a: SharePoint Foundation 2010

Las columnas nunca se definen directamente en un tipo de contenido. Se definen en otro sitio y se les hace referencia en el tipo de contenido. Se hace referencia a una columna en un tipo de contenido por dos razones:

  • Se desea agregar una columna al tipo de contenido.

  • Se desean cambiar las características de una columna que el tipo de contenido hereda de su tipo de contenido primario.

    Para obtener más información sobre la herencia, vea la descripción del atributo Inherits del elemento ContentType en el esquema de definición de tipo de contenido.

En XML declarativo, se hace referencia a una columna mediante el elemento FieldRef. En código, se le hace referencia mediante la creación de un objeto SPFieldLink.

Nota

En Microsoft SharePoint Foundation, los campos son columnas con otro nombre. La palabra "columna" suele usarse para referirse al modo en que la interfaz de usuario representa un campo.

Para obtener información acerca de las diferencias entre las columnas y las referencias a las columnas, vea Campos y referencias a campos.

Referencia a las columnas 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.

Para incluir una columna en la definición de tipo de contenido, se hace referencia a ella en un elemento FieldRef. La columna a la que se hace referencia puede ser una que ya exista como una columna de sitio, o bien puede ser una columna nueva creada por la misma característica que crea el tipo de contenido. 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.

Para crear una referencia de columna mediante XML declarativo

  1. En la definición de tipo de contenido, agregue un elemento FieldRef en el nodo FieldRefs.

  2. Para hacer referencia a la columna, establezca el valor del atributo ID del elemento FieldRef en el identificador de la columna.

    El valor debe ser la representación de cadena de un GUID entre llaves, como en el siguiente ejemplo:

    ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}"

    El atributo ID distingue mayúsculas de minúsculas, por lo que debe asegurarse de establecer el atributo exactamente en el mismo valor que el atributo ID del elemento Field.

    Puede encontrar los identificadores de las columnas integradas en el archivo fieldswss.xml, que se encuentra en la siguiente ruta de acceso: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.

  3. Establezca el valor del atributo Name del elemento FieldRef en el mismo valor que el atributo Name del elemento Field que representa la columna.

  4. Para definir la columna como desee, establezca otros atributos del elemento FieldRef.

    Por ejemplo, para cambiar el texto que se muestra para la columna, establezca el valor del atributo DisplayName.

Muchos atributos del elemento FieldRef tienen el mismo nombre y propósito que los atributos del elemento Field al que se hace referencia. Solo es necesario que el valor del atributo ID y los atributos Name sean iguales. Para atributos adicionales, el uso de un valor diferente en el elemento FieldRef puede cambiar las características de la columna cuando se usa en el tipo de contenido, sin cambiar la columna a la que se hace referencia.

Nota importanteImportante

Los atributos ID, Name, DisplayName y Required del elemento FieldRef siempre son obligatorios, incluso cuando el elemento FieldRef hace referencia a un campo definido en el mismo manifiesto de elemento.

Ejemplo

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

La definición de Financial Document hace referencia a dos de las nuevas columnas de sitio: DateOpened y Amount. El elemento FieldRef que hace referencia a la columna DateOpened establece el atributo DisplayName de forma que el nombre de la columna se representa como "Fecha" en lugar de "Fecha de Apertura" como se define en la columna de sitio.

La definición de Purchase Order hace referencia a la tercera columna de sitio nueva, CostCenter, y establece el atributo DisplayName para que el nombre de la columna se represente 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 título 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/">

  <!-- New Site 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="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}"
         Name="Amount"
         DisplayName="Amount"
         Type="Currency"
         Decimals="2"
         Min="0"
         Required="FALSE"
         Group="Financial Columns" />

  <Field ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}"
         Name="CostCenter"
         DisplayName="Cost Center"
         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="Purchase Order"
               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>
  </ContentType>

</Elements>

Referencia a columnas en código

Como alternativa al uso de XML declarativo para crear un tipo de contenido, puede crear el tipo de contenido en el método FeatureActivated como una subclase de la clase SPFeatureReceiver. El código que crea el tipo de contenido puede incluir una columna de lista o sitio existentes o una columna nueva creada por el mismo código que crea el tipo de contenido, mediante una referencia a la columna con un objeto SPFieldLink. Al igual que en el XML declarativo, es posible que también desee hacer referencia a una columna heredada por el tipo de contenido para cambiar sus características en el tipo de contenido.

También existen otras situaciones en las que se puede usar código para hacer referencia a una columna de un tipo de contenido. Por ejemplo, puede actualizar un tipo de contenido existente mediante la adición o eliminación de referencias de columna. O bien puede crear una lista a partir de una definición de lista y, a continuación, modificar un tipo de contenido de la lista mediante la adición o eliminación de columnas. Independientemente de su propósito, el método de usar el modelo de objetos de SharePoint Foundation para hacer referencia a una columna es en esencia el mismo.

Para crear una referencia de columna en código

  1. Obtenga una referencia al objeto SPField que representa el campo al que desea hacer referencia.

    Puede recuperar el objeto SPField de la colección que contiene la propiedad Fields del objeto SPWeb que representa el sitio.

  2. Cree un objeto SPFieldLink para representar la referencia de columna; para ello, pase el objeto SPField al constructor SPFieldLink.

  3. Obtenga una referencia al objeto SPContentType.

    Si va a crear un nuevo tipo de contenido, puede usar el objeto devuelto por el constructor de clase SPContentType. Si va a modificar un tipo de contenido existente, puede recuperar un objeto SPContentType de la colección que contiene la propiedad ContentTypes de un objeto SPWeb o un objeto SPList.

  4. Use la propiedad FieldLinks para obtener acceso a la colección de referencias de columna del objeto SPContentType. Esta propiedad devuelve un objeto SPFieldLinkCollection.

    Nota

    El objeto SPContentType también tiene una propiedadFields que devuelve un objeto SPFieldCollection. No puede agregar columnas directamente en esta colección. Al agregar un objeto SPFieldLink a la colección FieldLinks, un objeto SPField correspondiente se agrega automáticamente a la colección Fields. Cada objeto SPField de esta colección representa una "vista combinada" de la definición de columna base y de las propiedades sobrescritas especificadas en la referencia de columna.

  5. Para agregar la referencia de columna al tipo de contenido, pase el objeto SPFieldLink al método Add del objeto SPFieldLinkCollection.

Ejemplo

En el siguiente ejemplo se muestra el método FeatureActivated de una clase derivada de la clase SPFeatureReceiver. Al activar la característica, el código del método FeatureActivated crea tres columnas de sitio y las agrega a la colección de columnas de sitio del sitio actual. A continuación, el código crea un tipo de contenido, Financial Document, y lo agrega a la colección de tipos de contenido del sitio actual. El tipo de contenido Financial Document hace referencia a dos de las nuevas columnas de sitio: DateOpened y Amount. Posteriormente, el código crea un segundo tipo de contenido, Purchase Order, que hereda de Financial Document. El tipo de contenido Purchase Order hace referencia a una columna de sitio heredada, Title, con el fin de cambiar algunas de sus propiedades en el tipo de contenido. Además, el tipo de contenido Purchase Order incluye una referencia a una de las nuevas columnas de sitio, CostCenter.

El ejemplo está escrito como si el receptor de características formara parte de una característica en el ámbito del nivel de la colección de sitios. Esto significa que la propiedad Feature devuelve un objeto SPFeature que tiene una propiedad Parent que contiene un objeto SPSite encuadrado. No debe eliminar este objeto en el método FeatureActivated. Sin embargo, cualquier objeto SPWeb que cree el código debe eliminarse correctamente, como en este ejemplo.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPSite siteCollection = (SPSite)properties.Feature.Parent;
    SPWeb site = siteCollection.RootWeb;

    /* CREATE SITE COLUMNS */

    string columnGroup = "Financial Columns";

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

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

    // Cost Center Name
    string costCenterFieldName = site.Fields.Add("Cost Center", SPFieldType.Choice, false);
    SPFieldChoice costCenterField = (SPFieldChoice)site.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 = site.AvailableContentTypes[SPBuiltInContentTypeId.Document];

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

    // Note: A content type is not initialized until after it is added.
    financialDocumentCType = site.ContentTypes[financialDocumentCType.Id];
    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 Purchase Order content type.
    SPContentType purchaseOrderCType = new SPContentType(financialDocumentCType, site.ContentTypes, "Purchase Order");
    site.ContentTypes.Add(purchaseOrderCType);
    purchaseOrderCType = site.ContentTypes[purchaseOrderCType.Id];
    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);

    // Commit changes.
    purchaseOrderCType.Update();

    site.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)
    Dim siteCollection As SPSite = DirectCast(properties.Feature.Parent, SPSite)
    Dim site As SPWeb = siteCollection.RootWeb
    
    ' CREATE SITE COLUMNS 

    Dim columnGroup As String = "Financial Columns"
    
    ' Amount
    Dim amountFieldName As String = site.Fields.Add("Amount", SPFieldType.Currency, False)
    Dim amountField As SPFieldCurrency = DirectCast(site.Fields.GetFieldByInternalName(amountFieldName), SPFieldCurrency)
    amountField.Group = columnGroup
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals
    amountField.MinimumValue = 0
    amountField.Update()
    
    ' Date Opened
    Dim dateOpenedFieldName As String = site.Fields.Add("Date Opened", SPFieldType.DateTime, False)
    Dim dateOpenedField As SPFieldDateTime = DirectCast(site.Fields.GetFieldByInternalName(dateOpenedFieldName), SPFieldDateTime)
    dateOpenedField.Group = columnGroup
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly
    dateOpenedField.DefaultValue = "[today]"
    dateOpenedField.Update()
    
    ' Cost Center Name
    Dim costCenterFieldName As String = site.Fields.Add("Cost Center", SPFieldType.Choice, False)
    Dim costCenterField As SPFieldChoice = DirectCast(site.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 = site.AvailableContentTypes(SPBuiltInContentTypeId.Document)
    
    ' Create the Financial Document content type.
    Dim financialDocumentCType As New SPContentType(documentCType, site.ContentTypes, "Financial Document")
    site.ContentTypes.Add(financialDocumentCType)
    
    ' Note: A content type is not initialized until after it is added.
    financialDocumentCType = site.ContentTypes(financialDocumentCType.Id)
    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 Purchase Order content type.
    Dim purchaseOrderCType As New SPContentType(financialDocumentCType, site.ContentTypes, "Purchase Order")
    site.ContentTypes.Add(purchaseOrderCType)
    purchaseOrderCType = site.ContentTypes(purchaseOrderCType.Id)
    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)
    
    ' Commit changes.
    purchaseOrderCType.Update()
    
    site.Dispose()
End Sub

Vea también

Tareas

Procedimiento para agregar una columna a un sitio

Referencia

Elemento FieldRef (ContentType)

Conceptos

Campos y referencias a campos

Introducción a las columnas