在我的表单中,我试图验证用户两次都填写相同的值(以确保他们没有犯错)。我认为这是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?)
)
));
我是否需要两个元素?我在阵列中放了什么?
答案 0 :(得分:28)
为了它的价值,在1.10.5版本中添加了对模型中两个相同表单字段进行比较的支持。我写了一个关于此事的简短教程,您可以通过以下链接访问该教程,但底线是Zend_Validate_Identical验证器已经重构以接受表单字段名称作为输入。例如,要比较表单字段pswd和confirm_pswd的值,您可以将验证器附加到confirm_pswd,如下所示:
$confirmPswd->addValidator('Identical', false, array('token' => 'pswd'));
像魅力一样。
有关更完整的示例,请参阅Validating Identical Passwords with the Zend Framework。
答案 1 :(得分:5)
我现在无法测试它,但我认为这可能有效:
$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'))
)
));
答案 2 :(得分:2)
两天后,我找到了正确的答案,一步一步跟着我:
第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);
现在享受您的代码
答案 3 :(得分:1)
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;
}
}
答案 4 :(得分:1)
$token = Zend_Controller_Front::getInstance()->getRequest()->getPost('password');
$confirmPassword->addValidator(new Zend_Validate_Identical(trim($token)))
->addFilter(new Zend_Filter_StringTrim())
->isRequired();
在扩展zend_form的类中使用上面的代码。
答案 5 :(得分:0)
我能够使用以下代码:
在我的表单中,我只在第二个元素上添加了相同的验证器:
$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'));
我不知道是否有更优雅的方法可以做到这一点,而无需将此代码添加到控制器。如果有更好的方法可以告诉我。
答案 6 :(得分:0)
使用 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
元素的validators数组中注意到Identical
验证器作为数组传递,该数组的语义为: i)验证器名称,ii)失败时断链,iii)验证器选项
如您所见,可以传递字段名称而不是检索值。