在表单验证中使用Zend_Validate相同

时间:2011-05-15 21:17:25

标签: php zend-framework validation

我正在尝试使用'相同'验证器来验证我的注册表单中的两个密码是否相同,但是它一直在尝试验证我为令牌输入的实际单词而不是我想要的表单元素验证。代码如下所示:(这是我的表单模型构造函数..)

    $password = new Zend_Form_Element_Password('password');
    $password->addValidator('Regex',false,array('pattern' => '/^.*(?=.{6,20})(?=.*[\d])(?=.*[a-zA-Z])/'))
             ->addValidator('StringLength',false,array('max'=>20))
             ->setRequired(true);

    $password2 = new Zend_Form_Element_Password('password2');
    $password2->setRequired(true);
    $password2->addValidator('Identical',false,array('token'=>'password'));       
    $register = new Zend_Form_Element_Submit('register');

    $this->setDecorators(array(
                                array('ViewScript', 
                                       array('viewScript' => '_form_registration.phtml'))  
                              )     
                        );

    $this->addElements(array($firstName,$lastName,$email,$city,$password,$password2,$register));

不是验证名为'password'的表单元素,而是继续尝试匹配实际的字符串'password'

我的工作是在数据发布到控制器后创建验证器,并根据后期数据进行验证,但是如果有更多的模块化方法(AKA将逻辑保留在表单中)建设者)我很想知道。

提前谢谢

3 个答案:

答案 0 :(得分:1)

您是否正确输出了表单?

我看到你正在使用的装饰器是ViewScript所以我猜你自己正在用其他脚本编写表单的html。

如果是这样,您是否遵循Zend方式为您的元素分配名称和ID值?如果不是,当您将值传递给表单时,上下文可能无法正确设置,并且找不到您需要检查的“密码”元素。

我现在的建议是使用表单默认装饰器输出表单,并查看id和名称如何查找元素。然后,尝试在您正在使用的form.phtml中复制这些名称。

答案 1 :(得分:1)

在'password2'元素上添加相同的验证器后。

尝试将isValid()函数重载到Form对象中,如下所示:



    public function isValid ($data)
    {
        $this->getElement('password2')    
             ->getValidator('Identical')
             ->setToken($data['password'])
             ->setMessage('Passwords don\'t match.');
        return parent::isValid($data);
    }

答案 2 :(得分:0)

我一直有同样的问题。 通过使用外部函数重写代码来修复它是相同的。

<?php
class RegisterForm extends Zend_Form
{
    /**
     * create your form
     */
    public function init()
    {
        $this->addElements(array(
            new Zend_Form_Element_Password('password',
                array( 'label' => 'Password:',
                           'required' => true,
                           'filters' => array('StringTrim', 'StripTags'),
                           'validators' => array(array(StringLength', false, array(5, 25)))
                )
            ),
            new Zend_Form_Element_Password('pass_twice',
                array('label' => 'Pass Twice',
                         'required' => true,
                         'filters' => array('StringTrim', 'StripTags'),
                         'validators' => array('Identical')
                )
            )
        );
    }

    public function isValid($data)
    {
        $passTwice = $this->getElement('pass_twice');
        $passTwice->getValidator('Identical')->setToken($data['password']);
        return parent::isValid($data);
    }
}
?>

解决方案来自:http://emanaton.com/node/38