CQWP – Fonctions XSLT personnalisées en C# et gestion de la position

CQWP – Fonctions XSLT personnalisées en C# et gestion de la position


Récemment, j’ai eu l’occasion d’utiliser plusieurs possibilités très intéressantes du composant WebPart de requête de contenu de SharePoint 2010 (alias CQWP) que j’aimerais vous faire partager dans ce post à travers la problématique que j’ai eu:

Dans un CQWP, je souhaitais afficher un ensemble de nouvelles, et sur le dernier élément récupéré par la requête, afficher un lien pointant sur la bibliothèque SharePoint contenant ces nouvelles. Le titre de ce même lien devait être également traduit en fonction de la langue d’affichage actuelle du site SharePoint.

Résultat final
Deux points complexes ici :

  • N’afficher le lien qu’au dernier élément et non pas à chaque dans le fichier XSL.
  • Récupérer le lien de la bibliothèque dynamiquement en fonction des éléments remontés par la requête

Je vais ici présenter les solutions appliquées pour résoudre ces deux points.

Récupérer la position courante et la dernière position dans le fichier ItemStyle.xsl du CQWP

Pour répondre à ma problématique, j’ai donc besoin de deux paramètres : la position courante de l’élément ainsi que la position du dernier pour pouvoir effectuer mon test lors de l’affichage. Par défaut, il est impossible de récupérer ces paramètres dans le XSL ItemStyle du CQWP. Pour cela, il vous faut modifier le fichier ContentQueryMain.xsl associé au composant.

Note : Bien que vous puissiez modifier le fichier global, je vous conseille d’utiliser votre propre fichier ContentQueryMain.xsl (Idem pour ItemStyle.xsl d’ailleurs). Pour cela, dans votre fichier *.webpart, ajoutez les propriétés suivantes :

Ajout des propriétés dans le *.webpart
Modifiez ensuite le template « OuterTemplate.CallItemTemplate » de la manière suivante :

Outer Template
A noter que vous devez passer le paramètre $LastRow pour chaque template de votre fichier ItemStyle.xsl (ici CalendarEventStyle et NewsStyle).

Ensuite, identifez le template et modifiez l’appel au template précédent « OuterTemplate.CallItemTemplate » de la manière suivante:

Ajout des variables de position dans le XSL
À partir de cet instant, vous pouvez utiliser les paramètres $CurPos et $Last dans vos templates personnalisés pour écrire vos conditions d’affichage:

Utilisation des paramètres
Vous remarquerez dans ce bout de code XSL la variable $ListUrl ainsi qu’une fonction personnalisée GetAllNewsLinkTitle().
C’est l’objet de la deuxième partie de ce post.

Utiliser des fonctions C# depuis le fichier de style XSL

Dans la première partie, j’ai réussi à n’afficher un lien que pour le dernier élément de ma requête. Cependant, il me reste encore un point à résoudre : récupérer l’URL de la bibliothèque contenant mes éléments peu importe leur emplacement et traduire le texte du lien en fonction de la langue d’affichage du site. Si je voulais implémenter ce comportement en me servant uniquement du XSL, j’aurais beaucoup de difficultés à récupérer cette fameuse URL et la prise en compte de la langue serait plus que fastidieuse. C’est pourquoi je vais utiliser le modèle objet serveur de SharePoint 2010 pour le faire via mes propres fonctions C#! Pour cela, rien de plus simple en réalité: Créez une classe qui contiendra vos méthodes à appeler dans votre feuille de style XSL:

Classe C# personnalisée

Créez votre WebPart via le code et faite le hériter de la classe ContentByQueryWebPart et surchargez la méthode ModifyXsltArgumentList() du CQWP. Dans la méthode AddExtensionObject(), indiquez un nom de namespace que vous utiliserez dans votre fichier XSL de la manière suivante :

WebPart personnalisé
Vous pouvez ensuite utiliser toutes les fonctions définies dans votre classe C# directement depuis votre fichier XSL! Vous imaginez donc les possibilités ensuite 😉

Ajout du namespace personnalisé

Appel de la fonction C# dans le XSL
Il y’a cependant un bug à utiliser des fonctions personnalisées dans le XSL. En effet, lors de l’édition du WebPart, vous vous apercevrez que certains slots manquent dans le « ToolPane ».

Pour rappel, les slots sont les propriétés de CQWP définissant les champs à utiliser dans la requête. Ils sont par défaut automatiquement ajoutés au « ToolPane » du WebPart par le parser XSLT lorsqu’il croise une variable « @MaVariable » dans le fichier définie dans la propriété « DataMappings » du fichier .webpart.

Pas de "Slots" dans le ToolPane
Le problème vient du fait que lorsque le parser XSLT tombe sur une de vos fonction personnalisée lorsqu’il récupère les slots, en réalité, il plante..car il n’arrive pas résoudre le slot. Bref, je ne n’entrerais pas dans le détail car un autre article décrit très bien ce problème : http://blog.mastykarz.nl/inconvenient-content-query-web-part-slots-cqwp-extensibility/

Pour le résoudre il suffit de créer un template vide qui définit tous vos slots et que vous appellerez au début de chacun de vos templates personnalisés.

Template "vide"
Voilà, j’espère que cela pourra vous servir lors de vos prochains développements sur le CQWP!

Liens utiles

+ There are no comments

Add yours