Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour
J'essaie de vérifier la longueur du contenu d'un champ avec StringLength mais ça ne fonctionne pas.
$nb_adultes = new Zend_Form_Element_Text('nb_adultes'); $nb_adultes->addValidator('StringLength', true, array('min' => 1)); $nb_adultes->addValidator('Int'); $nb_adultes->setLabel('Nombre d\'adultes');
visiblement il ne tient pas compte du parmètre min. En revanche, si je donne un paramètre max, il le respect (mais toujours pas le min)
Hors ligne
Je pense que tu devrais créer ton validator comme ceci :
$validator = new Zend_Validate_StringLength($min, $max); $validator->setMessage("La chaîne '%value%' n'est pas au format attendue", Zend_Validate_StringLength::NOT_TOO_SHORT); $nb_adultes->addValidator($validator);
Ou sinon, essaie :
array('stringLength', false, array(6, 20))
Dernière modification par whitespirit (30-04-2008 14:45:18)
Hors ligne
Je crois que j'ai compris. La validation ne se fait pas si le champ est laissé vide. Il faudrait donc utiliser setRequired . Mais cela me pose un autre problème je veux que le contenu du champ soit un entier. Mais je veux aussi obliger l'utilisateur à entrer une valeur, même si celle-ci est 0. Or, en utilisant setRequired, 0 serait considéré comme non valide. Comment faire ?
Hors ligne
normalement, si tu fais :
$nb_adultes->addValidator($validator) ->addValidator('Digits', true, array('messages' => 'Le champs doit être composé uniquement de chiffre (sans espace).')) ->setRequired(true)
tu devrais t'en sortir
Dernière modification par whitespirit (30-04-2008 14:44:42)
Hors ligne
parfait, merci
Hors ligne
En fait non, il reste un petit problème : si mon champ contient 0, c'est considéré comme vide par le required. Comment faire pour que 0 soit valide ?
Hors ligne
Il faudrait utiliser le 'allowEmpty'=false je pense.
Hors ligne
non, justement pas. C'est tout le contraire de ce que je veux.
Voici mon but :
J'ai deux champs (nb_adultes et nb_enfants) qui doivent permettre à l'utilisateur d'indiquer un nombre de personnes.
Supposons qu'il indique 2 dans le champ nb_adulte et laisse le champ nb_enfant vide. Dans ce cas-là je n'ai aucun moyen de savoir si son intention était vraiment d'indiquer zéro enfant ou s'il a simplement oublier de remplir le champ.
C'est pourquoi je voudrais que les conditions suivante soit respectées :
- le champ ne peut être vide (d'où le setRequired)
- le champ ne peut contenir que des nombre entier (validateur Digits)
- mais que 0 soit considéré comme valide.
Y-a-t-il un moyen de faire cela ?
Hors ligne
Créer un validateur avec une expression régulière comme par exemple :
->addValidator(new Zend_Validate_Regex('/^[0-9]*/'),true, array('NOT_MATCH'=>'Erreur'))
Je te dis comme par exemple car j'écris rarement des expressions régulières et à chaque fois je dois réapprendre comment ça marche Si tu n'as pas d'idée, fait un tour sur le siteduzero.fr y'a un article bien fait (comme la plupart de leurs articles d'ailleurs) et assez simple à mettre en oeuvre.
Hors ligne
et si tu remplace tout ca par :
1 filter 'Digit'
1 validateur 'NotEmpty'
logiquement, le 0 devrait passer ?
Hors ligne
J'ai essayé. Le problème maintenant c'est que avec NotEmpty, la valeur 0 est considérée comme vide
Hors ligne
et si à la place du NotEmpty, tu met un stringLenght(1)
(arf, ca reviens à ce que tu faisais au début ... )
Et si tu fait un GreaterThan(-1) à la place du notEmpty ?
La derniere solution reste à faire ton validateur perso, juste en comparant si la valeur est supérieure ou égale à 0 ...
Hors ligne
ça ne va pas. GreaterThan considère un champ vide comme 0 (donc correct).
Je pense que je vais faire mon propre validateur
Hors ligne
Bonjour,
étant donné que la validation porte sur un nombre, pourquoi ne pas utiliser le validateur between ?
Hors ligne
Effectivement, ca te prendra 5min ^^
Hors ligne
julz a écrit:
Bonjour,
étant donné que la validation porte sur un nombre, pourquoi ne pas utiliser le validateur between ?
Parce qu'avec tous ces validateurs une chaîne vide == 0, et est donc considérée comme correcte. Alors que je veux que l'utilisateur entre la valeur 0 dans ces cas-là et ne laisse pas le champ vide. Et l'ajout d'un required ou quelque chose comme ça ne change rien puisque pour eux c'est 0 qui est considéré comme vide.
stf a écrit:
Effectivement, ca te prendra 5min ^^
J'ai donc fait ceci :
class MZ_Validate_Int extends Zend_Validate_Int { const NOT_INT = 'notInt'; const IS_EMPTY = 'isEmpty'; protected $_messageTemplates = array( self::NOT_INT => "'%value%' does not appear to be an integer", self::IS_EMPTY => "Value is empty, but a non-empty value is required" ); public function isValid($value) { if(strlen(trim($value)) == 0) { $this->_error(MZ_Validate_Int::IS_EMPTY); return false; } return parent::isValid($value); } }
Hors ligne
En effet, dans ce cas essaie cela
$nb_adultes = new Zend_Form_Element_Text('nb_adultes'); $nb_adultes->addValidator('Between', true, array('min'=>0, 'max'=> 100, true)) ->addFilter('Int');
- le 3eme parametre indique que 0 et 100 sont compris
- filter int type la valeur en entier pour accepter la comparaison
Hors ligne
Sinon, le test $var === 0 n'acceptera que 0, et pas "null"
Peut-être même $var === '0' ?
Au pire utilise un to_string....
Je balance des idées comme ça, j'ai rien testé !
Dernière modification par Bast (10-06-2008 11:04:46)
Hors ligne
le but c'était de le faire avec un validateur je crois
Hors ligne
Rien n'empêche de le créer par extension
Hors ligne
Pages: 1