Back

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.

 

Next
Comments
Add Comment
Salah El Younoussi
On peut declarer un hint global et puis le reutiliser sur les model. Sa fonctionne tel une variable global ce qui facilitera la maintenance.
exemple:
en declare une hint-collection directe sous <model-hints> =>
<hint-collection name="smallCode">
<hint name="max-length">30</hint>
</hint-collection>
puis on l'utilise depuis nos models:
<field name="code" type="String" >
<hint-collection name="smallCode" />
</field>

pour recuperer la valeur depuis le service, c'est de la mm facon :
int codeMaxLength = ModelHintsUtil.getMaxLength(nomDuModel.class.getName(), "code");
_log.debug("SE smalCode l:"+codeMaxLength);
Posted on 8/22/16 2:29 PM.