2011-05-15 26 views
1

我试图用“相同”的验证,验证两个密码是否在我的登记表相同,但它一直试图验证与实际的话,我该令牌进入,而不是表单元素,我想验证。代码如下所示:(这是我的表单模型构造..)在窗体使用Zend_Validate_Identical验证

$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)); 

而不是验证对所谓的“密码”的形式元素,它不停地尝试去匹配实际字符串“密码”

的我的工作是在数据发布到控制器之后创建一个验证器,并根据发布数据进行验证,但是如果有更多的模块化方法可以做到这一点(也就是在表单构造器中留下逻辑),我会爱知道。

谢谢您提前

+0

检查:http://stackoverflow.com/questions/347856/zend-form-how-to-check-2-fields-are-identical – Marcin 2011-05-15 23:28:27

+0

这个例子没有按不为我工作。我试图将验证器放置在表单模型中,但它一直试图与“实际字符串”比较,而不是链接的标记进行比较。我可能做错了什么? – 2011-05-17 03:27:44

+0

iirc唯一可以通过这个方法的方法是在检查isPost()是否为真后,在控制器中创建验证器。用这种方法你可以将令牌设置为第一个密码的值 – Ascherer 2011-05-19 14:24:49

回答

1

您是否正确输出您的表单?

我看到你正在使用的装饰是ViewScript所以我猜你是编码格式的HTML自己在其他一些脚本。

如果是这样,你是否按照Zend的方式分配名称和ID值到你的元素?如果你不是,当你将值传递给你的表单时,上下文可能没有正确设置,并且它不会找到你需要检查的'password'元素。

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

+0

这可能会起作用。我会检查并稍后回来..thx的提示 – 2011-05-30 03:56:58

+0

任何运气比较你的输出与zend的? – 2011-05-31 01:35:26

1

将相同的验证器添加到您的'password2'元素后。

尝试过量isValid()的函数到表单对象是这样的:



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

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