SharePoint 2007: Onet.xml et ContentEditorWebPart

June 07, 2010

Pour un de mes clients j’ai eu à créer un modèle de site dans lequel un WebPart ContentEditorWebPart devait être préconfiguré.

En utilisant la méthode classique qui consiste à configurer le WebPart dans un site de design, puis l’exporter dans un fichier .webpart avant de l’inclure dans le fichier ONET.Xml, j’ai eu la mauvaise surprise de voir une imbrication des balises CDATA. Une première qui englobait le WebPart complet dans l’élément AllUserWebParts, l’autre au sein même de la définition du WebPart :

<AllUsersWebPart WebPartOrder="1"
                 WebPartZoneID="Right"><![CDATA[
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">
       <Title>Contenu riche</Title>
       <FrameType>Standard</FrameType>
      Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c
      Microsoft.SharePoint.WebPartPages.ContentEditorWebPart
      xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor" />

       xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor">
        <![CDATA[ Mon contenu <b>riche !</b> ]]>
       </Content>
              
               </WebPart>
            ]]>
</AllUsersWebPart>
````xml

Un tel fichier ONET.XML n'est pas valide, car le W3C interdit les imbrications de balises CDATA.

La solution ? Il suffit simplement d'encoder le contenu, plutôt que de l'encadrer de balise CDATA :

    <AllUsersWebPart WebPartOrder="1"
                              WebPartZoneID="Right"><![CDATA[
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">
       <Title>Besoin d'aide ?</Title>
     <FrameType>Standard</FrameType>
      <Assembly>Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
      <TypeName>Microsoft.SharePoint.WebPartPages.ContentEditorWebPart</TypeName>
      <ContentLink xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor" />
      <Content xmlns="http://schemas.microsoft.com/WebPart/v2/ContentEditor">
     Mon contenu &lt;b&gt;riche !&lt;/b&gt;
               </WebPart>
            ]]>
             </AllUsersWebPart>

Une autre solution serait d'externaliser le contenu dans un fichier html, mais c'est un autre débat !