none
[MOSS] Site Definition, MasterPage et tokens dynamiques (~sitecollection) RRS feed

  • Question

  • Bonjour à tous,

    Je suis en train de me pencher sur la création de Site Definition sous MOSS.

    Pour se faire j'ai créé un projet WSPBuilder qui va bien, incluant une feature déployant ma MasterPage :
    - scope="Site" 
    - référencée côté ONET.XML au niveau <SiteFeatures> de la Configuration de ma Site Definition
    - au niveau de mon elements.xml : <Module Name="SiteDefinitionMasterPage" Url="_catalogs/masterpage" Path="MasterPages" RootWebOnly="FALSE">
    Rien de bien compliqué.

    Côté Site Defintion, un webtempMonProjet, un ONET.XML, mes éléments de design (_layouts).

    Au niveau de ma MasterPage j'utilise, comme indiqué dans cet article http://msdn.microsoft.com/en-us/library/ms476046.aspx, le token ~masterurl/custom.master.
    Et au niveau de mon ONET.XML voici le noeud Configuration de ma Site Definition :

    <Configuration
    ID="0" Name="Default" CustomMasterUrl="~sitecollection/_catalogs/masterpage/SiteDefinition.master" MasterUrl="~sitecollection/_catalogs/masterpage/SiteDefinition.master">

    C'est ici que survient mon problème. Lorsque je créé une collection de site basée sur ma Site Defintion ainsi développé, tout fonctionne au niveau déploiement : ma MasterPage se retrouve bien dans /_catalogs/masterpage, comme indiqué.
    Par contre, la MasterPage utilisée par mon site n'est pas SiteDefinition.master mais default.master.
    Le token custom.master n'est pas mappé avec ~sitecollection/_catalogs/masterpage/SiteDefinition.master.

    Par contre si je modifie mon noeud configuration en suprimant "~sitecollection/" cela fonctionne (CustomMasterUrl="_catalogs/masterpage/SiteDefinition.master"). Mais si je veux créer un sous-site à cette collection de site, SharePoint m'envoie bien logiquement dans les fraises, me précisant qu'au niveau de ce sous-site il ne trouve aucune référence à /_catalogs/masterpage/SiteDefinition.master. Pour que cela fonctionne il faut que je déclare ma Feature de déploiement de MasterPage en scope="Web" et que je la référence dans <WebFeatures>. Mais si je peux éviter d'avoir autant de MasterPage à gérer que de sites ça m'arrangerait.

    Je dois surement louper quelque chose. Soit au niveau de mon projet de Site Definition, soit au niveau de la logique de ces tokens dynamique.
    Merci d'avance aux courageux qui lirons ce post et à ceux qui pourrons m'éclairer sur le sujet.

    A+
    Alexis

    jeudi 26 février 2009 13:27

Toutes les réponses

  • Bonjour,

    Ces deux liens vous aideront peut-être :

    Créer un Site Template pour Windows SharePoint Services (WSS) V3
    Building Master Pages for Windows SharePoint Services 3.0 using Site Definitions 

    Les 2 tutoriaux indiquent qu'au niveau du noeud configuration il faut utiliser CustomMasterUrl="_catalogs/masterpage/SiteDefinition.master" et pas  CustomMasterUrl="~sitecollection/_catalogs/masterpage/SiteDefinition.master"

    Cette phrase me fait tiquer "Au niveau de ma MasterPage j'utilise, comme indiqué dans cet article http://msdn.microsoft.com/en-us/library/ms476046.aspx, le token ~masterurl/custom.master." :
    Ce token s'utilise dans les pages .aspx pour indiquer quelle masterpage utiliser, en l'occurence celle déclarée comme CustomMasterUrl au niveau du noeud configuration. Il ne doit pas être utilisé dans la master page elle-même.

    Bon courage, vous y êtes presque :)

    Si vous coincez vraiment, envoyez moi le projet à nouvel.arnault.hotmail.fr (avec un @ avant hotmail) et j'essaierai de voir ce qui ne va pas.
    jeudi 26 février 2009 19:19
  • Euh oui je me suis embrouillé dans mon post, je parlais bien de ~masterurl/custom.master dans default.aspx. Bien vu :)

    Bon néanmoins je me demande toujours comment faire pour faire fonctionner ~sitecollection (ça marche bien sans, mais nécessite de dupliquer les MasterPages).

    Si néanmoins on peut le faire tourner .... je commence à douter :D

     

    vendredi 27 février 2009 10:48
  • Je ne pense pas qu'il soit nécessaire de dupliquer les master pages dans chaque web, il suffit de faire pointer la propriété MasterUrl vers le même chemin que celui défini au niveau du site racine. Ca pourrait se faire par code via une feature, ou (non testé) utiliser un noeud configuration différent pour les sous-sites, qui lui utiliserait ~sitecollection/_catalogs/masterpage/SiteDefinition.master.

     

    La masterpage d'un template de site est définie au niveau du noeud configuration associé, donc si le but est d'avoir la même masterpage sur toute la collection de site (quelque soit le template de chaque sous-site), il faut utiliser un mécanisme qui applique à chaque sous-site la masterpage du site racine. Nativement, SharePoint ne gère pas ce besoin.

    Est-ce ce que vous cherchez à faire ?

    Si oui, il y a plusieurs façons de faire :

    • Un SPJob qui va de temps en temps scanner récursivement les sous sites et appliquer sur chacun d'entre eux la masterpage du site racine,
    • Une feature de niveau site qui effectue cette même manipulation lors de son activation, mais il faut la désactiver/réactiver à chaque fois que l'on créé un sous-site,
    • Une feature de niveau web qui lors de l'activation, applique la même masterpage au site courant que celle du site racine, mais il faut l'activer sur chaque Web,
    • Un script powershell ou application console qu'il faut éxécuter après chaque création de sous-site,
    • Un HttpModule qui va modifier la propriété MasterPage de chaque page sur le PreInit pour pointer vers celle utilisée par le site racine. Dans ce cas le paramètre masterpage du site n'est plus utilisé, mais il n'y a pas besoin d'action manuelle suite à la création d'un sous-site.

    Sinon je n'ai jamais essayé mais il est peut-être possible d'écraser default.master (au niveau site collection, car il ne faut surtout pas écraser celui du répertoire 12)

     

    vendredi 27 février 2009 11:26
  • Ah d'accord. C'est encore plus "bordélique" que ce que je pensais :)
    Mon idée c'était de tout centraliser au niveau racine, tout simplement.

    Merci pour le coup de main ainsi que les différentes pistes de travail.
    lundi 2 mars 2009 09:28