Password Confirmation in zend framework
Solution 1
I think you may want $context['user_password']
as that is the name of your "first" password element
Solution 2
You don't need to override the Zend_Form->isValid method or use the superglobal $_POST, check this:
$frmPassword1=new Zend_Form_Element_Password('password');
$frmPassword1->setLabel('Password')
->setRequired('true')
->addFilter(new Zend_Filter_StringTrim())
->addValidator(new Zend_Validate_NotEmpty());
$frmPassword2=new Zend_Form_Element_Password('confirm_password');
$frmPassword2->setLabel('Confirm password')
->setRequired('true')
->addFilter(new Zend_Filter_StringTrim())
->addValidator(new Zend_Validate_Identical('password'));
Solution 3
A less elegant and simpler way to do it:
$password = new Zend_Form_Element_Password('password');
$password->setLabel('Password:')
->addValidator('StringLength', false, array(6,24))
->setLabel('Choose your password:')
->setRequired(true);
$password2 = new Zend_Form_Element_Password('password-confirm');
$password2->setLabel('Confirm:')
->addValidator('StringLength', false, array(6,24))
->setLabel('Confirm your password:')
->addValidator(new Zend_Validate_Identical($_POST['password']))
->setRequired(true);
Solution 4
There is a bettter way to do that. In your form put the identical validator on the confirmation passoword field, and then just overwrite $form->isValid() method to set the value to be validated:
public function __construct($options = NULL)
{
// ...
$confirm->addValidator('Identical');
// ...
}
public function isValid($data)
{
$confirm = $this->getElement('confirm_password');
$confirm->getValidator('Identical')->setToken($data['password']);
return parent::isValid($data);
}
Solution 5
Make the validator reusable. Do not hard code field name in the validator. Look at this IdenticalField Validator which is more universal.
3ehrang
Web developer using PHP, Laravel and Vue. I enjoy bringing ideas to life
Updated on June 11, 2022Comments
-
3ehrang almost 2 years
I add this class to library/My/Validate/PasswordConfirmation.php
<?php require_once 'Zend/Validate/Abstract.php'; class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract { const NOT_MATCH = 'notMatch'; protected $_messageTemplates = array( self::NOT_MATCH => 'Password confirmation does not match' ); public function isValid($value, $context = null) { $value = (string) $value; $this->_setValue($value); if (is_array($context)) { if (isset($context['password']) && ($value == $context['password'])) { return true; } } elseif (is_string($context) && ($value == $context)) { return true; } $this->_error(self::NOT_MATCH); return false; } } ?>
then I create two field in my form like this :
$userPassword = $this->createElement('password', 'user_password'); $userPassword->setLabel('Password: '); $userPassword->setRequired('true'); $this->addElement($userPassword); //create the form elements user_password repeat $userPasswordRepeat = $this->createElement('password', 'password_confirm'); $userPasswordRepeat->setLabel('Password repeat: '); $userPasswordRepeat->setRequired('true'); $userPasswordRepeat->addPrefixPath('My_Validate','My/Validate','validate'); $userPasswordRepeat->addValidator('PasswordConfirmation'); $this->addElement($userPasswordRepeat)
everything is good but when i submit form always I get the 'Password confirmation does not match' message ? What's Wrong in my code
-
3ehrang about 14 yearsThanks Marcel for you useful and short replay
-
3ehrang about 14 yearsand if you have some experience in partialloop please inform me.
-
3ehrang over 9 yearsI didn't override zend_form is valid method I just add my own validator.