Template de document

Création du template

Supposons que vous ayez créé un nouveau type de document dans Nuxeo; prenons l'exemple d'un document de nouveau type Article. Le principe d'enrichissement lié au projet "custom" vous permet alors de définir un template spécifique d'affichage des informations contenues dans le type Article. Pour cela, il vous suffit de créer l'arborescence du projet toutatice-portail-cms-nuxeo-web, menant au répertoire document, dans votre projet custom:

Créer, dans votre répertoire document une jsp (qui est notre template d'affichage) suivant la règle de nommage

view-xxx.jsp

où xxx est le type Nuxeo du document dont on souhaite afficher les données; dans notre cas, nous créerons la jsp:

view-article.jsp

Accès aux propriétés du contenu

Le document Nuxeo est accessible au sein de cette jsp de la façon suivante:

<% Document doc = (Document) renderRequest.getAttribute("doc"); %>

les propriétés pouvant être accédées grâce à l'API du client Nuxeo:

<% String data = doc.getString("schema","property"); %>

pour une propriété "simple": schema est le schéma définissant la propriété property. Dans notre cas, nous pourrions avoir:

<% String resumeData = doc.getString("article","resume"); %>

pour récupérer la propriété resume définie dans le schéma article du document Article. Pour une propriété de type Liste, la méthode à utiliser est:

<% PropertyMap mapData = doc.getProperties().getMap("schema:property"); %>

Il peut être très utile d'utiliser aussi au sein du template le NuxeoController qu'on peut récupérer de la façon suivante:

<% NuxeoController ctx = (NuxeoController) renderRequest.getAttribute("ctx"); %>

En effet, ce dernier offre un ensemble de méthodes de génération de liens vers des documents ou des resources; en outre, la classe Formater offre des méthodes utilitaires de formatage des données.

<%@page import="fr.toutatice.portail.cms.nuxeo.api.NuxeoController"%>

<%@page import="fr.toutatice.portail.cms.nuxeo.portlets.bridge.Formater"%>
Attention: ne pas oublier, au sein de la jsp, d'importer les classes utilisées;par exemple, pour celles citées:

Branchement du template

Il vous faut ensuite copier dans le répertoire document le fichier view-dispatch.jsp que vous allez pouvoir sucharger. Le rôle de ce dernier est de permettre l'inclusion, dans le fichier view.jsp rendu par la portlet ViewDocumentPortlet, le template que nous venons de définir. view-dispatch.jsp contient par défaut le code suivant:

<% 	
	if("annonce".equals(doc.getType().toLowerCase()) 
           || ( "note".equals(doc.getType().toLowerCase()) ) 
           || ( "file".equals(doc.getType().toLowerCase()) ) 
           || ( "contextuallink".equals(doc.getType().toLowerCase()) ) ){
	String jspName = "view-"+ doc.getType().toLowerCase() + ".jsp";
%>
		<jsp:include page="<%= jspName %>"></jsp:include>

<% } else { %>	
			
		<jsp:include page="view-default.jsp"></jsp:include>
		
<% } %>

Pour permettre l'inclusion du template view-article.jsp, il suffit simplement de compléter la condition avec:

|| ("article".equals(doc.getType().toLowerCase()))

Template de liste

Il est possible, grâce à la portlet ViewListPortlet (du projet toutatice-portail-cms-nuxeo-web), d'afficher un ensemble de documents obtenus par une requête de type NXQL. On peut alors vouloir définir un template d'affichage particulier pour chaque item de la liste. Ceci est possible grâce à la notion de template de liste.

Pour le mettre en place, deux points d'intégration sont suffisants: un au niveau des fichiers jsp, et un au niveau du code java.

Point d'intégration Java

Tout d'abord, définissez la structure Java suivante au sein de votre projet "custom", les nommages devant être strictement respectés:

La classe CMSCustomizer doit hériter de DefaultCMSCustomizer pour surcharger ou enrichir les "comportements" par défaut:

public class CMSCustomizer extends DefaultCMSCustomizer {
	
	public CMSCustomizer(PortletContext ctx) {
		super( ctx);
	
	}

}
Schémas

Il nous faut ensuite renseigner les schémas dont nous aurons besoin dans notre template pour afficher les propriétés voulues. Nous utiliserons toujours le schéma système dublincore (qui permet d'avoir accès au créateur du document, à la date de modification, etc) ainsi que le schéma common; dans notre exemple, nous pouvons ajouter le schéma article afin d'accéder aux propriétés du document Article, en supposant que des documents de ce type peuvent être présents dans la liste retournée par la requête NXQL. La déclaration se fait à l'aide d'une constante nommée arbitrairement et de type String; dans notre cas, elle pourrait être:

public static final String ARTICLE_SCHEMAS =  "dublincore, common, article";
"Enregistrement" du template

Il nous faut également définir un identifiant du template d'affichage que nous allons utiliser; ce ci se fait à nouveau par le biais d'une constante nommée arbitrairement et de type String; elle pourrait être:

public static final String STYLE_ARTICLE = "article";

Nous devons désormais définir une méthode getListTemplates() qui va nous permetre d'"enregistrer" et de récupérer les templates définis; elle sera de la forme, dans notre cas:

public static List<ListTemplate> getListTemplates() {

	List<ListTemplate> templates = DefaultCMSCustomizer.getListTemplates();		
	templates.add( new ListTemplate(STYLE_ARTICLE, "Article", ARTICLE_SCHEMAS));
        return templates;

}

Après avoir récupérer les templates par défaut (ceux de touttatice-portail-cms-nuxeo-web), l'objet ListeTemplate permet de stocker notre définition avec pour argument l'identifiant, un libellé (celui qui apparait dans la popup d'administration de la portlet ViewListPortlet - cf utilisation du template) et les schémas à récupérer.

Point d'intégration "JSP"

Tout comme pour un template de contenu, nous pouvons définir un fichier jsp à placer dans le répertoire liste de l'arborescence suivante que vous devez construire dans votre projet "custom":

Il suffit alors simplement de créer un fichier jsp avec la convention de nommage:

view-xxx.jsp

xxx est l'identifiant (ou clé) défini auparavant; dans notre exemple, nous aurons:

view-article.jsp

L'accès au document (item de la liste), à ses propriétés et aux méthodes "utilitaires" se fait de la même façon que pour le template de contenu.

Utilisation du template

La barre de configuration d'une portlet Liste se présente sous la forme suivante:

Lorsque vous y accédez, cliquez sur l'icône

Une poup s'ouvre alors où vous pouvez sélectionner votre template avec la ComboBox suivante (c'est le libellé défini auparavant qui apparaît; dans l'exemple ci-dessous, le libellé est "Actualité" correspondant à un template défini pour les documents de type Actualité):

public static final String COMPLET_SCHEMAS =  "dublincore, common, note, actualite, article";
Le point de vue adopté dans la présentation des templates de liste ici peut peut-être faire penser que pour un type de document, on définit un template de liste spécifique à celui-ci, la requête NXQL ne devant retourner que des documents de ce type; ce point de vue est possible si la requête restreint explicitement les types de documents retournés; on parle alors effectivement de template spécifique; cependant, il est souvent d'usage de ne pas restreindre les types (requête sur les éléments d'un dossier pouvant contenir des documents de types différents); on peut alors tout à fait définir un template "transverse" par la définition d'un ensemble de schémas couvrant tous les cas possibles; par exemple, si le dossier peut contenir des documents de type Note, Actualite et Article, une définition possible est: