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 <b>riche !</b>
</WebPart>
]]>
</AllUsersWebPart>
Une autre solution serait d'externaliser le contenu dans un fichier html, mais c'est un autre débat !