[SharePoint] Afficher les commentaires du "Routing Workflow"
Ceux qui ont un jour utilisé le workflow SharePoint de recueil de commentaires (Routing Workflow), ont sûrement essayé de retrouver les commentaires recueillis, et je suis surpris de voir que ce soit aussi compliqué.
En fait, SharePoint stocke les commentaires dans la liste "Workflow History" (première liste créée par défaut avec le workflow) traçant l'historique du workflow. Cette liste est n'est pas visible quand on affiche le contenu d'un site, mais elle existe bel et bien et on y accède en ajoutant /Lists/Workflow%20History/AllItems.aspx au niveau de l'url du site :
Ce n'est pas franchement lisible pour un utilisateur quelconque, mais maintenant qu'on sait où se trouve la liste, plusieurs solutions existent pour afficher les commentaires d'une manière plus lisible. Nous allons voir comment faire avec le Web Part de requête de contenu en adaptant le style pour supprimer tout ce qui ne nous intéresse pas.
Commençons par configurer le Web Part de requête de contenu :
Et modifions maintenant le fichier ItemXSLStyle.xsl pour afficher les champs retournés par la query. Pour cela j'utilise le template suivant dans le fichier ItemXSLStyle.xml :
<xsl:template name="brutDeFonderieStyle"
match="Row[@Style='brutDeFonderieStyle']"
mode="itemstyle">
<xsl:for-each select="@*">
<b>
<xsl:value-of select="name()"/>
</b> = <xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:template>
Les éléments sont renvoyés sous la forme suivante :
L'idéal serait de pouvoir filtrer les éléments suivant le champs "Event Type" lorsque celui-ci vaut "Task Completed", mais celui-ci n'apparaît pas dans le résultat de la query, du moins pas directement. J'utilise donc un autre filtre :
Il ne reste plus qu'à mettre en forme le résultat en utilisant par exemple le template suivant :
<xsl:template name="Commentaires" match="Row[@Style='Commentaires']"
mode="itemstyle">
<xsl:value-of select="substring-after(
@_x007B_2fd53156_x002D_ff9d_x002D_4cc3_x002D_b0a
c_x002D_fe8a7bc82283_x007D_,
'Comments:')"/><br/>
</xsl:template>
On obtient alors la liste de nos commentaires :
Si vous essayez, vous allez sûrement croire que j'essaye de vous duper, le type de contenu n'étant pas visible au niveau de la configuration de la requête de contenu.
En fait, il manque une petite étape préalable pour pouvoir requêter la liste, car le type de contenu est déclaré dans le groupe "_hidden" et la liste est cachée.
Il faut commencer par activer les types de contenus au niveau de la liste "WorkFlow History" (List Settings > Advanced Settings) pour faire apparaître le type de contenu "Workflow History"
En cliquant sur le type de contenu on se rend compte qu'il possède un parent de même nom :
C'est ce type de contenu parent qu'il faut modifier et changer de groupe pour le mettre dans un groupe "visible" :
Le type de contenu est visible par la requête de contenu :
N'oubliez pas de cocher 'Child content types", je vous rappelle que c'est le type de contenu parent que nous avons rendu visible 
A ce stade la requête ne renvoit aucun élément car la liste n'est pas visible. Si on regarde les propriétés de la liste avec SharePoint Designer, on voit que celle-ci est cachée :
Il est possible de la rendre visible à ce niveau (avec SharePoint Designer) ou alors de le faire par code.
Ce qui est curieux, c'est que si on édite le workflow en lui indiquant d'utiliser une nouvelle liste d'historique de workflow (et en changeant le nom du workflow, le nom de la liste utilisant le nom du workflow), la nouvelle liste créée n'est pas cachée cette fois-ci...
C'est une 3ème solution (si on peut l'appeler comme ça) pour rendre la liste visible sans passer par SharePoint Designer ou du code.
Conclusion:
J'avoue que la démarche n'est pas du tout immédiate, le packaging pour le déploiement n'étant pas encore fait, et le rendu des commentaires peut être largement amélioré avec l'affichage de l'auteur du commentaire et de la date, par exemple (ce qui peut être fait comme déjà vu ici). Mais ceci aura au moins permis de lever les difficultés liés à cette fonctionnalité, et encore une fois, je suis surpris qu'elle ne soit pas disponible nâtivement.
Une autre piste à creuser est l'utilisation d'un EventHandler sur la liste d'historique qui recopie les éléments dans une liste dédiée aux commentaires. Ceci permet d'ailleurs de répondre à un problème que je n'ai pas évoqué jusque là : la purge des éléments de la liste d'historique après 60 jours... Du coup, bon coding ! 
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :