SharePoint - Plus loin avec les types de contenu

Stéphane Eyskens

Faisant suite au premier tutoriel sur les types de contenu, celui-ci a pour but d'expliquer certaines utilisations avancées des types de contenu.

- Titre : SharePoint - Plus loin avec les types de contenu

- Auteur : Stéphane Eyskens

- Parution : 8 novembre 2008

- Licence : Copyright ®  Developpez. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Objectif à atteindre en images

- III. Les types de contenu et les modèles standard

- IV. Création de l'animation Flash

- V. Création du type de contenu Web Item

- VI. Substitution d'un contrôle standard

- VII. Conclusion

- VIII. Téléchargement

I - Introduction

Pour une explication complète sur les types de contenu et leur utilisation au sein de SharePoint, reportez-vous au tutoriel intitulé Les types de contenu, de l'utilisation au développement.

L'objectif de ce tutoriel est d'expliquer comment il est possible d'aller encore plus loin avec les types de contenu notamment par la personnalisation de templates de base présents dans SharePoint. Le cas d'étude que nous allons démontrer est simple : il s'agit d'ajouter une banière publicitaire flash dans chaque formulaire de saisie et d'affichage d'une liste personnelle destinée à être utilisée sur internet.

Notez que vous pourriez bien sûr ajouter la bannière publicitaire à une page maître et que la création d'un type de contenu n'est bien sûr pas indispensable. Néanmoins, cet exemple met tout de même en exergue la personnalisation des formulaires standard associétés aux listes.

Pour parvenir à nos fins, nous allons créer le type de contenu WebItem que nous associerons ensuite aux listes personnelles que nous souhaitons exposer sur internet. L'avantage de passer par la création d'un type de contenu pour personnaliser les formulaires d'encodage et d'affichage réside dans le fait que les types de contenu peuvent pointer vers des modèles SharePoint spécifiques.

II - Objectif à atteindre en images

Voici l'objectif à atteindre représenté par les quelques captures d'écran ci-dessous :

Création d'un nouvel élément de type Web Item.

Formulaire d'encodage avec la bannière publicitaire.

Formulaire de visualisation d'un élément de type Web Item également avec la bannière.

III - Les types de contenu et les modèles standard

Les types de contenu standard tels que Item, Document etc... pointent vers des modèles de contrôles définis dans le fichier 12\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx. Celui-ci contient toutes les définitions des contrôles utilisés par SharePoint. Notez que bien qu'il soit possible de le modifier directement, Microsoft ne supporte pas cette manipulation.

Le type de contenu Item pointe notamment vers le modèle ListForm défini dans le fichier DefaultTemplate.ascx. Voici à quoi ressemble la déclaration de ce modèle :

<SharePoint:RenderingTemplate ID="ListForm" runat="server">
<Template>
<SPAN id='part1'>
<SharePoint:InformationBar runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&nbsp;" runat="server">
<Template_RightButtons>
<SharePoint:NextPageButton runat="server"/>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
<SharePoint:FormToolBar runat="server"/>
<TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 cellspacing=0 width=100%>
<SharePoint:ChangeContentType runat="server"/>
<SharePoint:FolderFormFields runat="server"/>
<SharePoint:ListFieldIterator runat="server"/>
<SharePoint:ApprovalStatus runat="server"/>
<SharePoint:FormComponent TemplateName="AttachmentRows" runat="server"/>
</TABLE>
<table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline"><IMG SRC="/_layouts/images/blank.gif"
width=1 height=1 alt=""></td></tr></table>
<TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px"><tr><td width=100%>
<SharePoint:ItemHiddenVersion runat="server"/>
<SharePoint:ParentInformationField runat="server"/>
<SharePoint:InitContentType runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&nbsp;" runat="server">
<Template_Buttons>
<SharePoint:CreatedModifiedInfo runat="server"/>
</Template_Buttons>
<Template_RightButtons>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
</td></tr></TABLE>
</SPAN>
<SharePoint:AttachmentUpload runat="server"/>
</Template>
</SharePoint:RenderingTemplate>

Ce modèle de rendu correspond au formulaire suivant :

où l'on retrouve bien les différents boutons, la liste de champs (ListFieldIterator), la gestion de pièces jointes etc.. A partir de là, il est possible de modifier ce modèle de rendu en le redéclarant dans un autre fichier. Cette réécriture aura pour effet d'appliquer votre modèle plutôt que celui de SharePoint. Il suffit de redéclarer ce modèle dans un fichier externe en lui attribuant le même ID que le standard. Cette modification s'appliquera alors à toutes les listes utilisant le type de contenu Item de toute votre ferme. Il s'agit donc d'une modification à impact majeur.

Si vous souhaitez restreindre le champ d'application d'une telle modification à un site ou à une collection, vous pouvez créer votre propre type de contenu et le faire pointer vers votre modèle de rendu personnel. C'est cette méthode que nous utilisons dans le cadre de ce tutoriel.

IV - Création de l'animation Flash

Etant un piètre designer, je ne vais pas vous expliquer comment vous y prendre. J'ai choisi flash par facilité mais vous auriez bien sûr pu créer un contrôle SilverLight...L'enjeu n'étant pas l'animation elle-même mais la manière de l'encapsuler dans les formulaires.

J'ai donc réalisé l'animation on ne peut plus simpliste suivante :)) :

Animation en format "flash" non supportée.
Contenu uniquement consultable en ligne à cette adresse :
https://stephaneey.developpez.com/tutoriel/sharepoint/advancedct/images/dvpbanner.swf

V - Création du type de contenu Web Item

Créez un nouveau projet Visual Studio de type SharePoint Empty ou encore Project Library. Et créez-y la structure suivante :

Seuls trois fichiers sont nécessaires, le fichier feature.xml, webitem.xml pour déclarer le type de contenu et WebItemListForm.ascx qui représente le contrôle utilisateur personnalisé.

Voici le contenu du fichier feature.xml :

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Id="9A98A891-2CEA-45a1-98F8-C485A9D462C1"
Title="Web Item"
Description="Web Item avec bannière"
Scope="Site"
Hidden="false"
>
<ElementManifests>
<ElementManifest Location="webitem.xml" />
</ElementManifests>
</Feature>

Soit une déclaration tout à fait classique de fonctionnalité.

Voici le contenu du fichier webitem.xml déclarant le type de contenu :

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<ContentType ID="0x010003CB06C7AB9346ea827FE01A11F32350"
Name="Web Item"
Description="Web Item avec bannière"
Group="Developpez.com"
Version="0">
<FieldRefs>
<FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title"/>
</FieldRefs>

<XmlDocuments>
<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
<FormTemplates  xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
<New>WebItemListForm</New>
<Edit>WebItemListForm</Edit>
<Display>WebItemListForm</Display>
</FormTemplates>
</XmlDocument>
</XmlDocuments>
</ContentType>
</Elements>

soit une déclaration classique d'un type de contenu à ceci près que l'on spécifie qu'il faut pointer vers le modèle de rendu WebItemListForm pour les formulaires de type Nouveau, Edition et Affichage.

Enfin, terminez par le modèle de rendu WebItemListForm contenu dans le fichier WebItemListForm.ascx de la solution :

<%@ Control Language="C#"   %>
<%@Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
namespace="Microsoft.SharePoint.WebControls"%>
<%@ Register TagPrefix="wssuc" TagName="ToolBar" src="/_controltemplates/ToolBar.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="ToolBarButton" src="/_controltemplates/ToolBarButton.ascx" %>
<SharePoint:RenderingTemplate ID="WebItemListForm" runat="server">
<Template>
<SPAN id='part1'>
<SharePoint:InformationBar runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&nbsp;" runat="server">
<Template_RightButtons>
<SharePoint:NextPageButton runat="server"/>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
<SharePoint:FormToolBar runat="server"/>
<TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 cellspacing=0 width=100%>
<SharePoint:ChangeContentType runat="server"/>
<SharePoint:FolderFormFields runat="server"/>
<SharePoint:ListFieldIterator runat="server"/>
<SharePoint:ApprovalStatus runat="server"/>
<SharePoint:FormComponent TemplateName="AttachmentRows" runat="server"/>
</TABLE>
<table cellpadding=0 cellspacing=0 width=100%><tr><td
class="ms-formline"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></td></tr></table>
<TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px"><tr><td width=100%>
<SharePoint:ItemHiddenVersion runat="server"/>
<SharePoint:ParentInformationField runat="server"/>
<SharePoint:InitContentType runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&nbsp;" runat="server">
<Template_Buttons>
<SharePoint:CreatedModifiedInfo runat="server"/>
</Template_Buttons>
<Template_RightButtons>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
</td></tr></TABLE>
</SPAN>
<SharePoint:AttachmentUpload runat="server"/>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
width="468" height="60" id="dvpbanner" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="/_layouts/images/webitem/dvpbanner.swf"
/><param name="quality" value="high" /><param name="bgcolor"
value="#ffffff" />    <embed src="/_layouts/images/webitem/dvpbanner.swf"
quality="high" bgcolor="#ffffff" width="468" height="60" name="dvpbanner"
align="middle" allowScriptAccess="sameDomain" allowFullScreen="false"
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</Template>
</SharePoint:RenderingTemplate>

Ce code est en réalité très similaire à la déclaration standard. La seule différence est l'ajout d'une balise HTML de type Object à la fin qui pointe vers l'animation flash qui est elle-même déployée dans le répertoire /images/webitem/ de la ferme.

Voilà! Il ne vous reste plus qu'à déployer votre solution et à la tester.

VI - Substitution d'un contrôle standard

Comme déjà mentionné précédemment, vous pouvez remplacer un contrôle standard par votre propre contrôle en déployant simplement ce contrôle dans le répertoire CONTROLTEMPLATES et en lui attribuant le même ID que l'ID du contrôle standard. Dans le cas précédent, si vous aviez nommé le contrôle WebItemListForm en ListForm, SharePoint aurait utilisé votre propre version du ListForm et l'aurait automatiquement associé par exemple à une liste personnelle utilisant le type de contenu Item. Vous n'auriez donc pas été obligé de déployer votre propre type de contenu.

En analysant le fichier DefaultTemplates.ascx, vous vous apercevrez que certains contrôles sont réutilisés un peu partout, c'est par exemple le cas de ListFieldIterator qui est utilisé pour afficher en mode édition/affichage les différents champs associés au type de contenu et/ou à la liste liée à l'élément en cours d'encoage/d'affichage.

Vous pouvez par exemple créer votre propre version de ListFieldIterator pour afficher/masquer certains types de champs en fonction de l'utilisateur connecté etc...

VII - Conclusion

Les types de contenu sont décidément incontournables dans SharePoint. Les perspectives de personnalisation abordées dans ce tutoriel laissent entrevoir d'énormes possibilités.

VIII - Téléchargement

Vous pouvez télécharger le projet ici