J'ai pa pu retrouver le code que j'avais utiliser quand j'avais fait ca
mais je me souviens a peu près de la methode utilisé.
Ma solution ne sera pas top non plus :p vu qu'avec les validators on ne peut de base valider une liste de champs créés dynamiquement.
Par contre je viens de penser à une solution qui devrait marcher et qui utiliserai au mieux les avantages des validators.
- definir pour chaque champs input
<html:text property="dt_naiss(x)" styleId="dt_naiss0"/>
ou x est iteratif 0,1....
Si tu n'as pas un autre champs dans ton formulaire : creer un
<html:hidden property="champsPourValidator"/>
Tu peux par exemple mettre le nombre de champs de ta liste dt_naiss dedans.
Dans le validation.xml :
1 2 3 4 5 6 7 8 9
| <field property="champsPourValidator" depends="verifDate">
<var>
<var-name> datepatternStrict</var-name>
<var-value>dd/MM/yyyy</var-value>
</var>
<var>
<var-name> nomChampsDate</var-name>
<var-value>dt_naiss</var-value>
</var> |
validator-rules.xml :
Bien mettre le validator date pour que la balise <html:javascript> mette le code de la js validateDate.js contenu dans le jar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <validator name="verifDate"
classname="fr.edition.eni.validator.verifDate"
method="verifDate"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.verif.date"
jsFunctionName="VerifDate"
jsFunction="fr.edition.eni.validator.js.verifDate"/>
<validator name="date"
classname="org.apache.struts.validator.FieldChecks"
method="validateDate"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.date"
jsFunctionName="DateValidations"/> |
Dans ta jsp
Il faudrait que tu genere toi meme la fonction que génére Struts automatiquement qui contient les infos necessaire pour chaque validtors avec ube balise logic:iterate ou mieux si tu utilise les EL avec c:foreach
1 2 3 4 5 6 7 8 9 10 11
| <script>
function nomFormulaire_DateValidations () {
<c:forEach var="entry" begin="0" end="${nombredeChampsDate}" varStatus="status">
this.a${status.count} = new Array("dt_naiss${status.count}", <bean:message key="errors.verif.date"/>, new Function ("varName", "this.datePatternStrict='dd/MM/yyyy'; return this[varName];"));
</c:forEach>
}
</script> |
Pour que ca genere
1 2 3 4 5 6 7 8 9
|
function nomFormulaire_DateValidations () {
this.a0 = new Array("dt_naiss0", "La date de la demande n'a pas été entrée correctement (jj/mm/aaaa)", new Function ("varName", "this.datePatternStrict='dd/MM/yyyy'; return this[varName];"));
this.a1 = new Array("dt_naiss1", "La date de la demande n'a pas été entrée correctement (jj/mm/aaaa)", new Function ("varName", "this.datePatternStrict='dd/MM/yyyy'; return this[varName];"));
.
.
.
.
} |
Dans ta js : fr.edition.eni.validator.js.verifDate.js tu fais appel à la fonction javascript de validation de date struts.
1 2 3 4 5 6 7 8 9 10 11 12 13
|
function verifDate(form) {
var bValid = true;
var i = 0;
var fields = new Array();
var oValide = eval ("new "+ jcv_retrieveFormName(form) + "_VerifDate()"); // va recuperer le tableau de parametres que struts à générer automatiquement
validateDate(form); // appel la fct de validator
return bValid;
} |
par contre je pense que tu va avoir une fenetre javascript a chaque date erroné
donc il faudrait que tu modifie :
- soit la js validateDate.js de struts de tel facon de lui faire renvoyer un boolean et le tester dans verifDate.js
- soit creer un autre validateUtils.js ( à declarer dans validation.xml ) et tu modifie la fonction jcv_handleErrors pour qu'elle ne cree pa d'alert mai plutot un affichage du message dans une div par un innerHTML ( Ce ki est qd meme bcp plus classe que cette povre alert javascript
)
C'est tres brouillon desole mais j pas le temps aujourd hui de faire mieux :p (trop de boulot
)
Partager