Introduction

Les Windows SharePoint Services permettent de mettre en place rapidement un intranet ou un portail d’entreprise fonctionnant sur la notion de site web basé sur des modèles.

Un site Sharepoint contient un site racine (root web) et des sous-sites (sub web). Ces sites permettent le partage d’informations, la collaboration de documents, aidant ainsi à augmenter la productivité de l’équipe et de l’individu. Par exemple, ces sites peuvent être des espaces de travail en ligne, comme des espaces de documents, ou de réunion. Cela peut aussi être des sites fournissant des services, comme les sites de gestion de projet (via Microsoft Project) ou d’autres types encore.

Les modèles de site peuvent être modifiés ou ajoutés afin que l’intranet résultant réponde au mieux aux besoins de l’entreprise. Nous allons voir au cours de cet article comment créer un modèle de site.

Pour créer un modèle de site, il faut disposer d’un serveur Windows 2003 avec les Microsoft Sharepoint Services d’installés. Pour cela, vous pouvez vous reporter à cet article qui explique la procédure à suivre.

Création d’un modèle simple

La création d’un modèle de site Sharepoint passe par la modification d’un grand nombre de fichiers CAML. Le CAML (Collaborative Application Markup Language) est un langage basé sur XML et développé par Microsoft pour définir les sites, listes, pages, vues et éléments de liste ainsi que toutes autres composantes des technologies Sharepoint en générale.

 

Pour plus d’informations sur les éléments CAML des listes et autres fichiers XML de Sharepoint, vous pouvez consulter l’aide en ligne à partir de ce lien.

Les principaux fichiers CAML à modifier sont les fichiers WEBTEMP*.XML, le fichier ONET.XML du modèle de site, et les fichiers SCHEMA.XML de chaque listes.

Fichier WEBTEMP.XML

Il se trouve dans le dossier C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\1036\XML

Le fichier WEBTEMP.XML spécifie tous les modèles de site disponible. Une entrée se définit comme suit :

< Template Name =”STS” ID =”1″>< ConfigurationID =”0″Title =”Site d’équipe”Description =”Ce modèle crée un … de base.”></ Configuration> …</ Template>

Cette entrée définit un ID pour le modèle (ID) ainsi que le nom du dossier contenant le Template (Name). Le modèle se décline en plusieurs configurations, identifiable par un ID. La définition de ces configurations se fait dans les fichiers ONET.XML et sera expliquée par la suite.

D’une manière générale, Windows Sharepoint Services prend en compte tous les fichiers du type WEBTEMP*.XML pour connaître l’ensemble des modèles de site disponibles. Le déploiement et les mises à jour pourraient se révéler difficiles, le cas où les modifications seraient incluses dans les fichiers propres aux Windows Sharepoint Services. Il convient donc de créer un nouveau fichier pour y spécifier les modèles ajoutés. Par exemple Et son contenu :

< Template Name =”FORMATION” ID =”10001″>< ConfigurationID =”0″ Hidden =”FALSE”ImageUrl =”/_layouts/images/projet1/formations.png”Description =”Ce modèle crée … .”></ Configuration> …</ Template>

L’ID du template doit être supérieur à 10 000 pour ne pas interférer avec les modèles Sharepoint Portal et Sharepoint Services déjà existant.

Bien que déclaré, le modèle n’existe par pour le moment. Il faut donc le définir à partir d’un modèle existant.

Dossier du modèle de site

Pour créer un modèle, il faut recopier le dossier C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\1036\STS et le renommer selon le nom spécifié dans le fichier WEBTEMP*.XML le déclarant.

Fichier ONET.XML (les balises Configuration/Modules)

C’est le fichier de configuration globale pour les templates de site. Voici sa structure :

< Project> </ Project>
Element Description
NavBars Définit les liens de la barre de navigation supérieure du site, ainsi que le style des liens de la barre de navigation rapide (barre verticale à gauche sur la page d’accueil).
ListTemplates Spécifie les types de liste utilisable dans le template.
DocumentsTemplates Modèle de documents pour les éléments de liste
BaseTypes Définit les types de base. Généralement, il n’est pas nécessaire de modifier cet élément
Configurations Définit les différentes configurations possibles pour un template de site (listes par défaut, pages incluses par défaut).
Modules Une configuration du template possède des modules. Ce sont ces modules qui définissent les pages à ajouter et la configuration de ces dernières.

Le fichier ONET permet notamment :

  • De définir différentes configuration du template. C’est-à-dire de spécifier quelles listes existeront par défaut sur le site (librairie de documents, liens, images, contacts, … ), et quelles pages (default.aspx).
  • D’ajouter ou modifier les webparts de la page par défaut
  • D’ajouter des pages
  • D’ajouter un en-tête au site
  • D’appliquer un thème de couleur aux pages

Configurations du template

Les balises configuration du template déclaré dans le fichier WEBTEMP*.XML doivent correspondre à une balise de configuration du fichier ONET.XML.

< Configuration ID =”0″ Name =”FORMATIONS INTERNES”>< Lists>List Title=”Formations” Url=”Formations” QuickLaunchUrl=”Formations/Forms/AllItems.aspx” Type=”101″ />< ListTitle =”Inscription”=”Registration” QuickLaunchUrl=” Registration/Forms/AllItems.aspx” Type=”101″ />< ListTitle =”Annonces”=”Lists/Announcements” QuickLaunchUrl=”Lists/Announcements/AllItems.aspx” Type=”104″ /></ Lists> <Modules >< ModuleName =”Default”/>Module Name=”WebPartPopulation”/> </ Configuration>

La balise configuration contient deux éléments :

  • Liste : spécifie les listes par défaut que contiendra le site une fois créé.
  • Module : spécifie les modules à utiliser. Un module permet d’ajouter des pages (Default est le module ajoutant la page d’accueil) ou des webpart.

Définition d’un module ajoutant des pages :

< Module Name =”AvailableCourses” Url =”” Path =”COURSES”>< FileUrl =”Copyright.aspx”NavBarHome =”False”></File >< FileUrl =”AllCourses.aspx”NavBarHome =”True”>< AllUsersWebPartWebPartZoneID =”Top”WebPartOrder =”1″><![ CDATA[“https://schemas.microsoft.com/WebPart/v2“”https://schemas.microsoft.com/WebPart/v2/Image”> <WebPart xmlns= xmlns:iwp= “https://schemas.microsoft.com/WebPart/v2/Image”>< Assembly> CoursesWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6ec76bfb7b4ccba6 </Assembly >< TypeName> CoursesDetailWP.AllCoursesViewer</ TypeName> <FrameType >None </FrameType >Title >Toutes les formations </Title ></ WebPart> ]]></ AllUsersWebPart> </File >Module >

Le module ci-dessus défini deux pages avec une webpart et une page simple sans webparts

On voit bien ici la mise en place d’un modèle de site avec des listes prédéfinies.

Déploiement de WebPart

Les WebPart utilisées doivent être préalablement déployées sur la machine.

Le déploiement de Web Part sur les sites SharePoint s’effectue à l’aide de l’utilitaire STSADM.EXE, appliqué à un fichier CAB contenant les web part déployées. Les web part sont alors inscrites dans la galerie de serveurs virtuels. Elles peuvent alors être ajoutées au page comme toutes autres web part.

Signer les assembly avec l’utilitaire sn.exe, disponible depuis le Visual Sudio 2003 Command Prompt : sn.exe -k c:\WebPartLib1.snk génère la nouvelle clé. Ajoutez la clé à votre solution et modifiez la propriété AssemblyKeyFile du fichier AssemblyInfo.cs ainsi : [assembly: AssemblyKeyFile(@”../../WebPartLib1.snk”)]

Packager ses Web Part dans un CAB. Ajoutez un nouveau projet CAB à votre solution A partir du menu contextuelle, ajoutez lui les sorties “sortie principale” et “contents Files” pour tous vos projets WebPart de votre solution que vous souhaitez déployer.

Pour le déploiement, copier le fichier CAB obtenu sur votre serveur et enregistrez les webparts grâce à l’utilitaire stsadm.exe. L’utilitaire est disponible dans le dossier C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\BIN du serveur. Exécutez la commande suivante : stsadm.exe -o addwppack – filename c:\Cab1.cab si le package avait déjà été déployé auparavant, utilisez l’option -force pour le redéployer.

Tête de page et Charte graphique

Via le fichier ONET.XML, il est possible de personnaliser d’avantage un site Sharepoint Services pour l’adapter au mieux aux besoins de l’entreprise. Notamment par la prise en charge d’une charte graphique (feuille de style CSS), et aussi une navigation personnalisée (en-tête de page propre à l’entreprise).

Ajouter un en-tête au template de site

L’en-tête personnalisé se définit au niveau du Template. Il est ainsi le même pour toutes les configurations du Template. Pour cela, il faut utiliser la propriété AlternateHeader de l’élément racine

<

AlternateHeader

<%

Le fichier aspx doit se trouver dans un dossier du type C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\1036\projet1\OWS.CSS. Le fichier doit juste être accessible depuis le chemin /_layouts/ depuis les sites web, mais il est préférable de regrouper tous les éléments propres à un projet dans un dossier spécifique. Ceci pour des questions de maintenance et de clarté.

Le fichier aspx peut comporter du code behind. Ce code peut utiliser toutes les librairies utilisables dans le contexte sharepoint :

<%@ Page language=”C#” %> <%@ Register Tagprefix=”SharePoint” Namespace=”Microsoft.SharePoint.WebControls” Assembly=”Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %> <% SPSite spServer = SPControl.GetContextSite(Context); SPWeb spWeb = SPControl.GetContextWeb(Context); %> < tr> <% if (spWeb.UserIsWebAdmin) { %> En tête pour les administrateurs de site <% } else { %> En tête par défaut <% } %></ td>tr >

Pour utiliser des librairies personnelles, il faut avoir placé préalablement les assemblies soit dans le GAC, soit dans le dossier C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\BIN

Il est possible de remplacer l’en-tête par un user-contrôle. Pour cela, il est judicieux d’utiliser des contrôles web personnalisés, afin d’éviter d’utiliser un fichier ascx pour le rendu html. Le rendu se fait alors dans la méthode Render du contrôle

Le fichier WebCustomcontrol1.ascx.cs :

using System; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; namespace } } }

Le fichier Header.aspx :

<%@ Page language=”C#” %> <%@ Register TagPrefix=”ACFCI” Namespace=”HexagoneSearch.Web” assembly=”HexagoneSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6ec76bfb7b4ccba6″%> <ACFCI:WebCustomControl1 </ ACFCI:WebCustomControl1>

Cependant, cet en-tête ne s’applique pas aux pages du Template, mais uniquement aux pages d’administration. Pour l’appliquer au Template, il faut en modifier toutes les pages.

Deux types de modifications sont possibles. Soit on ajoute une partie de code pour conserver la logique des pages d’administration, soit on remplace une partie du code pour appliquer un en-tête de manière obligatoire.

Ajout

L’ajout de code consiste en un encadrement de la région entre les commentaires Top bar et  Title dans une instruction if. L’instruction test si un en-tête personnalisé à été défini ou non, et l’affiche si elle existe.

<! –Top bar–> <%string alternateHeader = SPControl.GetContextWeb(Context).AlternateHeader; if (alternateHeader == null || alternateHeader == “”) {< tableclass =”ms-bannerframe”border =”0″cellspacing =”0″cellpadding =”0″width =”100%>< tr> <td nowrapvalign =”middle”><img ID=onetidHeadbnnr0 alt=”Logo” src=”/_layouts/images/logo.gif”></ td> <td class=ms-banner width=99% nowrapID =”HBN100″valign =”middle”><! –webbot bot=”Navigation” S-Btn-Nobr=”FALSE” U-Page=”sid:1002″ S-Target startspan –> < SharePoint:Navigation LinkBarId =”1002″ runat =”server”/> <!–webbot bot=”Navigation” endspan — ></ td> <td class=ms-banner>   </ td> <td nowrapclass =ms-bannerstyle =”padding-right: 7px”>< SharePoint:PortalConnectionrunat =”server”/> </td ></ tr> </table ></ TD> </TR > } else { %><! –#include file=”header.aspx” –> <ACFCI:TopBar id=”myTopBar” runat=”server”></ ACFCI:TopBar> </TD ></ TR> <% } %>– Title — >

Dans cette exemple, le bloc else contient les deux solutions retenues : l’ajout d’une balise include, ou alors l’ajout direct d’un contrôle utilisateur.

Il faut bien faire attention qu’ici le fichier header doit être dans le même répertoire de la page. Cela reviendra à avoir deux copies distinctes de ce fichier : une dans le dossier du Template, et l’autre dans celui des pages d’administration ( C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\1036 )

Remplacement

C’est une solution plus simple mais moins souple qui consiste à remplacer la région précisée plus haut par une balise include ou un contrôle utilisateur. Dans ce cas, il faudra remodifier toutes les pages aspx ainsi que le fichier ONET.XML pour réactiver le menu standard :

<! –Top bar–> < ACFCI:TopBar id =”myTopBar” runat =”server”></ACFCI:TopBar ></ TD> <! — Title –>

Appliquer automatiquement une feuille de style

L’application d’une feuille de style permet par exemple le respect de la charte graphique de l’entreprise. Elle permet aussi de modifier l’aspect des pages et de « masquer » la fonction de recherche native. Voici un exemple :

Pour plus de renseignement sur les éléments de la feuille de style sharepoint, consultez ce lien.

L’application systématique d’une feuille de style se fait par la copie du fichier C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\1036\STYLES\OWS.CSSDans un dossier du type C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\60\TEMPLATE\LAYOUTS\1036\projet1\OWS.CSSNotons que le fichier copié doit juste être accessible depuis le chemin /_layouts/ depuis les sites web.

Ensuite, il faut utiliser la propriété AlternateCss de l’élément racine pour indiquer la feuille de style à utiliser :

< Project AlternateCSS =”/_layouts/<%

Cependant, seuls les pages d’administration communes aux sites Sharepoint seront affectées par cette modification. Pour la rendre effectives sur les pages du Template, il faudra réécrire une ligne dans toutes les pages aspx de celui-ci. Au niveau de la balise HEAD, il faut remplacer la ligne :

< Link REL =”stylesheet” Type =”text/css” HREF =”/_layouts/<%

Par :

< SharePoint:CssLink DefaultUrl =”” runat =”server” ID =”Csslink1″/>

Créer et modifier les listes

Les listes sont les éléments centraux des Sharepoint Services. Elles permettent le stockage d’informations. On trouve des bibliothèques d’images ou de documents, des listes de messages, de tâches, d’évènements ou d’autres types.

On a la possibilité de créer de nouvelles listes et de modifier celles déjà existantes. La modification de la définition se fait via les fichiers LISTS\[nom de la liste]\ SCHEMA.XML

Structure des fichiers SCHEMA.XML :

< List> </ MetaData>Data ></Data > </List >
Element Description
Fields Cette balise définit les champs du type de liste (nom, date, message, choix, …)
Views Définit les différentes vues de la liste. Cette définition permet de préciser à tous les niveaux le code html qui sera utilisé.
Forms Déclare les formulaires utilisés dans la liste
DefaultDescription Description affiché sur la page de création de liste.
Toolbar Permet de définir la barre d’outils située au dessus de la vue, ainsi que le menu contextuel de la barre verticale.
Data Spécifie un ensemble d’éléments initiaux pour les listes.

Le fichier SCHEMA.XML permet :

  • Ajouter des colonnes
  • Ajouter des vues
  • Ajouter des pages
  • Ajouter/Modifier les éléments par défaut (par exemple les annonces)

Modifier une liste existante

La modification des listes peux se faire à deux niveau : Au niveau du contenu ou au niveau du rendu.

La modification du contenu des listes se fait via l’ajout d’éléments dans Fields

< Fields> </ Fields>

Créer une nouvelle liste

Dans l’élément racine List, certaines listes ont un attribut BaseType. Celui-ci défini la liste de base pour un élément. La plupart des listes créés manuellement sont de type 0 (Custom List) car c’est le type de liste le plus générique.

Le fichier ONET.XML définit plusieurs types de listes par défaut dans sa section BaseTypes. Voici les différentes valeurs possibles :

Pour créer une nouvelle liste, on copie généralement un modèle de liste qui est proche de ce que l’on recherche et on renomme le dossier créer (copier DOCLIB dans un dossier COURSES par exemple). Il faut ensuite modifier le schéma comme énoncé dans la section précédente. Enfin, pour pouvoir être utilisable, la liste doit être déclarée dans le fichier ONET.XML

< ListTemplates> < ListTemplateName =”courses”DisplayName =”Liste de formations” Type =”90000″ BaseType =”1″ OnQuickLaunch =”TRUE” SecurityBits =”12″ Description =”Partagez les descriptifs de formations.”Image =”/_layouts/images/itgen.gif”></ ListTemplate> …ListTemplates >

Et voici ce que l’on obtient dans la page de création de liste :

Un nouveau type de liste est alors disponible et se classe dans la section de son type de liste de base. De plus, l’ordre d’affichage correspond à l’ordre de déclaration.

Remplacer des contrôles, spécialisation avancée du site

L’avantage de remplacer des contrôles Sharepoint par ses propres contrôles est de pouvoir ajouter des fonctionnalités qui ne sont pas présentes dans les sites Sharepoint Services par défaut. Cela peut être :

  • L’ajout d’un fils rouge pour la navigation inter-site.
  • La modification de la barre de navigation rapide.
  • La personnalisation avec l’ajout de fonctions dans la barre contextuelle des listes.

La création de tels contrôles se base sur l’utilisation de contrôles web personnalisés ainsi que sur le modèle objet Sharepoint. Il est préférable de ne pas utiliser de contrôles web utilisateur car ces derniers nécessitent l’utilisation d’un fichier ascx en plus d’une l’assemblie.

Exemple de création d’un fils rouge

Voici par exemple comment créer simplement un fil rouge de navigation entre les sites Sharepoint :

/// <summary> /// File rouge pour accéder au site /// </summary> publicclass SiteLinkBar : System.Web.UI.WebControls.WebControl { private string GetErrorTable(Exception e) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(“<table width=100% bgcolor=lightgrey border=\”solid 1px\”>”); sb.Append(” <tr>”); sb.Append(” <td valign=top style=\”border: solid 0px;font:normal 8pt Verdana\”>”); sb.Append(” “+ e.ToString() + “<br/>”); sb.Append(” </td>”); sb.Append(” </tr>”); sb.Append(“</table>”);return sb.ToString().Replace(“\t”, ” “); } protectedoverride void Render(HtmlTextWriter output) {try { SPWeb web = null; SPSite site = Microsoft.SharePoint.WebControls.Navigation.GetContextSite (System.Web.HttpContext.Current); web = site.OpenWeb( this.id); string str = “<a href=\””+web.Url+”\”><u>”+web.Title+”</u></a>”; while(!web.IsRootWeb) { web = web.ParentWeb; str = “<a href=\””+web.Url+”\”><u>”+web.Title+”</u></a>” + “> ” + str; } output.Write(“<div class=\”ms-formdescription\”>”); output.Write(str); output.Write(“</div>”); } catch(Exception e) { output.Write( this.GetErrorTable(e));

Il faut ensuite l’ajouter à la page default.aspx de son modèle de site et éventuellement aux autres pages.

Cette capture d’écran montre le contrôle « fils rouge » vue plus haut, et un contrôle de menu personnalisé remplaçant le menu Sharepoint.

Ce « fils rouge » nous indique notre emplacement dans les sites Sharepoint. A travers cet exemple simple de manipulation du modèle objet de Sharepoint, on se rend vite compte des possibilités énorme que cela nous donne.

Ainsi, une façon d’étendre encore plus les possibilités des sites passe par la création de webparts. Pour plus de détails, vous pouvez vous reporter sur

cet article

.

Créer un contrôle pour l’en-tête des pages

L’une des possibilités les plus classiques de personnalisation est la mise en place d’un en-tête de page commun pour les modèles de site développé. L’en-tête peut alors regrouper des fonctionnalités générales, comme un logo, une barre de menu générique, une barre d’informations sur l’utilisateur courant, ainsi qu’une zone de saisie de recherche.

La barre pourra être hébergée dans l’en-tête personnalisé du site selon la méthode décrite plus haut dans l’article.

Une architecture d’en-tête de page peut être la suivante :

Dans ce modèle, les contrôles de l’en-tête ont des propriétés qui peuvent être configurées à partir de fichiers XML. Par exemple :

  • Le logo : lien de redirection lorsque l’on clique sur le logo
  • Barre de recherche : vers quelle page rediriger la recherche
  • Barre de menu : Configuration des éléments du menu. La configuration peut prendre en compte la mise en forme du texte à afficher, des liens relatifs, statiques, l’exécution de javascript . Ou encore des opérations plus complexe, comme l’affichage des sous-sites de premier niveau ou des menus visibles uniquement pour certaines catégories d’utilisateurs (administrateur, lecteur, visiteur, …).

Pour finir

Voici un exemple de modèle de site qui peut être obtenu en appliquant la plupart des points vus dans l’article:

Ce modèle de site prend en compte :

  • La personnalisation des configurations
  • L’utilisation d’un en-tête de pages personnalisées
  • L’utilisation d’une feuille de style
  • L’ajout de liste personnalisée
  • Le remplacement et l’ajout de contrôles web

Tout ceci permet d’obtenir des modèles de site spécifique et adapté à une utilisation donnée. Pour avoir d’autres exemples, à partir de ce lien, Microsoft propose librement un ensemble de modèle de site pour des applications métiers de base.

Conclusion

Résumé

Nous n’avons vu qu’une partie de la création de modèle de site, nous permettant d’avoir des listes et des fonctions personnalisées, ainsi qu’une charte graphique propre à l’entreprise. D’autres fonctionnalités non évoqué ici mais très intéressantes existent, comme la gestion des évènements ou l’ajout de vues pour les listes.

De plus il existe autre approche de création de modèle de site qui est complètement différente de ce qui viens d’être exposé dans cet article. Cette autre méthode consiste à utiliser FrontPage pour personnaliser un site existant et l’enregistrer ensuite comme modèle.

L’intérêt des modèles de sites

La création de modèle de site est un aspect important dans l’étude des Windows Sharepoint Services. D’une part, parce qu’ils servent de base à Sharepoint et donc, aide à sa compréhension. Et d’autre part, parce que Sharepoint est lui-même principalement implémenté par des modèles de sites (SPSCOMMU, SPSMYSITE, SPSNEWS, SPSTOC, …). Ces notions permettent de configurer plus finement les sites Sharepoint pour qu’ils répondent aux mieux à nos attentes.

Futur des technologies Sharepoint

Avec les présentations qui ont eut lieu à la PDC 2005, on se rends compte que les technologies Sharepoint sont appelées à avoir une place de plus en plus importante dans la stratégie de Microsoft. Celui-ci promouvant de plus en plus les Windows Sharepoint Services dans ses solutions, notamment avec Project, Visual Studio Team System et Navision, on peut penser que les technologies Sharepoint deviendront un passage obligé pour des outils comme Office et les solutions d’entreprises hébergés sur les systèmes Windows.