Partager via


Création de types de contenu

Dernière modification : lundi 1 novembre 2010

S’applique à : SharePoint Foundation 2010

Dans cet article
Héritage du type de contenu
Conception des types de contenu
Création d’un type de contenu avec du XML déclaratif
Création d’un type de contenu avec du code

Disponible dans SharePoint Online

En tant que développeur, vous créez un type de contenu en écrivant du XML déclaratif, voire du code serveur. En règle générale, vous effectuez cela dans le cadre de la création d’une fonctionnalité qu’une deuxième personne installe et qu’une troisième active. Par conséquent, ce que vous effectuez réellement du point de vue du type de contenu n’est pas sa création, mais sa définition.

Au final, la fonctionnalité est installée et quelqu’un l’active. Microsoft SharePoint Foundation exécute votre code ou lit votre XML déclaratif et rend le type de contenu disponible. Un administrateur autorisé à gérer les listes applique le nouveau type de contenu à une liste ou à une bibliothèque de documents, ce qui permet de l’activer. Tout utilisateur autorisé à ajouter des éléments à la liste peut recourir à votre type de contenu pour créer du contenu. Les administrateurs peuvent modifier le type de contenu en fonction de leurs besoins, en ajoutant ou supprimant des colonnes, ou en modifiant d’autres attributs. Toutes ces opérations sont réalisées hors de votre portée.

Par « création » d’un type de contenu, il est donc essentiel de comprendre « création d’une définition de type de contenu ». Une bonne définition de type de contenu permet d’anticiper la façon dont le type de contenu est finalement utilisé.

Héritage du type de contenu

Vous ne créez jamais un type de contenu de toutes pièces. À la place, vous sélectionnez toujours un type de contenu existant comme base de tout type de contenu que vous créez. C’est exactement ce que Microsoft SharePoint Foundation fait pour ses types de contenu intégrés. Pour plus d’informations sur la hiérarchie des types de contenu fournis avec SharePoint Foundation, voir Hiérarchie des types de contenu de base.

Le site Web sur lequel un type de contenu est créé doit appartenir à l’étendue du type de contenu dont il est dérivé ; vous devez en tenir compte lors de l’écriture de votre définition de type de contenu. Pour plus d’informations, voir Étendue du type de contenu.

SharePoint Foundation prend en charge une forme limitée d’héritage de type de contenu. Lorsque la fonctionnalité qui définit un nouveau type de contenu est activée, les colonnes et les autres métadonnées définies pour le type de contenu parent sont transmises au type de contenu enfant. C’est la seule partie automatique de l’héritage.

Notes

Dans les versions antérieures de SharePoint Foundation, les colonnes et les métadonnées qui étaient ajoutées à un type de contenu après sa mise en service n’étaient pas héritées par les types de contenu enfants. Dans SharePoint Foundation 2010, ce comportement a changé. À présent, vous pouvez inclure les colonnes et les métadonnées que les utilisateurs ont ajoutées au parent. Pour plus d’informations, voir la description de l’attribut Inherits de l’élément ContentType.

Une fois qu’un contenu est rendu disponible et qu’il est utilisé, vous-même, ou quelqu’un d’autre, pouvez modifier la définition du type de contenu parent, mais cette modification n’est pas automatiquement répercutée sur les types de contenu dérivés. Cet aspect de l’héritage doit être initié manuellement, par le biais de l’interface utilisateur ou d’un code personnalisé. Pour plus d’informations, voir Mise à jour de types de contenu enfants.

Toutefois, l’héritage de type de contenu vous permet d’utiliser les types de contenu avec la même latitude que les classes dérivées. Par exemple, de même que vous pouvez substituer des propriétés d’une classe de base, vous pouvez modifier les attributs que votre type de contenu dérive de son type de contenu parent. Vous pouvez ajouter, modifier ou supprimer des colonnes, spécifier des formulaires Nouveau, Modifier ou Affichage différents, spécifier un modèle de document différent, etc. Cela signifie que vous pouvez créer des types de contenu de base aussi facilement que vous créez des classes de base lors du développement d’une infrastructure d’application. Par exemple, vous pouvez définir un type de contenu nommé Document financier dont les caractéristiques sont partagées par tous les documents financiers dans votre organisation. Vous pouvez ensuite utiliser Document financier comme base pour les nouveaux types de contenu, tels que Facture et Commande achat. Étant donné que les nouveaux types de contenu héritent des colonnes et des autres métadonnées de Document financier, vous ne devez définir les éléments communs qu’une seule fois, pour le type de contenu parent.

Pour construire votre propre hiérarchie de types de contenu, vous pouvez trouver des idées en étudiant la façon dont SharePoint Foundation utilise les attributs hérités des types de contenu de base et dont il les modifie. Un bon point de départ est la galerie de types de contenu dans l’interface utilisateur. Dans le menu Actions du site, sélectionnez Paramètres du site. Dans la page Paramètres du site, sous Galeries, cliquez sur Types de contenu de site. Dans la page Types de contenu de site, cliquez sur le lien d’un type de contenu digne d’intérêt.

Une autre ressource intéressante à étudier est le fichier ctypewss.xml situé dans le dossier %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\ctype. Ce fichier contient les définitions de nombreux types de contenu intégrés. Pour comprendre les définitions, voir Définitions de type de contenu.

Conception des types de contenu

Pour un guide complet sur la planification des types de contenu, voir Planifier les types de contenu et les flux de travail (SharePoint Server 2010). Voici quelques considérations générales :

  • Étendue. Où dans la hiérarchie des sites souhaitez-vous que le type de contenu soit disponible ?

    Si le type de contenu doit être disponible dans la totalité de la collection de sites, vous devez le déployer dans une fonctionnalité avec l’étendue collection de sites et écrire dans la méthode FeatureActivated d’une classe de récepteur de fonctionnalités du code qui ajoute le type de contenu à la collection de types de contenu du site Web racine.

  • Parent. Quel est le type de contenu appartenant à l’étendue dont vous dériverez votre type de contenu ?

    Votre type de contenu ne s’activera pas correctement si le type de contenu parent n’est pas disponible dans le site Web où votre type de contenu est créé.

  • Colonnes. Quelles sont les colonnes de site existantes que vous pouvez utiliser ?

    Les colonnes qui ne sont pas héritées du type de contenu parent doivent être ajoutées. Les colonnes qui n’existent pas doivent être créées.

  • Autres ressources. Le type de contenu aura-t-il besoin de ressources linguistiques, de modèles de document, de formulaires ?

    Si le type de contenu requiert des ressources telles que celles mentionnées, vous devez savoir de quelle manière elles seront mises en service et comment il y accèdera.

Création d’un type de contenu avec du XML déclaratif

Une façon de créer un type de contenu consiste à utiliser du XML déclaratif pour définir le type de contenu dans le fichier manifeste d’élément pour un Composant fonctionnel. Lorsque le Composant fonctionnel est activé, le type de contenu est créé. Pour plus d’informations, voir Définitions de type de contenu et Utilisation des fonctionnalités.

Vous pouvez définir plusieurs types de contenu dans le même fichier manifeste d’élément. Incluez un élément ContentType pour chaque type de contenu que vous définissez. L’attribut ID est obligatoire et la valeur que vous spécifiez doit respecter un format très spécifique. Un ID de type de contenu correctement mis en forme identifie non seulement le nouveau type de contenu, mais également son type de contenu parent. Pour plus d’informations, voir ID de type de contenu.

Pour créer un ID pour un type de contenu dérivé d’un type de contenu intégré, ajoutez deux zéros à la fin de la chaîne hexadécimale qui identifie le type de contenu intégré, puis ajoutez un GUID en supprimant tous les signes de ponctuation. Par exemple, la chaîne hexadécimale qui identifie le type de contenu Élément est « 0x01 ». L’ID d’un type de contenu qui dérive du type de contenu Élément doit ressembler à ceci :

0x0100A33D9AD9805788419BDAAC2CCB37509F

Pour créer des ID pour des types de contenu supplémentaires qui héritent de votre type de contenu, ajoutez « 01 », « 02 », et ainsi de suite.

Un autre attribut obligatoire de l’élément ContentType est l’attribut Name, qui spécifie un nom d’affichage. La valeur peut être une référence à une ressource au format $Resources:String. Pour plus d’informations, voir Localisation de solutions SharePoint. Le nom lui-même ne peut pas comporter plus de 128 caractères, ni contenir les caractères \ / : * ? " # % < > { } | ~ &, deux points consécutifs (..) ou des caractères spéciaux tels qu’une marque de tabulation.

Lorsque vous incluez des colonnes dans un type de contenu, vous ne les créez pas dans la définition de type de contenu. À la place, vous référencez des colonnes qui ont été créées ailleurs. Pour inclure une référence de colonne, ajoutez un élément FieldRef en guise d’enfant de l’élément ContentType. La colonne référencée peut être une colonne qui existe déjà en tant que colonne de site ou une colonne créée par le Composant fonctionnel qui crée le type de contenu. Pour plus d’informations sur la création de colonnes de site, voir Définitions de champ.

Vous pouvez également utiliser l’élément FieldRef pour référencer une colonne que le type de contenu hérite de son type de contenu parent. Dans ce cas, vous ne référencez pas la colonne pour l’ajouter, mais pour modifier certaines de ses caractéristiques lorsqu’elle est utilisée dans le type de contenu.

L’attribut ID de l’élément FieldRef identifie la colonne que vous référencez. La valeur doit être la représentation de chaîne d’un GUID, accolades comprises. La valeur respecte la casse.

ConseilConseil

Les ID des champs prédéfinis se trouvent dans le fichier fieldswss.xml situé dans le dossier suivant : %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.

Si votre type de contenu utilise un modèle de document pour le nouveau contenu, vous pouvez l’identifier dans un élément DocumentTemplate au sein de l'élément ContentType. Vous devez mettre en service le fichier séparément. Pour ce faire, vous pouvez ajouter un élément Module au manifeste et inclure le fichier avec le Composant fonctionnel. Pour plus d’informations, voir Procédure : mettre en service un fichier.

La définition de type de contenu peut également inclure des définitions pour des formulaires personnalisés, via un élément XMLDocuments. Pour plus d’informations, voir Informations personnalisées dans des types de contenu.

Exemple

L’exemple suivant montre le manifeste d’élément pour un Composant fonctionnel qui crée quatre colonnes de site et trois types de contenu de site. Le premier type de contenu, Financial Document, est un enfant du type de contenu Document intégré. Les deux autres nouveaux types de contenu, Invoice et Purchase Order, dérivent de Financial Document.

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 la mention « Date » plutôt que sous la mention « Date Opened » comme défini dans la colonne de site.

Le type de contenu Invoice est le premier des deux nouveaux types de contenu qui dérivent de Financial Document. La définition du type de contenu référence une troisième nouvelle colonne de site, Client, et définit l’attribut Required sur TRUE afin qu’une entrée soit obligatoire pour ce champ lorsqu’un élément est créé. Le type Invoice comprend un élément FieldRef pour la colonne Title, même s’il est hérité, afin de remplacer la valeur « Title » de l’attribut DisplayName par « Service ».

Le second type de contenu qui dérive de Financial Document est Purchase Order. La définition du type de contenu référence une quatrième nouvelle colonne de site, CostCenter, et définit l’attribut DisplayName de telle sorte que le nom de colonne s’affiche sous la mention « Department » plutôt que sous la mention « Cost Center » comme défini dans la colonne de site.

Purchase Order hérite des références de colonne de son parent, Financial Document ; par conséquent, vous n’avez pas à les référencer de nouveau. Le type de contenu hérite également d’une référence à la colonne Title de Financial Document, qui hérite de la colonne de son parent, Document. Le type Purchase Order comprend un élément FieldRef pour la colonne Title afin que l’attribut DisplayName hérité soit remplacé par une valeur qui lui est propre.

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

Création d’un type de contenu avec du code

Si vous ne souhaitez pas créer un type de contenu avec du XML déclaratif, vous pouvez utiliser le modèle objet SharePoint Foundation. En règle générale, il est plus facile d’écrire du XML déclaratif. Toutefois, le XML déclaratif offre généralement moins de souplesse que le modèle objet, qui a accès à toutes les fonctionnalités de Microsoft .NET Framework et qui peut être débogué au moment de l’exécution. Les deux approches sont prises en charge par les modèles fournis avec les Outils de développement SharePoint dans Microsoft Visual Studio 2010.

Placez le code qui définit votre type de contenu dans la méthode FeatureActivated d’une sous-classe de la classe SPFeatureReceiver.

Vous créez un type de contenu en appelant le constructeur pour la classe SPContentType. Avant d’appeler le constructeur, vous devez rassembler trois éléments à transmettre comme arguments :

  • Un objet SPContentType qui représente le type de contenu parent.

    Vous pouvez récupérer cet objet de la collection retournée dans la propriété AvailableContentTypes de l’objet SPWeb qui représente le site Web où vous créez votre type de contenu.

  • Un objet SPContentTypeCollection qui représente la collection pour le site Web où vous créez le type de contenu.

    Vous pouvez obtenir cet objet en accédant à la propriété ContentTypes de l’objet SPWeb qui représente le site Web où vous créez le type de contenu.

  • Une chaîne qui contient le nom que vous souhaitez attribuer au type de contenu.

    Le nom que vous fournissez est utilisé comme nom d’affichage du type de contenu. Certains caractères ne sont pas autorisés dans les noms de type de contenu. Vous pouvez valider le nom que vous proposez en appelant la méthode statique ValidateName(String). Cette méthode vérifie si le nom contient des caractères non autorisés, mais pas s’il s’agit d’un doublon.

Après avoir appelé le constructeur pour créer un objet SPContentType, vous devez ajouter celui-ci à la collection de types de contenu du site Web par le biais d’un appel distinct à la méthode Add(SPContentType) de l’objet SPContentTypeCollection qui représente la collection du site Web. Cette étape marque la fin de l’initialisation du type de contenu.

Note AttentionAttention

La méthode Add(SPContentType) déclenche une exception SPException si un type de contenu portant le même nom existe déjà dans la collection.

Si vous envisagez de définir les propriétés du type de contenu, vous devez enregistrer l’objet SPContentType retourné par la méthode Add.

Vous pouvez ajouter des colonnes au type de contenu en référençant chaque colonne dans un objet SPFieldLink. Ensuite, appelez la méthode Add(SPFieldLink) de l’objet SPFieldLinkCollection retourné par la propriété FieldLinks du type de contenu.

Lorsque vous avez terminé la configuration du type de contenu, appelez la méthode Update() pour valider les modifications dans la base de données.

Exemple

L’exemple suivant crée exactement les mêmes colonnes de site et types de contenu que ceux créés par l’exemple précédent. La seule différence est qu’au lieu d’utiliser du XML déclaratif, cet exemple utilise du code dans la méthode FeatureActivated d’un récepteur de fonctionnalités.

Le paramètre properties de la méthode FeatureActivated est un objet SPFeatureReceiverProperties. La propriété Feature de cet objet retourne un objet SPFeature dont la propriété Parent contient un objet SPSite ou SPWeb faisant l’objet d’un boxing. Vous devez conserver ces objets. Toutefois, vous devez vous débarrasser de tout nouvel objet SPWeb ou SPSite créé par votre code. Pour plus d’informations, voir Suppression d’objets.

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

Voir aussi

Tâches

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

Procédure : ajouter un type de contenu à un site

Procédure : ajouter un type de contenu à une liste

Concepts

Types de contenu de liste et de site

Étendue du type de contenu

Définitions de type de contenu

Autres ressources

Planifier les types de contenu et les flux de travail (SharePoint Server 2010)

Créer des types de contenu personnalisés dans SharePoint 2010

Procédure pas à pas : création d’un champ personnalisé, d’un type de contenu, d’une définition de liste et d’une instance de liste

Procédure : créer des types de contenu par programme (éventuellement en anglais)