Nous allons voir aujourd'hui comment créer un type de contenu héritant de Page et intégrant des champs personnalisés de type Link et Image, ainsi que son modèle de page associé. Commençons par créer le fichier de définition du type de contenu.
CustomPage.xml :
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<ContentType
ID="0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF39005AB43615533C4e09BF40969BDF9856AE"
Name="CustomPage"
Group="Types de contenu personnalisés"
Description="Définit un type de contenu d'une page de publication personnalisée."
Version="1">
<FieldRefs>
<FieldRef ID="{87F3E3CF-0861-4629-8386-7E87034A7A12}" Name="CustomPageLogo" />
<FieldRef ID="{8558B229-B874-4c84-BE54-4AD6FA82B186}" Name="CustomPageContact" />
</FieldRefs>
</ContentType>
</Elements>
L'identifiant de notre type de contenu est constitué de l'identifiant du type de contenu Page suivi d'un séparateur "00" et d'un nouveau GUID. Cette mécanique permet de définir que CustomPage hérite de Page. Pour ceux qui ne sont pas familiarisés avec les ID des types de contenu, je conseille la lecture de cet article MSDN. Dans la partie FieldRefs, nous renseignons les références aux champs personnalisés que nous allons définir dans un deuxième fichier.
CustomPage.Fields.xml :
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Field
ID="{87F3E3CF-0861-4629-8386-7E87034A7A12}"
Type="Image"
Name="CustomPageLogo"
DisplayName="Logo de la page personnalisée"
StaticName="CustomPageLogo"
Group="Custom"
RichText="True"
RichTextMode="FullHtml">
</Field>
<Field
ID="{8558B229-B874-4c84-BE54-4AD6FA82B186}"
Type="Link"
Name="CustomPageContact"
DisplayName="Contact de la page personnalisée"
StaticName="CustomPageContact"
Group="Custom"
RichText="True"
RichTextMode="FullHtml">
</Field>
</Elements>
Pour les champs de type Link et Image, il nous faut préciser les propriétés RichText et RichTextMode respectivement à "True" et "FullHtml". Ces propriétés permettent en effet de déterminer l'affichage des champs de contenu dans les modèles de page comme nous le verrons plus loin. Nous déployons à présent ces deux fichiers grâce à une feature SharePoint.
Feature.xml :
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Id="FF8936BA-2BFB-48b3-B0B2-99E2F4E2E51B"
Title="Publishing Custom Page Content Type"
Description="Defines a simple custom publishing page content type"
Hidden="FALSE"
Scope="Site"
Version="1.0.0.0">
<ElementManifests>
<ElementManifest Location="CustomPage.Fields.xml" />
<ElementManifest Location="CustomPage.xml" />
</ElementManifests>
<ActivationDependencies>
<!-- Publishing Feature -->
<ActivationDependency FeatureId="AEBC918D-B20F-4a11-A1DB-9ED84D79C87E" />
</ActivationDependencies>
</Feature>
Après le déploiement et l'activation de notre feature sur un site de publication, nous retrouvons bien notre type de contenu avec les colonnes personnalisées dans les pages de paramètres du site.


Pour pouvoir créer une page de type CustomPage, il nous faut à présent créer un modèle de page pour ce type de contenu. Grâce à SharePoint Designer, nous insérons nos deux champs de contenu dans un nouveau modèle de page.
CustomPageLayout.aspx
<%@ Page="" language="C#" Inherits="Microsoft.SharePoint.Publishing.PublishingLayoutPage,Microsoft.SharePoint.Publishing,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" meta:progid="SharePoint.WebPartPage.Document" %>
<%@ Register="" Tagprefix="SharePointWebControls" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register="" Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register="" Tagprefix="PublishingWebControls" Namespace="Microsoft.SharePoint.Publishing.WebControls" Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register="" Tagprefix="PublishingNavigation" Namespace="Microsoft.SharePoint.Publishing.Navigation" Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<asp:Content ContentPlaceholderID="PlaceHolderPageTitle" runat="server">
<SharePointWebControls:FieldValue id="PageTitle" FieldName="Title" runat="server"/>
</asp:Content>
<asp:Content ContentPlaceholderID="PlaceHolderMain" runat="server">
<PublishingWebControls:RichLinkField FieldName="CustomPageContact" runat="server" />
<PublishingWebControls:RichImageField FieldName="CustomPageLogo" runat="server" />
</asp:Content>
Voilà, nous pouvons alors créer une nouvelle page se basant sur le modèle de page CustomPageLayout. En mode édition, tout est comme nous l'attendions, et nous pouvons éditer le contenu de nos champs de type Link et Image.
Mais lorsque nous publions la page, on remarque alors que les champs sont rendus sous forme de texte simple, et pas comme du code HTML... In fine, le rendu est comme si nous n'avions pas précisé les deux propriétés RichText et RichTextMode dont je vous parlais plus haut.
Là se trouve la subtilité des champs de type Link et Image. En effet, si la propriété RichText n'est pas prise en compte, c'est parce que la valeur de cette propriété est sensible à la casse (sic !). Il s'agit alors de remplacer dans le fichier CustomPage.Field.xml de définition des champs les lignes :
par
En redéployant notre type de contenu, le rendu de la page est tel que nous le souhaitions !

Adrien
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :