Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Pour réaliser l'enregistrement d'un usager je demande comme toujours un mot de passe ainsi qu'une confirmation. Je voudrai creer un validateur qui vérifierai l'égalité des 2 mots de passes. Pour créer le formulaire j'utilise une classe etendue de Zend_Form où je crée l'élément mot de passe
$password = new Zend_Form_Element_Password('password'); $password->setLabel('Mot de passe') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty');
Je veux maintenant récupérer la valeur stockée dans le champ mot de passe pour pouvoir l'utiliser directement dans l'élément suivant en créant d'abord une instance de mon validateur qui vérifiera l'égalité entre mot de passe et mot de passe bis. Le problème c'est que je n'y arrive pas j'ai essayé de faire $this->getValue('password') mais ce n'est pas ça apparement. Il doit bien exister un moyen je pense. Je vous met le code complet de la classe pour mieux m'expliquer.
<?php class AccountForm extends Zend_Form { public function __construct($options = null) { parent::__construct($options); $this->setName('account'); $username = new Zend_Form_Element_Text('username'); $username->setLabel('Nom d\'utilisateur') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $password = new Zend_Form_Element_Password('password'); $password->setLabel('Mot de passe') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $same_password_validator = new ValidSamePassword($this->getValue('password')); $password_bis = new Zend_Form_Element_Password('password_bis'); $password_bis->setLabel('Retapez le mot de passe') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty') ->addValidator($same_password_validator); $mailValidator = new Zend_Validate_EmailAddress(); $mailValidator->setMessages( array( Zend_Validate_EmailAddress::INVALID => 'Adresse mail invalide', Zend_Validate_EmailAddress::INVALID_HOSTNAME => 'Adresse mail invalide', Zend_Validate_EmailAddress::INVALID_MX_RECORD => 'Adresse mail invalide', Zend_Validate_EmailAddress::DOT_ATOM => 'Adresse mail invalide', Zend_Validate_EmailAddress::QUOTED_STRING => 'Adresse mail invalide', Zend_Validate_EmailAddress::INVALID_LOCAL_PART => 'Adresse mail invalide', )); $mail = new Zend_Form_Element_Text('mail'); $mail->setLabel('Adresse mail') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty') ->addValidator($mailValidator); $id = new Zend_Form_Element_Hidden('id'); $submit = new Zend_Form_Element_Submit('Valider'); $submit->setAttrib('id', 'submitbutton'); $this->addElements(array($id, $username, $password, $password_bis, $mail, $submit)); } }
Voilà j'éspère avoir été clair, merci pour vos réponses
Hors ligne
Y'a vraiment aucune solution à ça ou ma question est simplement trop evidente pour s'attarder dessus? car là je ne vois vraiment pas alors même si c'est simple ça me bloque vraiment dans mon codage, un petit coup de main s'il vous plait
Hors ligne
Salut,
Wow, à peine 8 heures entre ta demande et ton up!!!
Petite précision, on est en plein milieu des vacances et beaucoup y sont à mon avis donc très loin du PC.
Bon, revenons à nos moutons.
As tu essayé de mettre à la place de :
$same_password_validator = new ValidSamePassword($this->getValue('password'));
ceci:
$same_password_validator = new ValidSamePassword($password);
ou ceci:
$same_password_validator = new ValidSamePassword('password');
Si oui et que ça n'a rien donné, pourrais-tu afficher le code de ta classe?
A+
Hors ligne
Merci pour ta réponse,
Lorsque je met $password ça retourne le label et le champ du formulaire, et lorsque que je met 'password' ça retourne 'password' forcement
Hors ligne
Salut,
Peux-tu fournir le code que tu as mis dans ta classe 'ValidSamePassword()', s'il te plait?
J'ai une solution qui pourrait te convenir sans avoir recours à une classe Validate custom
$password_bis->addValidator( 'Identical', false, 'password' );
Dernière modification par -=blu3+3y3s=- (04-08-2008 16:39:08)
Hors ligne
Salut,
Oui voilà le code:
<?php require_once 'Zend/Validate/Abstract.php'; class ValidSamePassword extends Zend_Validate_Abstract { /**#@+ * Error codes * @const string */ const NOT_SAME = 'notSame'; protected $_messageTemplates = array( self::NOT_SAME => 'Le mot de passe est different du mot de passe bis', ); /** * Original token against which to validate * @var string */ protected $_password; /** * Sets validator options * * @param string $token * @return void */ public function __construct($password) { $this->_password = $password; } public function isValid($value) { exit($this->_password); $this->_setValue($value); if ($this->_password != $this->_password_bis) { $this->_error(self::NOT_SAME); return false; } return true; } }
Je vais tester ta solution merci
Hors ligne
J'ai remplacé mon code par le suivant:
$password_bis = new Zend_Form_Element_Password('password_bis'); $password_bis->setLabel('Retapez le mot de passe') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); ->addValidator('Identical',false,'password');
Ca me génère l'erreur suivante:
Fatal error: Cannot unset string offsets in /Applications/MAMP/htdocs/guitar-gathering/library/Zend/Form/Element.php on line 991
ça a l'air pas mal ton idée mais ça ne fonctionne pas pour le moment, de plus j'aimerai personnaliser le message donc je pensais plutot faire un new Zend_Validate_Identical('password') mais le problème c'est que de cette manière le validateur va comparer ma valeur avec la chaine 'password' et non pas avec son contenu!
Hors ligne
Salut,
Désolé, j'ai oublié que le 3ème paramêtre devait être un tableau.
Donc ton code doit être celui-ci
$password_bis = new Zend_Form_Element_Password('password_bis'); $password_bis->setLabel('Retapez le mot de passe') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty') ->addValidator('Identical', false, array('password'));
Normalement, tu ne devrais pas avoir d'erreur.
A+
Dernière modification par -=blu3+3y3s=- (04-08-2008 21:38:19)
Hors ligne
Merci je vais essayer!
Hors ligne
Bon en fait ça ne resoud pas mon problème car ça recupere toujours une chaine 'password' et non pas la valeur de password, pourtant je suis certain que ça doit etre facile à faire mais par quoi! J'ai vu sur certains forums qu'on parlait de getParam alors j'ai essayé:
$password_bis = new Zend_Form_Element_Password('password_bis'); $password_bis->setLabel('Retapez le mot de passe') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty') ->addValidator('Identical', false , $this->getParam('password'));
mais rien n'y fait ça ne marche pas, mais vous faites comment vous pour vérifier qu'un mot de passe est identique au second?
Hors ligne
Salut,
Je ne l'ai pas testé donc je suppose selon le code de la fonction.
Essaye ça:
... ->addValidator('Identical', false, array($this->getValue('password'));
A+
Hors ligne
Bonjour,
J'ai eu le même problème, que je viens de résoudre en lisant la doc. Dans ton validateur de mot de passe, utilise en deuxième argument une variable $context nulle par défaut, qui est un tableau possédant l'ensemble des valeurs données dans le formulaire :
public function isValid($value, $context = null) { $value = (string) $value; $this->_setValue($value); if (is_array($context)) { if (isset($context['password_confirm']) && ($value == $context['password_confirm'])) { return true; } } elseif (is_string($context) && ($value == $context)) { return true; } $this->_error(self::NOT_MATCH); return false; }
A+
Hors ligne
Bonjour,
vu que ce post n'est pas résolu. J'ai trouvé une réponse à cette adresse (http://www.zfforums.com/zend-framework- … g-706.html) qui est très simple :
$password_confirm = new Zend_Form_Element_Password('password_confirm'); $password_confirm->setLabel('Confirmez le mot de passe ') ->setRequired(true) ->addValidator(new Zend_Validate_Identical($_POST['password']));
Dans cette solution, il suffit simplement de passer en paramètre au validateur du champ "mot de passe à confirmer" la valeur du champ saisie dans le champ 'mot de passe'.
A+
Hors ligne
Je remonte le sujet,
Dans la version actuelle, on peut faire référence à un champ par une chaine, y compris dans une class étendant Zend_Form :
...
->addValidator(new Zend_Validate_Identical('password'));
'password' faisant référence à :
new Zend_Form_Element_Password('password');
Regards
Dernière modification par nk34 (12-09-2011 15:46:19)
Hors ligne
A mon tour de remonter ce sujet.
Personne aurait un code qui fonctionne ?
Cà fait 2 heures que je tourne en rond.
J'ai dû essayer plein de sources différentes, et à chaque fois, rien ne fonctionne...
$emailIdentical = new Zend_Validate_Identical(); $emailIdentical->setToken('email1') ->setMessage('form_createUser_validator_email_identical'); $email1 = $this->addElement(new Zend_Form_Element_Text('email1'))->getElement('email1') ->setLabel('email1'); $email2 = $this->addElement(new Zend_Form_Element_Text('email2'))->getElement('email2') ->setLabel('email2') ->addValidator('Identical', true, array($this->getValue('email1'), 'test test')) //->addValidator($emailIdentical) ; // dernier code testé $email2 = $this->addElement('text', 'email2', array( 'label' => 'email2', 'validators' => array( array('identical', false, array('token' => 'email1')) ) ));
Voici le code que j'utilise actuellement.
A votre bon coeur
Merci d'avance.
Dernière modification par NicoC (12-11-2012 22:48:13)
Hors ligne
Dans ton validateur de mot de passe, utilise en deuxième argument.
________________________________
diablo 3 gold,d3 gold
Hors ligne
Pages: 1