Подтверждение пароля в Zend Framework - PullRequest
5 голосов
/ 06 марта 2010

Я добавляю этот класс в библиотеку / 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;
    }
}
?>

тогда я создаю два поля в моей форме, как это:

       $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)

все хорошо, но когда я отправляю форму всегда, я получаю сообщение «Подтверждение пароля не совпадает»? Что не так в моем коде

Ответы [ 5 ]

18 голосов
/ 24 ноября 2010

Вам не нужно переопределять метод Zend_Form-> isValid или использовать суперглобальный $ _POST, проверьте это:

$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'));
8 голосов
/ 17 марта 2010

Менее элегантный и простой способ сделать это:

    $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);
3 голосов
/ 09 марта 2010

Есть лучший способ сделать это. В вашей форме поместите идентичный валидатор в поле подтверждения пароля, а затем просто перезапишите метод $ form-> isValid (), чтобы установить проверяемое значение:

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);
}
2 голосов
/ 06 марта 2010

Сделать валидатор многоразовым.Не жестко кодируйте имя поля в валидаторе.Посмотрите на этот IdenticalField Validator , который является более универсальным.

2 голосов
/ 06 марта 2010

Я думаю, вы можете захотеть $context['user_password'], так как это имя вашего "первого" элемента пароля

...