2011-05-15 25 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