JaliosXperience
fr en
Path > Home > Forums > French Forum
Link

Demande d'explication sur le fonction des gabarits sous Jcms 6

Nicolas Donato - on 3/23/10 at 4:18 PM

Bonjour,

je recherche une solution concernant un développement sur une portlet query foreach.

Le développement spécifique consiste à appeler le gabarit des résultats par son nom (qui est déclaration via l'attribut name dans la balise template). Ce nom est référencé via une variable de la portlet query foreach (ajout d'un champ texte correspondant au nom du gabarit des résultats).

Ainsi, pour rechercher le gabarit des résultats à afficher, j'utilise la fonction :

String template = channel.getTypeEntry(itPub.getClass()).getQueryTemplateFile(nomGabarit);

ou

String template = channel.getTypeEntry(itPub.getClass()).getDisplayTemplateFile(nomGabarit); 

Je récupère donc dans la variable "template" le chemin du template à appliquer pour les résultats et donc j'inclus la jsp qui m'est indiquée par le chemin.

Or dans la javadoc, je ne vois aucune méthode me permettant de récupérer le template correspondant au nom du gabarit.

Je m'attendais à avoir une méthode de ce type :

String template = channel.getTypeEntry(itPub.getClass()).getTemplateFile(nomGabarit, nomUsage);
dont nomUsage correspond à "full" ou "query"

Or je ne trouve aucune méthode pouvant m'aider sur ce point.

J'ai bien tenter d'utiliser la méthode :

String template = itPub.getTemplatePath("query", true);

mais rien ne s'affiche dans ma portlet query foreach.

Existe-t-il un moyen me permettant de rechercher un template en fonction d'un usage et d'un nom de gabarit ?

Je vous remercie pour les réponses que vous pourrez m'apporter.

Cordialement

Jean-Phillipe Encausse - on 3/26/10 at 3:47 PM

Bonjour,

La méthode itPub.getTemplatePath("query", true); retourne le chemin du gabarit choisit pour cette instance de publication avec l'usage "query".

Exemple:

  • MonArticle > usage: query > doArticleQueryDisplay.jsp

Si aucun gabarit n'a été précisé pour cette instance la méthode retourne le gabarit par défaut. (Déterminé de différentes manières)

La méthode channel.getTypeEntry(itPub.getClass()).getTemplateFile(nomGabarit, nomUsage) n'existe pas. Il faut faire:

  channel.getTypeEntry(itPub.getClass()).getTemplateEntry(fullname).getPath()

Note technique: Le paramètre fullname correspond à la String usage+"."+name.

Sachant que vous travaillez sur tous les type (en faisant getTypeEntry(itPub.getClass())). Il est important de déclarer dans chacun des type un gabarit avec le nom recherché.

Exemple:

  • Article > name: test1> path: doTest1ArticleQueryTemplate.jsp > usage: Query
  • Article > name: test2> path: doTest2ArticleQueryTemplate.jsp > usage: Query
  • SmallNews > name: tes1t > path: doTest1SmallNewsQueryTemplate.jsp > usage: Query

Ce qui veux dire: 10 Types x 5 affichages = 50 Gabarits !


Nous venons d'évoquer la solution, mais quelle est le problème en amont que vous essayez de résoudre ?

Si l'objectif est de dire:

  • J'ai une Portlet Query/Foreach
  • Je précise sur cette instance que je souhaite avoir un affichage "Test1" et sur une autre instance un affichage "Test2"

Alors la solution est peut-être plus simple:

Solution 1: Créer des gabarits d'affichage de PortletQuery/Foreach ou de PortletQuery/ForeachDetails

  • Dans ces gabarits faire un look commun à tous vos types
    • Titre, Catégories, Abstract, Photo sont des champs communs des Publications
  • Si quelques champs divergent encore.
    • Vous pouvez faire hériter vos types d'un Type abstrait commun
    • Ou faire des If () dans la JSP

C'est ce qui est fait par la PortletQuery/ForeachDetails qui propose des looks commun à tous les types au lieu d'inclure le gabarit d'affichage de chaque type. Le gros avantage est d'avoir un affichage homogène quelque soit ne nombre de types. 5 affichages = 5 gabarits de PortletQueryForeachDetails.

Solution 2: Créer des usages test1, test2, ...

Dans le gabarit de la PortletQuery/Foreach préciser que vous travaillez sur l'usage test1, test2, ...

<%@ include file='/jcore/doInitPage.jsp' %>
<%@ include file='/jcore/portal/doPortletParams.jsp' %>
<% 
  PortletQueryForeach box = (PortletQueryForeach) portlet;
  jcmsContext.setTemplateUsage("test1");  
%>
<%@ include file='doQuery.jsp' %>
<%@ include file='doSort.jsp' %>
<%@ include file='doForeachHeader.jsp' %>
		<jsp:include page='<%= "/"+itPub.getTemplatePath(jcmsContext) %>' flush='true' />
<%@ include file='doForeachFooter.jsp' %>
<%@ include file='doPager.jsp' %>

Et pour chaque type déclarer un gabarit pour cet usage:

<?xml version="1.0" encoding="UTF-8"?>
<templates version="5.0">
  <template name="custom" usage="test1" file="doArticleTest1Display.jsp">
    <label xml:lang="en">Test1 template</label>
    <label xml:lang="fr">Gabarit custom</label>
  </template>
  <template name="custom" usage="test2" file="doArticleTest2Display.jsp">
    <label xml:lang="en">Test2 template</label>
    <label xml:lang="fr">Gabarit custom</label>
  </template>
  <template name="default" usage="full" file="doArticleFullDisplay.jsp">
    <label xml:lang="en">Default template</label>
    <label xml:lang="fr">Gabarit par defaut</label>
    <description xml:lang="en">The default template for this publication</description>
    <description xml:lang="fr">Le gabarit par defaut pour cette publication</description>
  </template>
</templates>

Vous faites ensuite votre look dans doArticleTest1Display.jsp, doArticleTest2Display.jsp, doSmallnewsTest1Display.jsp, ...

Conclusion

La solution 1 est la plus adaptée si vos types divergent peu. J'imagine que c'est le cas étant donné que vous souhaitez présenter tous les résultats dans une même boite.

Le name d'un gabarit est une information technique. Vous souhaitez utiliser un gabarit en fonction du contexte (un paramètre de la PQF) dans ce cas "l'usage" est plus adapté (en liste, résultat de recherche, ...) et c'est dans ce sens que l'API a été pensée.

Nicolas Donato - on 3/26/10 at 4:17 PM

Bonjour,

je vous remercie pour cette explication.

Je comprends mieux l'utilisation des usages pour les gabarits.

La solution 2 est une manière d'arriver à la fin de mon développement.

Le problème c'est que le développement spécifique existait déjà sur une version 5.7 et utilisait directement le nom des gabarits.

Si j'avais dans mon plugin.xml :

<templates type="typeContenu">
  <queryTemplate name="custom1" file="monCustomQuery1.jsp">
    <label></label>
  </queryTemplate>
  <queryTemplate name="custom2" file="monCustomQuery2.jsp">
    <label></label>
  </queryTemplate>
</templates>

Ma portlet QueryForeach prenait en compte sois "custom1" sois "custom2" et je recherchais le template par un :

channel.getTypeEntry(itPub.getClass()).getQueryTemplateFile(nomGabarit)

Le problème c'est que je me voyais mal modifier toutes les données qui existaient dans le store (plusieurs portlets QueryForeach se trouvant dans le store). La méthode que vous m'avez indiquée :

channel.getTypeEntry(itPub.getClass()).getTemplateEntry(fullname).getPath()

me convient parfaitement.

Encore merci.

Login   Home   fr en
JALIOS SA - SIREN 440 126 035