Validation conditionnnelle sous Jsf 1.2

La mise en place d'une validation avec jsf est assez simple. La plupart des composants permettent la gestion de l'attribut required ou l'intégration d'un <f:validator/> pour les cas plus complexes.

Cependant, si dans la majorité des cas on souhaite que la validation s'applique à la soumission du formulaire, la complexité d'une application amène parfois un même formulaire à comporter plusieurs actions de soumissions qui ne nécessitent pas toutes le même niveau de validation.

Dans un des projets sur lequel je travail, je me suis confronté au cas d'un formulaire contenant des informations de paiements. Ce formulaire assez complexe peut-être saisie en plusieurs fois. L'utilisateur a donc à sa disposition un bouton permettant d'enregistrer les informations saisies et un autre servant de signature numérique attestant que les valeurs saisies sont bonnes et peuvent être transmises à la comptabilité. Dans cet exemple nous souhaitons que la validation des données ne s'applique que lors de l'attestation.

Pour répondre à cette problématique, il faut pouvoir déterminer comment informer à l'exécution du submit les différents attributs required et autre validators de s'activer ou non.
La réponse se trouve dans les paramètres de soumission. En effet lors du submit, le formulaire http retourné au serveur contient entre autre dans sa map de paramètres l'identifiant du bouton à l'origine de l'action. Cette map est accessible via la variable EL 'param'. Il nous suffit donc alors de jouer avec ce paramètre pour appliquer ou non la validation.

Voici un petit exemple d'application :

<h:form id="beanForm">
 <h:inputText id="value1-fld" value="#{bean.value1}" required="not empty param['beanForm:valid-btn']"/>
 <h:inputText id="value2-fld" value="#{bean.value2}">
   <f:validator validatorId="customValidator"  disabled="empty param['beanForm:valid-btn']" />
 </h:inputText>
 <h:commandButton id="save-btn" value="Enregistrer" action="save" />
 <h:commandButton id="valid-btn" value="Valider" action="validAndSave" />
</h:form>

2 commentaires

  1. Bonjour,

    Merci pour ce post très intéressant 🙂 Je suis effectivement confronté à ce problème.

    Malheureusement JSF ajoute de nombreux préfixes devant l’id de mon élément, par exemple « j_id5:j_id42:saveButton » où saveButton est l’id de mon élément.

    Comment s’en sortir ? Une idée ?

    Merci

  2. Bonjour,

    Les ids de prefixes sont générés automatiquement par JSF mais ne bloquent pas l’identification des champs. Comme indiqué dans l’exemple si le bouton du form spécifie le couple ‘beanForm:buttonId’, la correspondance se fait automatiquement.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *