Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Zend validate identical sur deux champs password


Sujet :

Zend_Form PHP

  1. #1
    Membre régulier
    Zend validate identical sur deux champs password
    Bonjour à tous,

    Vu le nombre de sujets que j'ai trouvé concernant ce validator, je commence à me demander si il est bien codé.... Ou alors c'est moi qui ne comprend pas cette class...

    Comme indiqué dans le titre du sujet, je recherche à valider 2 champs password. J'ai essayé plein de sources différentes mais en vain >.>

    La création du formulaire s'effectue dans l'un de mes controllers, la déclaration des champs se fait dans une class et différents paramètres comme le label ou les décorateurs intervient dans le fichier .phtml correspondant.
    Voici mes codes :
    Controller :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $form = new Core_Form_CreateUser();
    $form->setAction('')
     	->setMethod('post')
     	->setAttrib('id', 'createUser');
    $this->view->form = $form;


    Class des champs :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $passwordIdentical = new Zend_Validate_Identical($password1);
    $passwordIdentical->setMessage('form_createUser_validator_password_identical');
     
    $password1 = $this->addElement(new Zend_Form_Element_Password('password1'))->getElement('password1')
     			->setRequired(true)
     			->setDescription('*')
     			->addFilters($filters)
     			->addValidator($notEmpty, true)
     			->addValidator($lenghtPassword, true);
     
    $password2 = $this->addElement(new Zend_Form_Element_Password('password2'))->getElement('password2')
     			->setRequired(true)
     			->setDescription('*')
     			->addFilters($filters)
     			->addValidator($notEmpty, true)
     			->addValidator($passwordIdentical, false)
     			->addValidator($lenghtPassword, true);


    A chaque validation de mon form, même avec des valeurs simples comme 123456789, le formulaire émet une erreur.

    Ceci est le dernier code que j'ai testé :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $password1 = $this->createElement('password', 'password1');
     		$password1->setLabel('Mot de passe')
    	 		  ->addFilter('StripTags')
    	 		  ->addFilter('StringTrim');
     		$this->addElement($password1);
     
     		$password2 = $this->createElement('password', 'password2');
     		$password2->setLabel('Confirmer mot de passe')
    	 		  ->addFilter('StripTags')
    	 		  ->addFilter('StringTrim')
    	 		  ->setRequired(true)
    	 		  ->addValidator('identical', true, array('token' => 'password1'));
     		$this->addElement($password2);


    Le hic, c'est le paramètre token passé à addValidator sur $password2, devrait correspondre au champ $password1, mais lors de la validation, il prend pour valeur de comparaison le string 'password1'. Si par exemple, je met $password1 dans la paramètre token, il va faire la comparaison avec l'objet $password1 soit tout un ensemble de balise html + label + input.

    Donc pourrait on me dire ce qu'il cloche ? Surtout que le second code a été pris sur ce forum et il est apparemment fonctionnel. Mais ce n'est pas le cas chez moi. Origine du dernier code : http://www.developpez.net/forums/d11...ication-passe/

    Merci d'avance

  2. #2
    Expert éminent
    Bonjour,

    Comme tu ne connais pas à l'avance le mot de passe qui va être saisi, tu ne peux pas spécifier lors de l'initialisation du formulaire la valeur du token. Tu ne peux le faire qu'au dernier moment, juste avant d'appeler la méthode isValid() de ton formulaire.

    Ca devrait donner dans ton contrôleur un code de ce genre :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $form = new Core_Form_CreateUser();
    if ($this->getRequest()->isPost()) {
      $form->getElement('password2')->getValidator('identical')->setToken($this->getRequest()->getParam('password1'));
      if ($form->isValid($_POST)) {
         ...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre régulier
    Ok merci c'est ce qu'il me semble avoir vu sur d'autres posts

    Mais il me semblait avoir lu aussi, que l'on pouvait indiquer sur quel champs porte la comparaison, donc dans ce sens pas besoin de savoir la valeur du token. Ca aurait été plus utile ainsi.

  4. #4
    Expert éminent
    Citation Envoyé par kcin Voir le message
    Mais il me semblait avoir lu aussi, que l'on pouvait indiquer sur quel champs porte la comparaison, donc dans ce sens pas besoin de savoir la valeur du token.
    Effectivement, j'ai répondu un peu trop rapidement, ce cas est prévu dans le contexte de validation d'un formulaire (le contexte est passé à la méthode isValid() de l'élément, et en cascade à tous ses validateurs). Donc, ça ne marchera que si tu appelles la méthode isValid() de ton formulaire.

    Ce ne serait pas tout simplement un problème d'initialisation des paramètres ?
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    $password2->addValidator('identical', true, array('password1'));
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre régulier
    Si je me souviens bien de ce que j'avais fais avant de tout modifié... J'avais également testé cette façon, mais là encore en tant que token, çà prenait un tableau de chaîne de caractères à comparer et non pas un tableau avec les noms des champs à comparer.

    N'étant pas sûr, je referais ce test avec cette façon, je te tiens au courant

  6. #6
    Membre régulier
    Je viens de refaire le test suivant :

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    $password2->addValidator('identical', true, array('password1'))


    Quand je valide avec les champs pwd avec les même données, il me sort une erreur :
    The token 'password1' does not match the given token '******'
    Donc, j'en déduis qu'il prend password1 en tant que token et non pas nom de champ...

  7. #7
    Membre régulier
    Finalement, j'ai pas utilisé le validate Identical, je fais ma comparaison manuellement.

###raw>template_hook.ano_emploi###