Introduction
SharePoint 2007 est une révolution dans le monde SharePoint. En effet, il apporte un lot considérable de nouveautés dans le développement. L’architecture a été revue entièrement, elle est basé sur ASP.NET 2.0 et offre même la possibilité d’utiliser AJAX avec le SP1 de SharePoint. SharePoint est devenue à la fois un portail web avec ses template de site, une plateforme de développement avec son framework, et une solution serveur d’entreprise avec son server de recherche et d’indexation ou encore avec Excel Services. Beaucoup d’articles sur internet parlent de la création de WebPart dans SharePoint, mais il n’y a pas que les WebParts dans cette énorme plateforme de développement. Dans cette article nous allons voir comment faire une liste personnalisée qui affiche des vidéos de Youtube et quelles sont les avantages par rapport a la création d’une webpart qui aurait fait la même chose. Avec le temps je me suis rendu compte qu’il fallait rester au plus prés de sharepoint pour pouvoir offrir aux nouvelles fonctionnalités toute la puissance de sharepoint en terme de recherche, de trie ou de filtre.
Les outils de développements
Pour développer avec SharePoint, il vous faut Visual studio 2008 ou Visual studio 2005 avec les VseWSS (WSS Visual studio extension). C’est la version Visual Studio 2005 qu’on utilisera. Ces extensions sont téléchargeables sur le site de Microsoft.com. Une fois que vous avez installé les extensions, plusieurs nouveaux types de projets apparaissent dans Visual studio 2005. La copie d’écran a été faite avec les extensions WSS (Windows SharePoint Services) et MOSS (Microsoft Office SharePoint Server).
Les types de projets sont :
Type de projet
Description
Team Site Definition
Création d’un modèle de site de collaboration
Blank Site Definition
Création d’un modèle de site Vide
List Definition
Définition d’une liste sharepoint personnalisé
WebPart
Création d’une webpart
Empty
Projet vide
Sharepoint Server Sequential Workflow
Création d’un workflow séquentiel
Sharepoint Server State Machine
Création d’un workflow machine à état
Les avantages de l’utilisation des extensions pour Visual Studio sont le débogage et le déploiement qui se font en appuyant sur la touche F5. Prenons un exemple, la création d’un site de collaboration. Je créé un projet de type Team Site Definition que je nomme MyTeamSite :
On peut regarder ce qui se trouve dans l’explorateur de solution :
Nous avons la définition du site avec onet.xml, la page d’accueil default et le Provisioning Handler qui gère les événements d’activation et de remplissage du site. Je vais dans le code SiteProvisioning.cs et sur la gestion de l’événement OnActivated je mets du code :
public void OnActivated(SPFeatureReceiverProperties properties)
{
SPWeb web = (SPWeb)properties.Feature.Parent;
if (web == null)
throw new Exception("Ne peut récupérer le site web parent");
web.TreeViewEnabled = true;
web.Update();
}
Avant les extensions, il fallait compiler et déployer à la main, maintenant il suffit d’appuyer sur la touche magique F5. Lorsqu’on appuit dessus Visual Studio compile, package et déploit la feature. Si l’on regarde d’ailleurs dans l’explorateur Windows ce qui a été créé voici ce que l’on obtient :
Nous avons un setup.bat qui installera ou désinstallera la feature, nous avons aussi un WSP qui est le package créé par visual studio et un dossier solution qui contient les informations sur la features, fichier XML de déploiement etc…
Ensuite il lance internet explorer sur le site racine de SharePoint.
On créé un site SharePoint du type MyTeamSite :
Lorsqu’on clique sur Create le site passe en Provisioning et entre donc dans l’événement OnActivated ce qui nous permet de déboguer notre feature comme si on déboguer un site web.
Si l’on regarde notre site on a bien le treeview qui est activé comme on lui a demandé :
La Custom list
Mais revenons a ce qui nous intéresse, la custom list. Pour cela on va créer une Custom list qu’on appellera youtubeList :
Le template de site demande quelle liste doit être considérée comme liste de base, dans notre exemple on choisira CustomList et on demandera à Visual studio de créer une instance de cette liste :
Visual studio créer automatiquement les fichiers nécessaire a la création de la liste :
On reconnait les pages de la liste (AllItems.aspx), d’affichage d’un item (DispForm.aspx) d’édition d’un item (EditForm.aspx) et d’ajout d’un item (NewForm.aspx)
La liste est une collection de content type, on va donc ajouter un type de contenu a notre projet. Clique avec le bouton droit de la souris sur le projet Add/ New item
On ajout un ContentType nommé YoutubeItem. Il demande quel est le type de base de l’item. On Choisira item dans la liste :
Si on regarde dans l’explorateur de solution l’item n’apparait pas. En fait il faut afficher tous les fichiers et aller dans pkg, la le content type apparait :
On va commencer par le content type
Content Type
Pour paramétrer le content type on va aller dans elementManifest.xml. Dans le nœud FieldRefs on va ajouter les 3 propriétés que l’on veut en plus de notre content type Item. Item contenant déjà Title on ne va pas le renseigner, comme il s’agit d’un héritage youtubeitem contiendra par défaut une propriété Title.
Voici donc le code :
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<ContentType Name="YoutubeItem" ID="0x010086ac23fd903c468faf40fdc673a0a2fa" Group="Development" Version="0">
<FieldRefs>
<FieldRef Name="Description" ID="{8F51D2FB-1F5B-4c09-96EE-FD53A6805CFD}"/>
<FieldRef Name="MovieID" ID="{3DA59372-F977-477c-B4FC-7DF2BF673295}"/>
<FieldRef Name="Preview" ID="{0BDE7F01-B6EC-49fd-8890-F5E7050DFFA0}"
ShowInDisplayForm="TRUE"
ShowInFileDlg="FALSE"
ShowInEditForm="FALSE"
ShowInNewForm="FALSE"/>
</FieldRefs>
</ContentType>
</Elements>
On spécifie que pour l’on veut la prévisualisation que dans l’affichage de l’élément.
Maintenant que notre content type est fait on peut aller dans la définition de la liste
La définition de la liste
On ouvre schema.xml. La première chose à faire et de lier le content type a la liste. Voici la définition de mon content type dans elementManifest.xml :
<ContentType Name="YoutubeItem" ID="0x010086ac23fd903c468faf40fdc673a0a2fa" Group="Development" Version="0">
Je change l’ID et le nom du content type dans la définition de ma liste :
<ContentTypes>
<ContentTypeRef ID="0x010086ac23fd903c468faf40fdc673a0a2fa">
<Folder TargetName="Youtube Item"/>
</ContentTypeRef>
<ContentTypeRef ID="0x0120"/>
</ContentTypes>
Maintenant je spécifie les champs de ma liste qui doivent correspondre aux champs définis dans mon content type :
<Fields>
<Field Name="Description" ID="{8F51D2FB-1F5B-4c09-96EE-FD53A6805CFD}" DisplayName="Description" Required="TRUE" Type="Note" ShowInNewForm="TRUE"/>
<Field Name="MovieID" ID="{3DA59372-F977-477c-B4FC-7DF2BF673295}" DisplayName="MovieID" Required ="TRUE" Type="Text" ShowInNewForm="TRUE"/>
<Field Name="Preview" ID="{0BDE7F01-B6EC-49fd-8890-F5E7050DFFA0}" DisplayName="Previsualisation" Type="Computed" ShowInNewForm="FALSE">
<FieldRefs>
<FieldRef Name=" MovieID"/>
</FieldRefs>
<DisplayPattern>
<HTML><![CDATA[<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/]]></HTML>
<Column Name=" MovieID"/>
<HTML>
<![CDATA[&rel=1">
</param>
<param name="wmode" value="transparent"></param>
<embed src="http://www.youtube.com/v/]]>
</HTML>
<Column Name=" MovieID"/>
<HTML>
<![CDATA[&rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355">
</embed></object>]]>
</HTML>
</DisplayPattern>
</Field>
</Fields>
Attention les ID des champs doivent être les mêmes que les id définis dans le ContentType. Remarque le champ preview, ce champ est de type computed, en fait il affichera le code HTML faisant une instance du flash en utilisant l’id de la vidéo fournit par la propriété MovieID.
Les colonnes sont définies. Cependant elles ne sont pas encore affichées dans les vues. Le code en dessous de la définition des champs définit les vues. On va donc ajouter l’affichage de nos champs dans les vues.
On a deux vues de définies, la première est la vue par défaut, la deuxième est la vue de la liste allitems. On va donc ajouter nos champs dans l’affichage des deux vues. Pour cela on repère le nœud ViewFields, il se situe à deux endroits, un pour chaque vue, le premier est a peu prés au milieu du fichier et le deuxième est à la fin.
Voici le code qui le remplace :
<ViewFields>
<FieldRef Name="LinkTitleNoMenu"/>
<FieldRef Name="Description"/>
<FieldRef Name="MovieID"/>
<FieldRef Name="Preview"/>
</ViewFields>
Une fois que l’on a fait cela on peut déployer notre feature. Pour cela, soit on fait F5, ce qui n’a que peu d’intérêt ici car on n’a pas de code réel. Soit on fait un clic avec le bouton droit de la souris sur le projet et on sélectionne deploy. La plupart des erreurs se passeront au déploiement, car c’est qu’a ce moment la que SharePoint vérifie la syntaxe et l’exactitude des informations fournies dans le XML.
La feature déployé, il nous reste plus qu’a tester. Etant donné que l’on a demandé la création d’une instance de la liste, on n’a pas besoin d’en créer une, elle est créée automatiquement. Dans View all site content on a YoutubeList Instance:
On clique dessus et on sélectionne new :
Vous pouvez remarquer que les champs sont obligatoires. Ceci est du au fait qu’on a mis Required=«true» dans la déclaration de la liste.
Une fois notre item créé on peut le voir dans la liste avec la vidéo :
Et si on sélectionne un item on voit la vidéo s’afficher aussi :
L’avantage de faire une liste est qu’on peut modifier l’affichage, trier ou regrouper les items. Par exemple si on ajoute une colonne catégorie a notre liste et qu’on créé une vue de regroupement on obtient :
On peut donc vraiment utiliser toute la puissance des listes.
Conclusion
Beaucoup de développement SharePoint se basent uniquement sur les WebParts. Alors que le framework SharePoint est beaucoup poussé. La création de liste est vraiment l’un des points les plus puissants de SharePoint car on reste proche de la philosophie de SharePoint