如何以zend格式验证密码字段?

时间:2009-10-27 03:21:57

标签: zend-framework zend-form

在我的表单中,我试图验证用户两次都填写相同的值(以确保他们没有犯错)。我认为这是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 个答案:

答案 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;
}
}

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

答案 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)验证器选项 如您所见,可以传递字段名称而不是检索值。