21
ListFieldIterator par Sébastien Sougnez (Home page) (Blog) Date de publication : 4 août 2009 Dernière mise à jour : Dans ce cours, nous allons aborder une notion assez méconnue de SharePoint qui s'avère pourtant très utile dans certaines cas de figure. Nous allons voir comment intervenir sur la façon dont les champs sont affichés dans la page DispForm.aspx d'une liste. Pour ce faire, nous allons créer une propre définition de liste pour laquelle nous allons associer notre propre ListFieldIterator. Nous allons donc détailler cela étape par étape pour être sûr de ne rien louper.

ListFieldIterator - WordPress.com€¦ · type de projet "List Definition" de Visual Studio 2008 et ensuite, nous allons récupérer les fichiers générés pour en faire une feature

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

ListFieldIterator

par Sébastien Sougnez (Home page) (Blog)

Date de publication : 4 août 2009

Dernière mise à jour :

Dans ce cours, nous allons aborder une notion assez méconnue de SharePoint qui s'avèrepourtant très utile dans certaines cas de figure. Nous allons voir comment intervenir sur lafaçon dont les champs sont affichés dans la page DispForm.aspx d'une liste. Pour ce faire,nous allons créer une propre définition de liste pour laquelle nous allons associer notrepropre ListFieldIterator. Nous allons donc détailler cela étape par étape pour être sûr dene rien louper.

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 2 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

I - Création de la définition de liste.............................................................................................................................3II - Implémentation du ListFieldIterator......................................................................................................................14

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 3 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

I - Création de la définition de liste

Dans cette partie, nous allons créer une définition de liste à ma manière. Pour cela, nous allons en créer une via letype de projet "List Definition" de Visual Studio 2008 et ensuite, nous allons récupérer les fichiers générés pour enfaire une feature. Ouvrez donc Visual Studio 2008 et créez un nouveau projet. Dans le volet de droite de la fenêtrede création, choisissez SharePoint et dans la fenêtre de gauche, choisissez List Definition.

Une fois que vous avez validé, cette fenêtre devrait apparaître :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 4 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Ici, Visual Studio vous demande sur quel type de liste se basera votre custom list. Ici, nous allons choisir Custom List.La première case à cocher permet de créer une liste de ce type à l'activation de votre feature. La deuxième optionpermet d'attacher un event handler à votre liste pour que des instructions C# s'exécutent à l'ajout, modification,...d'éléments dans la liste. Nous ne cocherons aucune de ces deux cases. Créez donc la liste. Visual Studio devraitvous avoir créé une arborescence de dossier de ce type :

Nous n'allons pas expliquer cette architecture directement car ce n'est pas celle là que nous utiliserons pourdévelopper notre liste. C'est juste une manière de se simplifier la vie (en tout cas, c'est ainsi que je procède). Nousallons maintenant compiler et déployer cette solution. Cela aura pour effet d'installer votre feature dans le dossier 12de SharePoint. Visual Studio créera donc ainsi l'architecture adéquate à SharePoint. Ensuite il suffira de repartir dece dossier pour utiliser WSP Builder. Allez donc dans Project > Properties et cliquez sur l'onglet Debug. Dans cettefenêtre se trouve une zone de texte contenant normalement le texte "http://localhost" (cela peut être différent chezvous). C'est l'adresse du site sur lequel le template Visual Studio va déployer la liste. Modifiez donc cette adressepar l'adresse de votre site et sauvegardez vos modifications. Allez ensuite dans Build > Deploy Solution. Si tout sepasse bien, votre liste devrait être déployée.

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 5 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Ouvrez maintenant le dossier 12\TEMPLATE\FEATURES de SharePoint et cherchez après votre feature. Si vousn'avez rien changé dans votre solution, celle-ci devrait s'appeler ListDefinition1 :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 6 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Si vous regardez dans ce dossier, vous remarquerez la présence du fichier feature.xml et d'un dossier ListDefinition1.Explorez un peu l'architecture de ce dossier, c'est cette architecture qu'il va falloir reproduire pour WSP Builder.Copiez/collez le dossier ListDefinition1 (celui qui se trouve dans le dossier FEATURES) sur votre bureau et fermezVisual Studio. Ouvrez maintenant votre centrale d'administration SharePoint, allez dans Operations > Solutionmanagement. Cet écran vous présente alors toute les features que vous avez installées en plus de celles deSharePoint. Nous avons appelé notre liste LFIList :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 7 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Comme vous le voyez, cette feature apparait bien dans la liste. Cliquez dessus pour voir l'écran suivant apparaître :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 8 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Cliquez alors sur Retract Solution pour amorcer la désinstallation de la liste. La page qui apparaît va vous demanderquand la rétractation doit avoir lieu. Laissez Now cliqué et cliquez sur OK. Le statut de votre feature devrait alorsressembler à "Retracting(scheduled at 29/7/2009 2:52 PM" mais avec une autre heure. Cliquez de temps à autre surF5 pour voir quand l'opération est terminée. Une fois que le statut passe en Not deployed, cliquez à nouveau sur lafeature et cliquez sur Remove Solution. Confirmez la boîte de dialogue qui apparaît et qui vous demande confirmationde la suppression. Votre liste est maintenant supprimée de SharePoint.Passons maintenant à la création de la liste avec WSP Builder. Créez un nouveau projet WSP Builder Project quevous nommerez LFIList :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 9 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Une fois votre projet créé, vous aurez l'architecture habituelle. Vous aurez le dossier 12 ne contenant rien. Nous allonsmaintenant recréer l'architecture d'un dossier contenant une custom List. Pour cela, dans l'arborescence de votreprojet, cliquez avec le bouton droit sur le dossier 12 et faites Add > New Folder. Nommez ce dossier TEMPLATE.Créez ensuite un dossier dans le dossier TEMPLATE et nommez le FEATURES. Enfin, créez le dossier LFIListdans le dossier FEATURES. Ouvrez maintenant le dossier ListDefinition1 qui se trouve sur votre bureau. Commevous le voyez, celui-ci contient un dossier nommé ListDefinition1 et un fichier feature.xml. Retournez dans VisualStudio, cliquez avec le bouton droit sur le dossier LFIList et cliquez sur Add > Existing Item et allez chercher le

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 10 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

fichier feature.xml du dossier ListDefinition1 de votre bureau. Créez ensuite un dossier dans le dossier LFIList quevous appellerez également LFIList. Ce dossier correspondra au dossier ListDefinition1 contenu dans le dossierListDefinition1 de votre bureau (Je sais, c'est difficile à suivre, mais bon :p). Les noms doivent être les mêmes, c'estimportant. Ouvrez maintenant le dossier ListDefinition1 du dossier ListDefinition1 de votre bureau. Celui-ci devraitcontenir ceci :

Nous allons devoir ajouter également ces fichiers dans notre dossier dans Visual Studio. Cliquez donc avec le boutondroit sur le dossier LFIList contenu dans le premier dossier LFIList et cliquez sur Add > Existing Item. Allez ensuitechercher les 6 fichiers du dossier ListDefinition1. Si vous ne voyez pas les fichiers dans l'explorateur, il faut modifier letype de fichier recherché en bas à droite de votre fenêtre. Si vous avez bien suivi nos instructions, votre architecturedevrait être la suivante :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 11 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Bien entendu, l'architecture d'un dossier SharePoint étant très stricte, le déploiement de cette feature dans l'étatactuel ne peut qu'échouer. Effectivement, si vous essayez, vous obtiendrez le message d'erreur suivant :Inner exception(1): Error: Cannot find this file specified in the manifest file: LFIList\List\ListDefinition1\ListDefinition.xmlCommencez tout d'abord en ouvrant le fichier feature.xml. Ce fichier contient ce morceau de code :

<ElementManifest Location="ListDefinition1\ListDefinition.xml" /><ElementFile Location="ListDefinition1\schema.xml" /><ElementFile Location="ListDefinition1\AllItems.aspx" /><ElementFile Location="ListDefinition1\DispForm.aspx" /><ElementFile Location="ListDefinition1\EditForm.aspx" /><ElementFile Location="ListDefinition1\NewForm.aspx" />

Vous remarquerez vite le problème de ce fichier. Comme nous l'avons déjà expliqué, l'élément ElementManifest sert àindiquer où se trouve le fichier décrivant le comportement de la feature. Ici, il fait référence au fichier se trouvant dansle dossier ListDefinition1, mais dans notre projet, le dossier se nomme LFIList. Il en va de même pour les élémentsElementFile. Remplacez donc tous les ListDefinition1 par LFIList :

<ElementManifest Location="LFIList\ListDefinition.xml" /><ElementFile Location="LFIList\schema.xml" /><ElementFile Location="LFIList\AllItems.aspx" />

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 12 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

<ElementFile Location="LFIList\DispForm.aspx" /><ElementFile Location="LFIList\EditForm.aspx" /><ElementFile Location="LFIList\NewForm.aspx" />

Regardez maintenant les attributs de l'élément Feature. Nous allons en modifier un pour que notre liste présentemieux. Modifiez donc l'attribut Title en LFI List. Ajoutez également l'attribut Description auquel vous affecterez lavaleur Create a LFI List. Ouvrez maintenant le fichier ListDefinition.xml. L'élément Elements possède un sous-élémentnommé ListTemplate. Nous allons modifier quelques attributs de cet élément. Commencez par l'attribut Name pourlequel vous affecterez la valeur LFIList. Modifiez ensuite l'attribut DisplayName en LFI List. Enfin, modifiez l'attributDescription sur Create a LFI List. Ouvrez maintenant le fichier schema.xml.Modifions d'abord légèrement ce fichier afin de rendre la feature valide. Repérez donc l'élément List (l'élément aprèsle prologue) et modifiez son attribut Title en LFIList. Si ce n'est pas déjà le cas, modifiez l'attribut Url sur Lists/LFIListet l'attribut Name sur LFIList. Vous pouvez maintenant compiler et déployer votre solution. Une fois cela fait, rendez-vous dans les Site Settings de votre site et cliquez sur Site features.

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 13 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 14 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Comme vous le voyez, notre custom list est bien disponible dans la liste des feature. Activez-la et revenez sur votresite. Cliquez maintenant dur Site Actions > Create. La colonne Custom List est maintenant la suivante :

Comme vous le voyez, votre custom list apparaît bien dans la liste des listes et il est possible d'en créer une instance,votre liste définition est donc créée.

II - Implémentation du ListFieldIterator

Avant de continuer le développement de notre exemple, un petit mot de théorie s'impose. Le fonctionnement d'unecustom list est assez complexe. Si nous partons du point de départ, vous savez qu'une custom list possède lecontent type 0x01 qui est le content type Item. Si vous regardez ce dernier (12\TEMPLATE\FEATURES\ctypes\ctypeswss.xml), vous verrez ceci :

<ContentType ID="0x01" Name="$Resources:Item" Group="$Resources:List_Content_Types" Description="$Resources:ItemCTDesc" Version="0"> <FieldRefs> <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="TRUE" ShowInNewForm="TRUE" ShowInEditForm="TRUE"/> <!-- Title --> </FieldRefs> <XmlDocuments> <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <Display>ListForm</Display> <Edit>ListForm</Edit> <New>ListForm</New> </FormTemplates> </XmlDocument> </XmlDocuments></ContentType>

Comme vous le voyez ici, nous avons 3 balises intéressantes : New, Edit et Display. En fait ces valeurs contiennentune valeur qui va définir quel "contrôle" sera appelé par SharePoint pour afficher les éléments de la liste. Ici, c'estListForm. Ce contrôle se trouve dans le fichier 12\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx. Sivous ouvrez ce fichier, vous trouverez ceci :

<SharePoint:RenderingTemplate ID="ListForm" runat="server"> <Template> <SPAN id='part1'>

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 15 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator=" " runat="server"> <Template_RightButtons> <SharePoint:NextPageButton runat="server" /> <SharePoint:SaveButton runat="server" /> <SharePoint:GoBackButton runat="server" /> </Template_RightButtons> </wssuc:ToolBar> <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=" " 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>

Ceci est donc le RenderingTemplate permettant d'afficher correctement les 3 pages (EditForm.aspx, DispForm.aspxet NewForm.aspx) d'une liste. Si vous regardez bien, dans tous ces contrôles se trouve le contrôleSharePoint:ListFieldIterator, c'est celui-ci que nous devrons remplacer. Mais avant de faire cela, nous allons faireautre chose. Effectivement, modifier un fichier système de SharePoint est une très mauvaise idée car cela voudraitdire que votre ListFieldIterator s'appliquerait à toute les listes (mauvaise idée) et surtout que si un Service Packest installé et qu'il remplace le fichier DefaultTemplates.ascx de votre SharePoint, l'ancien sera écrasé et leListFieldIterator par défaut reprendra le dessus, nous allons donc en attacher à toute les listes du type LFI List.Passons donc à la pratique. Ouvrez le fichier schema.xml de votre solution. Repérez la partie traitant des Contenttype et observez la ligne permettant de faire le lien entre le Content Type 0x01 et votre liste :

<ContentTypeRef ID="0x01"> <Folder TargetName="Item" /></ContentTypeRef>

Nous allons remplacer cette référence par notre propre Content type. Pour faire cela, ce n'est pas très compliqué. Ilsuffit de copier la déclaration de ce content type depuis le fichier 12\TEMPLATE\FEAUTRES\ctypes\ctypeswss.xmlet la coller à la place de la référence à celui-ci. Générer ensuite un GUID avec Visual Studio (Tools > Create GUID).Ajoutez "00" au Guid actuel du content type et collez la valeur du Guid généré à la suite. Enfin, enlevez les tirets ("-")et accolades ("{}") du Guid et le tour est joué. Au final, vous devriez obtenir quelque chose dans le style :

<ContentType ID="0x01008A0D21C43235475c9F6FC7E649670270" Name="$Resources:Item" Group="$Resources:List_Content_Types" Description="$Resources:ItemCTDesc" Version="0"> <FieldRefs>

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 16 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

<FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="TRUE" ShowInNewForm="TRUE" ShowInEditForm="TRUE"/> <!-- Title --> </FieldRefs> <XmlDocuments> <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <Display>ListForm</Display> <Edit>ListForm</Edit> <New>ListForm</New> </FormTemplates> </XmlDocument> </XmlDocuments></ContentType>

Avec un ID certainement différent. Bon pour l'instant, nous n'avons pas fait grande chose d'utile, nous avons justeremplacé la référence du content type par le content type lui-même, ce qui aura pour effet de ne strictement rienchanger ^^. Effectivement, celui-ci se base encore sur le contrôle ListForm par défaut. Il va nous falloir modifierça. Remplacez donc la valeur de la balise Display en LFIListForm. Effectivement, nous n'allons modifier que leListFieldIterator de la page DispForm.aspx. Votre déclaration de content type devrait donc être :

<ContentType ID="0x01008A0D21C43235475c9F6FC7E649670270" Name="$Resources:Item" Group="$Resources:List_Content_Types" Description="$Resources:ItemCTDesc" Version="0"> <FieldRefs> <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="TRUE" ShowInNewForm="TRUE" ShowInEditForm="TRUE"/> <!-- Title --> </FieldRefs> <XmlDocuments> <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <Display>LFIListForm</Display> <Edit>ListForm</Edit> <New>ListForm</New> </FormTemplates> </XmlDocument> </XmlDocuments></ContentType>

Vous imaginez bien évidemment que ce n'est pas terminé. Effectivement, nous avons indiqué que le contrôle àutiliser pour la page DispForm.aspx doit être LFIListForm, il va donc falloir déclarer ce contrôle. Pour cela, il fautcréer un fichier ascx dans le dossier 12\TEMPLATE\CONTROLTEMPLATES de SharePoint. Créez donc le dossierCONTROLTEMPLATES dans le dossier TEMPLATE de votre solution. Cliquez ensuite dessus et faites Add > NewItem et sélectionnez Text File et nommez ce fichier LFIListForm.ascx. Avant de passer à l'implémentation de cecontrôle, sachez que celui-ci va nécessiter du code. Cliquez donc sur votre projet et créez un nouveau dossier quevous nommerez Code. Dans ce dossier, ajoutez un fichier .cs (Add > Class et nommez la LFIClass.cs. Modifiezensuite son namespace pour que celui-ci soit LFI :

using System;using System.Collections;using System.Collections.Generic;using System.Text;

namespace LFI{ public class LFIClass { }

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 17 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

}

Avant tout autre chose, compilez votre projet pour créer une DLL. Revenez ensuite dans le fichier LFIListForm.ascxet déclarez les directives suivantes dans ce fichier :

<%@ 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" %><%@ Register TagPrefix="LFI" Assembly="LFI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66c185744e0ab4f5" namespace="LFI"%>

Les premières lignes permettent d'importer les classes nécessaires à l'utilisation des contrôles SharePoint.La dernière ligne, cependant, permet d'ajouter une référence à votre propre projet pour insérer votre propreListFieldIterator dans votre contrôle. Cette ligne sera donc légèrement différente chez vous. Effectivement, récupérezla signature de votre assembly grâce à Reflector (abordé dans la section Matériel des cours de ce site) et placezla dans l'attribut Assembly de l'élément Register. Si vous avez fait ce que nous avons dit pour le namespace, vousn'aurez rien d'autre à modifier dans cette ligne.Ce qui va différencier notre contrôle de celui par défaut est le ListFieldIterator, mais vous avez certainementremarqué toute à l'heure qu'un contrôle n'est pas constitué que de cela. Nous allons donc repartir du contrôlepar défaut, et ne modifier que le nécessaire. Repérez donc le rendu ayant l'ID ListForm du fichier 12\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx et copiez/collez le dans votre fichier LFIListForm.ascx. Pourl'instant, il ne diffère pas du code plus haut dans cette page. Cependant, nous allons le modifier en remplaçant laligne parlant du ListFieldIterator de cette manière :

<SharePoint:RenderingTemplate ID="LFIListForm" runat="server"> <Template> <SPAN id='part1'> <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator=" " runat="server"> <Template_RightButtons> <SharePoint:NextPageButton runat="server" /> <SharePoint:SaveButton runat="server" /> <SharePoint:GoBackButton runat="server" /> </Template_RightButtons> </wssuc:ToolBar> <TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 cellspacing=0 width=100%> <SharePoint:ChangeContentType runat="server" /> <SharePoint:FolderFormFields runat="server" /> <LFI:LFIClass 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=" " 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>

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 18 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

</SPAN> <SharePoint:AttachmentUpload runat="server" /> </Template></SharePoint:RenderingTemplate>

Comme vous le voyez, nous avons remplacé la référence au ListFieldIterator par défaut de SharePoint par laréférence à notre propre ListFieldIterator. La dernière chose à changer est l'ID du RenderingTemplate, modifiez doncListForm par LFIListForm. C'est important, car si vous laissiez ListForm, celui-ci écraserait le ListFieldIterator pardéfaut. Celui-ci s'appliquerait donc à tout type de liste avec l'avantage de survivre à l'installation éventuel d'un ServicePack. A partir de maintenant, lorsqu'une liste de type LFI List sera créée, le ListFieldIterator appelée sera LFIListForm.La dernière chose à faire maintenant est de taper le code nécessaire pour notre ListFieldIterator car pour l'instant,il fait exactement la même chose que celui par défaut. Le but du nôtre sera de ne pas afficher les champ de typeChoice et d'afficher un récapitulatif des champs qui n'ont pas été affichés :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 19 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 20 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

Dans la liste affichée ci-dessus, il existe deux champs de type Choice appelé C3 et C4. Comme vous voyezdans la capture précédente, ces champs ne sont pas affichés et le récapitulatif est correct. Ouvrez donc le fichierLFIListForm.cs de votre solution et ajoutez ces directives :

using System.Collections;using Microsoft.SharePoint;using Microsoft.SharePoint.WebControls;using System.Web;

Il va également falloir ajouter deux références à votre projet. Cliquez donc avec le bouton droit de votre souris surle dossier References de votre solution et choisissez Add reference. Dans la liste qui apparaît, choisissez WindowsSharePoint Services. Refaites ensuite la manipulation pour la référence System.Web. Nous allons également devoirfaire hériter notre classe de la classe ListFieldIterator pour pouvoir surcharger les fonctions de cellle-ci :

public class LFIClass : ListFieldIterator

Il existe une fonction intéressante dans le ListFieldIterator qui se nomme IsFieldExcluded. Elle est appelée pourchaque champ de la liste et qui définit si le champ doit ou non, être affiché par le ListFieldIterator. Ici, nous allonsnous en servir pour compter et cacher les champ de type Choice, mais avant toute chose, déclarez ces deux objetsen dehors de toute fonction :

private int numberOfChoice = 0;private ArrayList choicesName = new ArrayList();

La première variable permettra de compter le nombre de champs cachés et l'objet sera une liste des champs cachéspermettant d'afficher le récapitulatif. Surchargez maintenant la fonction IsFieldExcluded de cette manière :

protected override bool IsFieldExcluded(SPField field){

if (field.Type == SPFieldType.Choice) { numberOfChoice++; choicesName.Add(field.Title + " - {" + field.Id + "}"); return true; } return base.IsFieldExcluded(field);

}

Ici, le code n'est pas très compliqué. Tout d'abord nous vérifions si le champ passé en paramètre (le champ qu'onva exclure ou non) est de type Choice, si c'est le cas, nous entrons dans la condition, nous incrémentons la valeurde numberOfChoice, nous ajoutons un élément (constitué du titre et de l'ID du champ) à la liste et nous renvoyonsla valeur True pour indiquer que le champ est exclu (et donc qu'il n'apparaîtra pas). Dans le cas contraire, nousrenvoyons la valeur renvoyée par la fonction de la classe de base.Si nous créions une liste de type LFI List telle qu'elle est actuellement, les champs de type Choice n'apparaîtraientpas, mais il n'y aurait pas de résumé. Pour cela, nous devons surcharger la fonction Render de notre ListFieldIteratorde cette manière :

ListFieldIterator par Sébastien Sougnez (Home page) (Blog)

- 21 -Copyright © 2009 - Sébastien Sougnez. 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'à 3 ans de prison et jusqu'à 300000 E de dommages et intérêts.

http://ssougnez.developpez.com/tutoriels/sharepoint/listfielditerator/

protected override void Render(System.Web.UI.HtmlTextWriter output){

base.Render(output); string returnValue = @"<tr> <td nowrap=""true"" valign=""top"" width=""165px"" class=""ms-formlabel""><H3 class=""ms-standardheader"">Champ(s) bloqué(s)</H3></TD> <td valign=""top"" class=""ms-formbody"" width=""450px"" ID=""SPBlockedField"">"; if (numberOfChoice == 0) returnValue += "Aucun champ n'a été bloqué"; else { returnValue += string.Format(@"{0} champs ont été bloqués :<br /><br /><div style=""margin-left:12px"">", this.numberOfChoice); foreach (string name in choicesName) returnValue += name + "<br />"; } returnValue += "</td></tr>"; output.Write(returnValue);

}

Il n'y a rien de bien compliqué dans ce code. Tout d'abord, nous appelons la fonction Render de la classe parentpour que celle-ci affiche tous les champs de la liste. Ensuite, nous créons une variable nommé returnValue qui serachargée d'ajouter la ligne affichant le récapitulatif au tableau de champs de la liste. Ensuite, selon la valeur de lavariable numberOfChoice, soit nous affichons qu'aucun champ n'a été bloqué, ou alors nous parcourons l'ArrayListpour afficher les informations concernant les champs non affichés. Nous passons ensuite cette variable à la fonctionWrite de l'objet output pour ajoutez la ligne au tableau.Si vous compilez, déployez votre projet, que vous créez une liste de type LFI List et que vous y ajoutez des champsdont certains de types Choice, vous verrez que ceux-ci ne sont jamais affichés dans la page DispForm.aspx et qu'ilssont contenus dans le résumé que nous insérons grâce à notre propre ListFieldIterator.D'autres cours Developpez et Areaprog.Un grand merci à Stephane Eyskens pour m'avoir fait découvrir le ListFieldIterator et à LedZeppII pour la correctionorthographique.