JaliosXperience
Path > Home > Forums > French Forum
Link

Forum JCMS francophone > Modification de gabarits par un module

Thomas Basaran

Post November 20, 2008 11:23 AM

Modification de gabarits par un module

Bonjour,

Je cherche à développer un module dont le but est de modifier l'affichage des champs wysiwyg de certains types de contenus. Le paramétrages du module permettrait de saisir les types de contenus ainsi que les catégories au sein desquelles le rendu doit être modifié.

La modification du rendu ne pose pas de problème, mais la version actuelle du module oblige à insérer une ligne au sein des gabarits d'affichage des types de contenus souhaité (la propriété types de contenu du module n'est donc pas utilisé). Je cherche donc à trouver une solution générique permettant de rendre le module opérationnel sans avoir à modifier ces gabarits.

J'ai cherché du côté du doInitCustom.jsp en faisant un test sur le type de la publication contenue dans la request.getAttribute("publication"), mais il se trouve que cette méthode déclenche plusieurs fois mon traitement (plusieurs appel à doInitCustom.jsp avec la même publication en session lors du chargement de la page). De plus, cela oblige à rajouter une target dans le doInitCustom afin de ne pas l'écraser par celui du module, mais ce point là n'est pas trop gênant.

Ma question est donc la suivante, comment puis-je intervenir de façon générique sur les champs wysiwyg d'un ou plusieurs types de contenu non définis à l'avance, sachant qu'il me faudra donc effectuer des tests sur le type de contenu ainsi que sur la catégorisation de la publication (il me semble donc que l'utilisation d'un BasicWysiwygPolicyFilter ne répond pas à mes besoins)?

Olivier Jaquemet

Olivier Jaquemet

Post November 20, 2008 11:39 AM

Re: Modification de gabarits par un module

Bonjour,

Il y a 2 façon d'intervenir sur les champs wysiwyg :

  • A la présentation : via un WysiwygPolicyFilter
  • A l'enregistrement : via un DataController

A la présentation : via un WysiwygPolicyFilter

Avantage :

  • Il est "non intrusif" dans le sens ou il ne modifie pas le contenu de la publication.

Inconvénients :

  • il ne permet pas de connaître la publication et le champ en cours de traitement.
  • il peut être coûteux en terme de performance car appelé à chaque rendu de page, et pour chaque champ wysiwyg, par le tag <jalios:wysiwyg>.

A l'enregistrement : via un DataController

Avantage :

  • Il vous permet d'accéder à la publication et au champs, et d'effectuer des traitements que si nécessaire.
  • Il vous permet de faire le traitement une seul fois et donc d'optimiser les performances

Inconvénients :

  • Il est irréversible, le contenu de la publication est modifié.

Astuce : utilisez les TypeFieldEntry pour accéder dynamiquement aux champs d'une publication.

Thomas Basaran

Post November 20, 2008 2:57 PM

Re: Modification de gabarits par un module

Merci de la réponse rapide. J'avais déjà envisagé ces deux solutions, mais aucune de répond vraiment à la problématique.

Le WysiwygPolicyFilter ne peut être utilisé car il ne fourni pas les informations sur la publication nécessaire au traitement.

Le DataController ne me convient pas plus, car cela reviendrait à modifier le contenu du champ wysiwyg, ce que j'essaie justement d'éviter pour ne pas perturber les contributeurs amené à modifier ce même champs (à moins d'effectuer de nouveau un traitement inverse à l'édition de la publication?).

Actuellement, j'interviens juste après le doInitPage.jsp appelé dans les gabarits d'affichage fullDisplay afin de créer un nouveau contenu, copie de la publication contenue dans la session. C'est sur cette copie que je travaille afin de modifier les liens contenus dans les champs wysiwyg.

Bien entendu, le clone n'est pas enregistré dans le store et les boutons d'édition apparaissant dans le fullDisplay ont alors déjà été générés à partir du contenu original (donc avec les champ wysiwyg non modifié), ce qui évite de répercuter les changement du clone lors d'une édition.

Pour être donc plus précis dans ma question, je recherche en fait un endroit où insérer mon traitement qui récupère la publication courante stockée dans la session, la clone, modifie le clone et la remplace au sein de la session.

N'y aurait-il pas de targets (ou autre méthode évitant d'éditer tous les gabarits concernés) qui m'auraient échappés me permettant d'insérer une jsp de traitement entre l'appel à doInitPage.jsp et le gabarit d'affichage fullDisplay d'une publication consultée?

Olivier Jaquemet

Olivier Jaquemet

Post November 20, 2008 3:13 PM

Re: Modification de gabarits par un module

Si vous ne souhaitez faire le traitement que pour la seule publication affichée dans le full display, la solution suivante est envisageable :

  • ne pas faire de clone (coûteux en cpu et en mémoire, avec effet de bord possible)
  • utiliser un WysiwygPolicyFilter dans lequel vous ne faites le traitement que si vous êtes dans la portlet selection,

Grosso modo :

  public String beforeRendering(String text, Locale userLocale) {
    JcmsJspContext ctxt = (JcmsJspContext) channel.getCurrentJcmsContext();
    boolean isInPortletSelection = ctxt != null && Util.toBoolean(ctxt.getRequest().getParameter("isInPortletSelection"), false);
    if (!isInPortletSelection) {
      return text;
    }
    Publication pub = ctxt.getPublication();
    if (pub !match conditions) {
      return text;
    }
    String modifiedText = modifyText(text);
    return modifiedText ;
  }
Login   Home   fr en
JALIOS SA - SIREN 440 126 035