2009-11-07 115 views
2

我沒有註冊與Zend形式Zend的表單添加錯誤消息

$password = new Zend_Form_Element_Password('password'); 
$password->setLabel($this->_translate->_("Password:")) 
    ->setRequired(true) 
    ->addValidator('stringLength', true, array(4, 32)); 

$confirmPassword = new Zend_Form_Element_Password('confirmpassword'); 
$confirmPassword->setLabel($this->_translate->_("Confirm Password:")) 
         ->setRequired(true); 

我控制密碼和confirmpassword在控制器形成英寸如果密碼和confirmpassword不匹配,則在confirmpassword文本框下添加錯誤消息。我怎樣做?

回答

2

這個概念基本上歸結爲將Zend_Validate_Identical驗證程序添加到'confirmpassword'字段,使用$this->_request->getParam('password')中的數據進行測試。我在一個擴展的Zend_Form上使用了一個自定義方法來處理來自我所有表單的發佈數據,這對您來說並不是一個確切的解決方案,但是也許我的「EditUser」表單中的代碼可以指向正確的方向。

從控制器:

// $form is a MW_Form_EditUser. 

if ($this->_request->isPost() && $form->process($this->_request->getPost())) 
{ 
    // successful form - redirect or whatever here 
} 

MW_Form_EditUser類:

public function process(array $data) 
{ 
// gets a copy of the user we are editing 
$user = $this->getEditable(); 
// checks to see if the user we are editing is ourself 
$isSelf = ($user->id == MW_Auth::getInstance()->getUser()->id); 

// if the new_pass field is non-empty, add validators for confirmation of password 
if (!empty($data['new_pass'])) 
{ 
    $this->new_pass2->setAllowEmpty(false)->addValidator(
     new Zend_Validate_Identical($data['new_pass']) 
    ); 
    if ($curpass = $this->current_password) $curpass->setAllowEmpty(false); 
} 

if ($this->delete && !empty($data["delete"])) { 
    $this->delete->setValue(true); 
    $user->delete(); 
    return true; 
} 

if ($this->isValid($data)) 
{ 
    /// saves the data to the user 
    $user->email = $this->email->getValue(); 
    $user->name = $this->name->getValue(); 
    if ($password = $this->new_pass->getValue()) $user->password = $password; 
    if (!$isSelf) 
    { 
    if ($this->super->getValue()) { 
     $user->setGroups(array(MW_Auth_Group_Super::getInstance())); 
    } else { 
     $user->setGroups(array(MW_Auth_Group_User::getInstance()));    
    }      
    } 
    $user->save(); 
    return true; 
} 
return false; 
} 
+2

我認爲,最好不要是混亂:命名功能的isValid(),在其中創建Zend_Validate_Identical,就回到父母:: isValid()的。此解決方案更自然,需要更少的代碼 – 2009-11-08 16:47:40

-1

使用Zend_Validate_Identical是由Zend公司爲你一個很好的解決方案。我會給你另一個選擇。 jQuery的。當你使用Zend_Validate_Identical表單時,會去服務器,服務器會驗證它。如果密碼不同,它會返回一條錯誤信息。如果你使用jQuery,表單將不會去服務器,除非密碼相同。

+4

您必須具有服務器端驗證,而客戶端驗證非常好。沒有服務器端的客戶端是沒用的。 – smack0007 2009-11-08 18:27:10

5

覆蓋的isValid表單中的

/** 
    * Validate the form, check passwords. 
    * 
    * @param array $data 
    * @return boolean 
    */ 
    public function isValid($data) { 
     $valid = parent::isValid($data); 
     if ($this->getValue('password') !== $this->getValue('password2')) { 
      $valid = false; 
      $this->password2->addError('Passwords don\'t match.'); 
     } 

     return $valid; 
    } 
1
//inside form 

public function isValidPSW($data) { 
     $valid = parent::isValid($data); 
     if ($data['pswd'] !== $data['pswd2']) { 
      $valid = false; 
      $this->pswd->addError('Passwords don\'t match.'); 
     } 
     return $valid; 
    }