angle-left

Blogues

Liferay: utiliser les hints pour contrôler la longueur des champs

Liferay regorge de bonnes suprises, l'une d'entre elles est la gestion des hints. En version 6.2, les équipes de Liferay ont produit une documentation interessante à ce sujet https://dev.liferay.com/develop/tutorials/-/knowledge_base/6-2/customizing-model-entities-with-model-hints. Sauf qu'ils ne mentionent pas tout, du moins, c'est mon point de vue.

Quand on lit l'article, on découvre toutes ces possibilités mais comment les appliquer en pratique? Ici, nous avions un besoin basique: contrôler la longueur des champs. Vous aurez peut-être déjà remarquer qu'avec Liferay, si votre saisie dépasse la longueur autorisée en base, au moment de la persistence, vous aviez un joli crash, l'objectif est donc de l'éviter. La solution qui vient tout de suite à l'esprit est :

  1. J'ajoute un contrôle sur mon champ de saisie avec un validator
  2. Je teste côté service que cette longueur est respectée (au cas où un malin bidouille les contrôles JS)

Mais, si mon champ ne doit pas dépasser 20 caractères, vais-je devoir hardcodé cette valeur sur la JSP + le service? Ce ne serait pas pratique si la valeur change, c'est à ce moment que les hints semblent bienvenus !

Je dispose d'un hint "max-length" sur lequel je veux capitaliser.Dans mon fichier portlet-model-hints.xml, je configure mon champ:

<model name="zango.track.model.Grade">
  <field name="name" type="String">
     <hint name="max-length">75</hint>
  </field>
</model>

Sur ma page JSP, j'utilise les taglib de Liferay pour afficher mon champ

<aui:input name="name" model="<%=Grade.class %>" >
</aui:input>

Ici, mon modèle est une entitée "Grade" telle que définie dans mon service.xml. En déclarant le "model" avec la correspondance du champ "name", je permets au taglib de faire la relation entre le hint "max-lenght" et la boite de saisie que je veux afficher.

A l'affichage du porlet, Liferay va automatiquement implémenter le validator sur la longeur de champ sans avoir besoin d'ajouter quoi que ce soit dans mon code JSP. A ce stade, le besoin côté IHM est adressé et je n'ai pas eu besoin de spécifier la longueur maximale (75) dans mon JSP.

Côté service, je veux faire le même contrôle. En effet, cela permet d'adresser le cas où un utilisateur malveillant voudrait tester la robustesse de mon application et bidouiller les JavaScript sur l'IHM. Cela permet aussi d'adresser le cas où mon service serait utilisé via un autre canal comme un service REST ou SOAP. L'implémentation du contrôle est très simple:

int nameMaxLength = ModelHintsUtil.getMaxLength(Grade.class.getName(), "name");
if (Validator.isNotNull(name) && name.length() > nameMaxLength){
   throw new PortalException();
}

Et hop, le tour est joué. Je peux désormais changer la taille maximale de mon champ dans portlet-model-hints.xml sans avoir à changer mes codes ici et là. 

Notez bien que toutes modifications du fichier XML portlet-model-hints.xml nécessite de relancer le service builder.

Plus d'entrées de blog

Internationalisation avec Liferay

L'internationalisation est le besoin de décliner son site/application en plusieurs langues et...

Liferay DXP: l'éditeur amorce le virage technologique et marketing

Liferay DXP a pointé le bout de son nez fin 2015 avec l'ambition de s'adapter aux nouvelles...

Ajouter des commentaires

Blogueurs récents

Eric COQUELIN
Publications: 5
étoiles: 1
Données: 24/05/18