Password Confirmation in zend framework

12,745

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.

Share:
12,745
3ehrang
Author by

3ehrang

Web developer using PHP, Laravel and Vue. I enjoy bringing ideas to life

Updated on June 11, 2022

Comments

  • 3ehrang
    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
    3ehrang about 14 years
    Thanks Marcel for you useful and short replay
  • 3ehrang
    3ehrang about 14 years
    and if you have some experience in partialloop please inform me.
  • 3ehrang
    3ehrang over 9 years
    I didn't override zend_form is valid method I just add my own validator.