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
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2005
    Messages : 54
    Points : 108
    Points
    108
    Par défaut 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
    Avatar de GrandFather
    Inscrit en
    mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : mai 2004
    Messages : 4 587
    Points : 7 075
    Points
    7 075
    Par défaut
    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
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2005
    Messages : 54
    Points : 108
    Points
    108
    Par défaut
    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
    Avatar de GrandFather
    Inscrit en
    mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : mai 2004
    Messages : 4 587
    Points : 7 075
    Points
    7 075
    Par défaut
    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
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2005
    Messages : 54
    Points : 108
    Points
    108
    Par défaut
    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
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2005
    Messages : 54
    Points : 108
    Points
    108
    Par défaut
    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
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2005
    Messages : 54
    Points : 108
    Points
    108
    Par défaut
    Finalement, j'ai pas utilisé le validate Identical, je fais ma comparaison manuellement.

Discussions similaires

  1. Zend_Form Validation sur deux champs simultanément
    Par sir_gcc dans le forum Zend_Form
    Réponses: 4
    Dernier message: 06/04/2008, 16h20
  2. Tri sur deux champs en même temps
    Par Azharis dans le forum Access
    Réponses: 8
    Dernier message: 11/01/2006, 14h10
  3. [MYSQL] Problème ORDER BY sur deux champs
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 14/10/2005, 17h46
  4. pb avec select sur deux champs
    Par graphicsxp dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/03/2005, 16h30
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo