Как проверить поле пароля в форме Zend?

В своей форме я пытаюсь убедиться, что пользователь вводит одно и то же значение оба раза (чтобы убедиться, что он не ошибся). Я думаю, что для этого предназначен Zend_Validate_Identical, но я не совсем уверен, как его использовать. Вот что у меня есть:

$this->addElement('password', 'password', array(
        'label'      => 'Password:',
        'required'   => true,
        'validators' => array(
            'Identical' => array(What do I put here?)
        )
    ));
$this->addElement('password', 'verifypassword', array(
        'label'      => 'Verify Password:',
        'required'   => true,
        'validators' => array(
            'Identical' => array(What do I put here?)
        )
    ));

Нужно ли это на обоих элементах? Что мне положить в массив?


person Andrew    schedule 27.10.2009    source источник
comment
Актуальный ответ с использованием Zend_Validate_Identical и другого элемента в качестве «токена»: stackoverflow.com/questions/1628606/   -  person Tim Lytle    schedule 24.09.2010


Ответы (7)


Как бы то ни было, в версии 1.10.5 была добавлена ​​поддержка сравнения двух одинаковых полей формы в модели. Я написал краткое руководство по этому вопросу, к которому вы можете получить доступ по ссылке ниже, но суть в том, что валидатор Zend_Validate_Identical был переработан, чтобы принимать имя поля формы в качестве входных данных. Например, чтобы сравнить значения полей формы pswd и confirm_pswd, вы прикрепите валидатор к confirm_pswd следующим образом:

$confirmPswd->addValidator('Identical', false, array('token' => 'pswd'));

Работает как шарм.

Более полный пример см. в разделе Проверка идентичных паролей с помощью Zend Framework.

person Jason    schedule 06.09.2010
comment
Как я могу использовать это как для добавления, так и для редактирования @ Jason, @ saji89 - person ehp; 21.09.2012
comment
Вы спасаете мой день. Большое спасибо ! - person Dayron Gallardo; 15.11.2012

Я не могу проверить это на данный момент, но я думаю, что это может сработать:

$this->addElement('password', 'password', array(
    'label'      => 'Password:',
    'required'   => true
));
$this->addElement('password', 'verifypassword', array(
    'label'      => 'Verify Password:',
    'required'   => true,
    'validators' => array(
        array('identical', true, array('password'))
    )
));
person bcat    schedule 27.10.2009
comment
Я получаю сообщение об ошибке: Токен «пароль» не соответствует данному токену «testpassword». testpassword — это значение, а пароль — это имя элемента, которое было указано здесь: 'identical', true, array('password') - person Andrew; 27.10.2009
comment
Я собирался сказать, что было странно отображать значение пароля, который я ввел в сообщении об ошибке, но оказалось, что это неправда, потому что я установил тип элемента как текст, а не пароль. - person Andrew; 27.10.2009

Через два дня я нашел правильный ответ, следуя за мной шаг за шагом:

Шаг 1:

создайте файл PasswordConfirmation.php в корневом каталоге вашего проекта с этим путем: yourproject/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['user_password']) 
               && ($value == $context['user_password']))
            {
                return true;
            }
        } 
        elseif (is_string($context) && ($value == $context)) {
            return true;
        }

        $this->_error(self::NOT_MATCH);
        return false;
    }
}
?>

шаг 2:

Добавьте два поля в форму следующим образом:

//create the form elements user_password
$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', 'user_password_confirm');
$userPasswordRepeat->setLabel('Password repeat: ');
$userPasswordRepeat->setRequired('true');
$userPasswordRepeat->addPrefixPath('My_Validate', 'My/Validate', 'validate');
$userPasswordRepeat->addValidator('PasswordConfirmation', true, array('user_password'));
$this->addElement($userPasswordRepeat);

теперь наслаждайтесь своим кодом

person 3ehrang    schedule 05.03.2010
comment
@moinsam, если у меня есть возможность редактирования/обновления вместе с добавлением, какие изменения следует внести? - person ehp; 21.09.2012

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_confirm'])
            && ($value == $context['password_confirm']))
        {
            return true;
        }
    } elseif (is_string($context) && ($value == $context)) {
        return true;
    }

    $this->_error(self::NOT_MATCH);
    return false;
}
}

http://framework.zend.com/manual/en/zend.form.elements.html

person CodeJoust    schedule 27.10.2009

$token = Zend_Controller_Front::getInstance()->getRequest()->getPost('password');
$confirmPassword->addValidator(new Zend_Validate_Identical(trim($token)))
                  ->addFilter(new Zend_Filter_StringTrim())
                  ->isRequired();   

Используйте приведенный выше код внутри класса, который расширяет zend_form.

person Mr Coder    schedule 28.10.2009
comment
мы не можем использовать $password->getValue() ? ну, я уже пробовал, но я получил пустое значение.. почему это так? если getValue является методом этого элемента, то он должен был вернуть значение пароля? - person Ankit Sharma; 05.09.2013
comment
потому что getValue() вызывается до $form-›isValid($_POST); так как этот код находится внутри конструктора или метода инициализации. - person Mr Coder; 05.09.2013

Мне удалось заставить его работать с помощью следующего кода:

В моей форме я добавляю идентичный валидатор только ко второму элементу:

$this->addElement('text', 'email', array(
        'label'      => 'Email address:',
        'required'   => true,
        'filters'    => array('StringTrim'),
        'validators' => array('EmailAddress')
    ));

$this->addElement('text', 'verify_email', array(
        'label'      => 'Verify Email:',
        'required'   => true,
        'filters'    => array('StringTrim'),
        'validators' => array('EmailAddress', 'Identical')
    ));

А в контроллере, непосредственно перед вызовом isValid():

$validator = $form->getElement('verify_email')->getValidator('identical');
$validator->setToken($this->_request->getPost('email'));

Я не знаю, есть ли более элегантный способ сделать это без добавления этого кода в контроллер. Дайте мне знать, если есть лучший способ сделать это.

person Andrew    schedule 27.10.2009

В Zend Framework 1.10 код, необходимый для проверки равенства двух полей с помощью Zend Form и Zend Validate, выглядит следующим образом:

    $form->addElement('PasswordTextBox',
                      'password',
                      array('label'      => 'Password')
                      );

    $form->addElement('PasswordTextBox',
                      'password_confirm',
                      array('label'      => 'Confirm password',
                            'validators' => array(array('Identical', false, 'password')),
                            )
                      );

Вы можете заметить, что в массиве валидаторов элемента password_confirm валидатор Identical передается как массив, семантика этого массива следующая: i) имя валидатора, ii) разрыв цепочки при сбое, iii) параметры валидатора Как видите, вместо извлечения значения можно передать имя поля.

person Community    schedule 28.08.2010