Mettre en place la navigation par catégories dans les sites de Share 3.4d

Alfresco propose depuis quelques années la navigation par catégories dans Alfresco Explorer. Cette navigation permet de parcourir la hiérarchie des catégories comme une arborescence de dossiers et d’afficher les documents qui y sont rattachés.
Avec le passage à Share, cette fonctionnalité a été reprise pour la vue « Entrepôt », mais n’est pas proposée dans l’espace documentaire des sites. C’est dommage, d’autant plus que l’effort à fournir n’est pas très important.

L'entrepôt propose une navigation par catégories, ce qui n'est pas le cas des sites

Nous allons débuter la mise en place de cette navigation par catégories en étudiant les pages en charge de l’affichage de l’entrepôt et de l’espace documentaire d’un site. Plus précisément, nous allons étudier comment l’entrepôt affiche la navigation par catégories pour le reproduire dans Share.

1. Etude de la navigation par catégories dans l’entrepôt

Pour l’entrepôt, c’est la page repository qui est utilisée (on voit ça directement dans l’URL de la page web). Cette page est gérée par le fichier repository.xml, disponible dans le dossier <share>/WEB-INF/classes/alfresco/site-data/pages, comme toutes les pages de Share.
Elle est construite à partir de la définition suivante :

<?xml version='1.0' encoding='UTF-8'?>
<page>
<title>Repository Browser</title>
<title-id>page.repository.title</title-id>
<description>Browse content across the whole Repository</description>
<description-id>page.repository.description</description-id>
<template-instance>repository</template-instance>
<authentication>user</authentication>
</page>

La partie qui nous intéresse le plus est :
<template-instance>repository</template-instance>
Elle indique que le template repository.xml, disponible dans le dossier des « template instances » <share>/WEB-INF/classes/alfresco/site-data/template-instances, doit être utilisé pour assurer le rendu.
Ce fichier référence lui-même un template.
<template-type>org/alfresco/repository</template-type>
et un certain nombre de composants qui seront, on va le voir, utilisés par le template.

Ce template, on le trouve ici : <share>/WEB-INF/classes/alfresco/templates/org/alfresco/repository.ftl. Il va définir la structure complète de la page (entête, corps, pied) et y injecter les différents composants vus plus haut grâce à la macro region.
Le principe est d’aller retrouver le composant dont le region-id correspond à la valeur de l’attribut id de la région. Simple non ?

On voit dans ce fichier qu’une région « categories » est disponible.
<@region id="categories" scope="template" protected=true />
Ce composant est référencé dans le fichier repository.xml de la façon suivante :
<component>
<region-id>categories</region-id>
<url>/components/documentlibrary/categories</url>
</component>

Ce qui signifie que le WebScript /components/documentlibrary/categories.get (cf. <share>/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/documentlibrary/categories.get.desc.xml) va être appelé lors de la construction de la page.
Ce WebScript va produire un contenu HTML chargé de construire un objet JavaScript (côté client), responsable de l’interrogation du référentiel. Et là, je pense qu’il est grand temps de représenter tout cela, et même plus, avec un schéma.

J’ai essayé de synthétiser ici les différents appels et imbrications de fichiers que nous avons vus plus haut, mais je vous conseille fortement de dérouler par vous-même tout cela pour bien en comprendre toute la logique.

2. Etude du cas des sites

Maintenant que l’on comprend ce qu’il se passe côté entrepôt, nous allons regarder ce qu’il se passe pour les sites !
La page responsable de l’affichage des documents dans les sites est documentlibrary.xml, toujours disponible dans le dossier <share>/WEB-INF/classes/alfresco/site-data/pages.
Elle fait appel au « template instance » documentlibrary :
<template-instance>documentlibrary</template-instance>
Ce template instance va faire appel au template org/alfresco/documentlibrary.ftl et définir les composants qui seront utilisés plus tard. Comme on peut le constater en ouvrant le fichier, il n’est pas question du composant categories.
Le template nous informe aussi qu’aucune région categories n’existe :
<div class="yui-b" id="alf-filters">
<@region id=doclibType + "filter" scope="template" protected=true />
<@region id=doclibType + "tree" scope="template" protected=true />
<@region id=doclibType + "tags" scope="template" protected=true />
<@region id=doclibType + "fileplan" scope="template" protected=true />
<@region id=doclibType + "savedsearch" scope="template" protected=true />
</div>

3. Mise en place de la navigation par catégories pour les sites

Au travail maintenant !
Nous allons chercher à injecter le composant categories dans les filtres disponibles dans la « Document Library » des sites.
Tout va commencer par la redéfinition de notre template-instance documentlibrary : nous allons créer un document web-extension/site-data/template-instances/documentlibrary.xml en recopiant l’original.
Dans la section components, nous allons injecter la définition du composant categories vue plus haut, dans l’étude du cas du référentiel :
<component>
<region-id>categories</region-id>
<url>/components/documentlibrary/categories</url>
</component>

Et nous allons en faire usage dans notre surcharge du template : après création du fichier web-extension/templates/org/alfresco/documentlibrary.ftl, nous injectons la région suivante :
<@region id=doclibType + "categories" scope="template" protected=true />

Après avoir rechargé Share, on constate bien que les catégories sont disponibles dans la partie gauche de l’écran.

La navigation par catégories est maintenant disponible dans un site

Toutefois, en jouant un peu avec les catégories, on se rend compte que les documents retournés appartiennent aussi bien au référentiel général qu’aux sites.
Il est temps de passer à l’étape suivante.

4. Limiter les documents retournés au site en cours

Dans le schéma illustrant la première partie, je ne me suis pas attardé sur le dernier WebScript appelé. C’est le moment de l’étudier d’un peu plus près.
Le WebScript en question est doclist.get (cf. alfresco/templates/webscripts/org/alfresco/slinghsot/documentlibrary). Il va réaliser une recherche à partir des arguments et paramètres de l’appel.
Ces derniers sont principalement traités grâce à la méthode getFilterParams du fichier filters.lib.js, inclus dans doclist.get.js.
Cette méthode va, de manière très schématique, construire une requête Lucene à partir de la valeur de l’argument filter (on observe un gros switch/case dans la méthode).
Dans le cas du filtre category, la partie intéressante est celle-ci :
filterParams.query = "+PATH:\"/cm:generalclassifiable" + Filters.iso9075EncodePath(filterData) + "/member\"";
Elle stipule que tous les documents de la catégorie doivent être retournés, sans distinction de leur appartenance au référentiel ou à un site. C’est cette ligne qu’il va falloir corriger !
Et pour trouver comment, il suffit de regarder ce qui est fait pour les tags (qui sont des catégories sans hiérarchie) :
filterParams.query = "+PATH:\"" + parsedArgs.rootNode.qnamePath + "//*\" +PATH:\"/cm:taggable/cm:" + search.ISO9075Encode(filterData) + "/member\"";
Il y a là un terme PATH supplémentaire pour spécifier la racine de recherche. Exactement ce que l’on souhaite !
La correction à apporter va donc être la suivante :
filterParams.query = "+PATH:\"" + parsedArgs.rootNode.qnamePath + "//*\" +PATH:\"/cm:generalclassifiable" + Filters.iso9075EncodePath(filterData) + "/member\"";

Bien entendu, il ne faut pas modifier directement le fichier filters.lib.js, alors on va créer le nôtre dans, par exemple, le dossier alfresco/extension/templates/webscripts/org/alfresco/slingshot/documentlibrary. Il ne faut pas ensuite oublier de référencer ce fichier dans notre propre doclist.get.js en remplaçant la ligne
<import resource="classpath:/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/filters.lib.js">
par
<import resource="classpath:/alfresco/extension/templates/webscripts/org/alfresco/slingshot/documentlibrary/filters.lib.js">
(noter le répertoire « extension »).

Un rechargement des WebScripts Alfresco plus tard et c’est bon ! Ouf !

Comme d’habitude, pour les courageux qui seront arrivés jusqu’ici, voici les modules AMP :

Ca vous est utile ? Un petit commentaire est toujours le bienvenu ;-)

Cette entrée a été publiée dans Alfresco, avec comme mot(s)-clef(s) , , , . Vous pouvez la mettre en favoris avec ce permalien.

Une réponse à Mettre en place la navigation par catégories dans les sites de Share 3.4d

  1. Ping : La navigation par catégories dans les sites Alfresco Share 4.0 | ECM & Co

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam