Share via


Procédure : référencer une colonne dans un type de contenu

Dernière modification : mercredi 10 novembre 2010

S’applique à : SharePoint Foundation 2010

Les colonnes ne sont jamais définies directement dans un type de contenu. Elles sont définies ailleurs et sont référencées dans le type de contenu. Vous référencez une colonne dans un type de contenu pour deux raisons :

  • Vous voulez ajouter une colonne au type de contenu.

  • Vous voulez modifier les caractéristiques d’une colonne que le type de contenu hérite de son type de contenu parent.

    Pour plus d’informations sur l’héritage, voir la description de l’attribut Inherits de l’élément ContentType dans le schéma de définition du type de contenu.

Dans les déclarations XML, vous référencez une colonne à l’aide de l’élément FieldRef. Dans le code, vous procédez de même en créant un objet SPFieldLink.

Notes

Dans Microsoft SharePoint Foundation, les champs sont des colonnes sous un autre nom. Souvent, le mot « colonne » est utilisé lorsqu’il s’agit de dire comment un champ est représenté par l’interface utilisateur.

Pour plus d’informations sur les différences entre les colonnes et les références aux colonnes, voir Références d'un ou plusieurs champs.

Référence aux colonnes à l’aide de déclarations XML

L’une des façons de créer un type de contenu consiste à utiliser les déclarations XML pour définir le type de contenu dans le fichier manifeste de l’élément pour une fonctionnalité. Quand la fonctionnalité est activée, le type de contenu est créé. Pour plus d’informations, voir Définitions de type de contenu.

La définition de votre type de contenu peut inclure une colonne en la référençant dans un élément FieldRef. La colonne référencée peut être une colonne qui existe déjà comme colonne de site ou une nouvelle colonne créée par la même fonctionnalité que celle qui crée le type de contenu. Vous pouvez aussi utiliser l’élément FieldRef pour référencer une colonne dont le type de contenu hérite de son type de contenu parent. Dans ce cas, la raison de référencer la colonne n’est pas d’ajouter la colonne, mais de modifier certaines de ses caractéristiques lorsqu’elle est utilisée dans le type de contenu.

Pour créer une référence de colonne à l’aide d’une déclaration XML

  1. Dans la définition du type de contenu, ajoutez un élément FieldRef dans le nœud FieldRefs.

  2. Référencez la colonne en définissant la valeur de l’attribut ID de l’élément FieldRef avec l’ID de colonne.

    La valeur doit être la représentation de chaîne d’un GUID entre accolades comme dans l’exemple suivant :

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

    Comme l’attribut ID respecte la casse, assurez-vous d’affecter à l’attribut la même valeur qu’à l’attribut ID de l’élément Field.

    Vous pouvez trouver les ID des colonnes intégrées dans le fichier fieldswss.xml, qui se situe sur le chemin suivant : %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.

  3. Définissez la valeur de l’attribut Name de l’élément FieldRef avec la même valeur que celle de l’attribut Name de l’élément Field qui représente la colonne.

  4. Pour définir la colonne telle que vous la souhaitez, définissez les autres attributs de l’élément FieldRef.

    Par exemple, pour modifier le texte affiché pour la colonne, définissez la valeur de l’attribut DisplayName.

De nombreux attributs de l’élément FieldRef ont le même nom et le même objectif que les attributs de l’élément Field référencé. Seule les valeurs des attributs ID et Name doivent être identiques. Pour les autres attributs, l’utilisation d’une valeur différente de l’élément FieldRef peut modifier les caractéristiques de la colonne quand elle est utilisée dans le type de contenu sans modification de la colonne référencée elle-même.

Important

Les attributs ID, Name, DisplayName et Required de l’élément FieldRef sont toujours obligatoires, même si l’élément FieldRef référence un champ défini dans le même manifeste d’élément.

Exemple

L’exemple suivant montre le manifeste de l’élément pour une fonctionnalité qui crée trois colonnes de site et deux types de contenu de site. Le premier type de contenu, Financial Document, est un enfant du type de contenu Document intégré.

La définition de Financial Document référence deux des nouvelles colonnes de site, DateOpened et Amount. L’élément FieldRef qui référence la colonne DateOpened définit l’attribut DisplayName de telle sorte que le nom de colonne s’affiche sous l’intitulé « Date » plutôt que « Date Opened » comme défini dans la colonne de site.

La définition de Purchase Order référence la troisième colonne, CostCenter, et définit l’attribut DisplayName de telle sorte que le nom de la colonne s’affiche sous l’intitulé « Department » plutôt que « Cost Center » comme défini dans la colonne de site.

Purchase Order hérite les références de colonne de son parent, Financial Document, de telle sorte qu’il est inutile de les référencer à nouveau. Le type de contenu hérite aussi de Financial Document une référence à la colonne Title, Financial Document héritant la colonne de son parent, Document. Le type Purchase Order inclut un élément FieldRef pour la colonne Title afin de remplacer l’attribut DisplayName hérité par une de ses propres valeurs.

<?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>

Référence des colonnes dans le code

Comme alternative à l’utilisation des déclarations XML pour créer un type de contenu, vous pouvez créer le type de contenu dans la méthode FeatureActivated d’une sous-classe de la classe SPFeatureReceiver. Le code qui crée le type de contenu peut inclure un site ou une colonne de liste existant, ou une nouvelle colonne créée par le même code que celui qui crée le type de contenu, en référençant la colonne avec un objet SPFieldLink. Comme tel est le cas dans les déclarations XML, il se peut aussi que vous souhaitiez référencer une colonne héritée par votre type de contenu afin de modifier ses caractéristiques dans le type de contenu.

Il existe aussi d’autres situations dans lesquelles vous pourriez utiliser le code pour référencer une colonne d’un type de contenu. Par exemple, vous pouvez vouloir mettre à niveau un type de contenu existant en ajoutant ou en supprimant les références de colonne. Ou vous pouvez souhaiter créer une liste à partir d’une définition de liste, puis modifier un type de contenu de la liste en ajoutant ou en supprimant des colonnes. Quel que soit votre objectif, l’approche consistant à utiliser le modèle objet SharePoint Foundation pour référencer une colonne est, pour l’essentiel, la même.

Pour créer une référence de colonne dans le code

  1. Obtenez une référence à l’objet SPField qui représente le champ que vous voulez référencer.

    Vous pouvez extraire l’objet SPField de la collection contenue dans la propriété Fields de l’objet SPWeb qui représente le site.

  2. Créez un objet SPFieldLink pour représenter la référence de colonne en passant l’objet SPField au constructeur SPFieldLink.

  3. Obtenez une référence à un objet SPContentType.

    Si vous créez un nouveau type de contenu, vous pouvez utiliser l’objet qui est renvoyé par le constructeur de la classe SPContentType. Si vous modifiez un type de contenu existant, vous pouvez extraire un objet SPContentType de la collection qui est détenue par la propriété ContentTypes d’un objet SPWeb ou d’un objet SPList.

  4. Utilisez la propriété FieldLinks pour accéder à la collection de références de colonne de l’objet SPContentType. Cette propriété renvoie un objet SPFieldLinkCollection.

    Notes

    L’objet SPContentType possède aussi une propriété Fields qui renvoie un objet SPFieldCollection. Vous ne pouvez pas ajouter directement les colonnes à cette collection. Quand vous ajoutez un objet SPFieldLink à la collection FieldLinks, un objet correspondant SPField est automatiquement ajouté à la collection Fields. Chaque objet SPField de la collection représente une « vue fusionnée » de la définition de la colonne de base et des propriétés substituées qui sont spécifiées dans la référence de colonne.

  5. Ajoutez la référence de colonne au type de contenu en passant l’objet SPFieldLink à la méthode Add de l’objet SPFieldLinkCollection.

Exemple

L’exemple suivant illustre la méthode FeatureActivated d’une classe dérivée de la classe SPFeatureReceiver. Quand la fonctionnalité est activée, le code de la méthode FeatureActivated crée trois colonnes de site et les ajoute à la collection de colonnes de site du site courant. Puis, le code crée un type de contenu, Financial Document, et l’ajoute à la collection de types de contenu du site courant. Le type de contenu Financial Document référence deux des nouvelles colonnes de site, DateOpened et Amount. Ensuite, le code crée un deuxième type de contenu, Purchase Order, qui hérite de Financial Document. Le type de contenu Purchase Order référence une colonne de site héritée, Title, afin de modifier certaines de ses propriétés dans le type de contenu. En outre, le type de contenu Purchase Order inclut la référence à l’une des nouvelles colonnes de site, CostCenter.

L’exemple est écrit comme si le récepteur de fonctionnalités faisait partie d’une fonctionnalité ayant comme étendue le niveau de la collection de sites. Cela signifie que la propriété Feature renvoie un objet SPFeature ayant une propriété Parent qui contient un objet SPSite en mode bac à sable. Ne supprimez pas cet objet dans votre méthode FeatureActivated. Cependant, tout objet SPWeb que crée votre code doit être correctement supprimé, comme dans cet exemple.

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

Voir aussi

Tâches

Procédure : ajouter une colonne à un site

Référence

FieldRef, élément (ContentType)

Concepts

Références d'un ou plusieurs champs

Présentation des colonnes