Как проверить поле пароля в форме 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?)
)
));
Нужно ли это на обоих элементах? Что я помещаю в массив?
7 ответов
В связи с этим, в сравнение с версией 1.10.5 была добавлена поддержка сравнения двух идентичных полей формы в модели. Я написал краткое руководство по этому вопросу, доступ к которому можно получить по ссылке ниже, но суть в том, что валидатор Zend_Validate_Identical был подвергнут рефакторингу для принятия имени поля формы в качестве входных данных. Например, чтобы сравнить значения полей формы pswd и verify_pswd, вы присоедините валидатор к verify_pswd следующим образом:
$confirmPswd->addValidator('Identical', false, array('token' => 'pswd'));
Работает как шарм.
Посмотрите Проверку Идентичных Паролей с Zend Framework для более полного примера.
Я не могу проверить это в данный момент, но я думаю, что это может сработать:
$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'))
)
));
Через два дня я нашел правильный ответ, следуй за мной шаг за шагом:
шаг 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);
теперь наслаждайтесь вашим кодом
$token = Zend_Controller_Front::getInstance()->getRequest()->getPost('password');
$confirmPassword->addValidator(new Zend_Validate_Identical(trim($token)))
->addFilter(new Zend_Filter_StringTrim())
->isRequired();
Используйте приведенный выше код внутри класса, который расширяет zend_form.
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;
}
}
В 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) параметры валидатора. Как вы можете видеть, вместо получения значения можно передать имя поля.
Я смог заставить его работать со следующим кодом:
В своей форме я добавляю Идентичный валидатор только на второй элемент:
$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'));
Я не знаю, есть ли более элегантный способ сделать это без добавления этого кода в контроллер. Дайте мне знать, если есть лучший способ сделать это.