Je dois valider deux champs d'entrée utilisateur l'un par rapport à l'autre dans la couture. Field1 doit être supérieur à Field2 pour chaque ligne d'une balise ui: repeat. A partir de maintenant, j'ai les deux champs enveloppés dans un tag s: decorate qui enveloppe toutes les entrées dans une balise s: validateAll. Cela me permet de faire flotter un message d'erreur à droite des champs si la validation échoue pour l'un d'entre eux.Comment invalider un champ en couture?
Par exemple (je ne peux pas insérer une image, donc je dois utiliser l'image ascii, pardonner s'il vous plaît de faible qualité, l'italique indique le texte en rouge):
Label: | Jaune | 0 |% Rouge: | 0% | | Le jaune et le rouge doivent être compris entre 0 et 100 et le jaune doit être supérieur au rouge.
Label: | Jaune | 0 |% Rouge: | 0% | | Le jaune et le rouge doivent être compris entre 0 et 100 et le jaune doit être supérieur au rouge.
Les deux contrôles et le décor xhtml sont ci-dessous. NOTE: La validation "valeur comprise entre 0 et 100" est déjà prise en compte via l'annotation d'hibernation. Je dois seulement besoin de savoir comment valider ces 2 champs les uns contre les autres pour s'assurer que le jaune est plus grand que le rouge, et que le message d'erreur s'affiche toujours.
Ma solution désirée serait de définir la propriété # {invalid} pour la balise s: decorate correspondante, ainsi le message d'erreur apparaîtra, mais je prendrai des idées.
Les entrées:
<table>
<ui:repeat value="#{action.List}" var="var">
<s:decorate template="/layout/decorateMultipleInputs.xhtml" >
<ui:define name="label">
Label:
</ui:define>
<ui:define name="input">
<h:panelGrid columns="8" frame="border">
<h:outputText value="Yellow:" />
<h:inputText value="#{var.yellow}" style="width:25px; text-align:right" maxlength="3"/>
%
<h:outputText value="Red:" />
<h:inputText value="#{var.red}" style="width:25px; text-align:right" maxlength="3"/>
%
</h:panelGrid>
</ui:define>
<ui:define name="message">Yellow and Red must be between 0 and 100, and Yellow must be greater than Red.
</ui:define>
</s:decorate>
</ui:repeat>
</table>
et decorateMultipleInputs.xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:s="http://jboss.com/products/seam/taglib">
<tr>
<td>
<s:label styleClass="#{invalid?'error':''}">
<ui:insert name="label"/>
<s:span styleClass="required" rendered="#{required}">*</s:span>
</s:label>
</td>
<td>
<s:validateAll>
<ui:insert name="input"/>
</s:validateAll>
</td>
<td>
<s:div styleClass="error" rendered="#{invalid}">
<h:graphicImage value="/images/error.gif" />
</s:div>
</td>
<td>
<s:div styleClass="error" rendered="#{invalid}">
<ui:insert name="message"/>
</s:div>
</td>
</tr>
</ui:composition>
Excellente idée, je vais essayer, merci! –
Cela fonctionne très bien! C'est comme si on passait par le parent pour arriver aux commandes de la fratrie, mais cela fonctionne assez simplement pour être utile. Merci encore! –
Soyez juste conscient du couplage étroit entre le balisage et le validateur. Si la marque change, cela peut casser le validateur. :) – Drew