2012-01-23 19 views
2

私はupdatePasswordActionを実装していて、無効な現在のパスワードでエラーを表示していません。私はZend_Validateクラスでこれを実装して、指定されたレコード - >パスワードで使用することができませんでしたので、私はコントローラアクションで今すぐ検証しましたが、失敗した場合はエラーメッセージをフォーム要素に追加します。これは私が$form->isValidを実行する直前です。いずれにせよ、その働き。検証が失敗すると、その要素にエラーメッセージを表示しません。どんな助けでも大歓迎です。Zend_FormがaddErrorを呼び出す際にエラーメッセージを表示しない

はFYI:私は空白の現在のパスワードを送信すると、それはその後、無効であるとフォーム自体が発生しない要素にエラーを追加する検証

class Admin_Form_UserPassword extends Katana_Form 
{ 
    public function init() 
    { 
    $element = $this->createElement('hidden', 'id'); 
    $this->addElement($element); 

    $element = $this->createElement('password','password'); 
    $element->setLabel('Current Password:'); 
    $element->setRequired(true);   
    $this->addElement($element); 

    $element = $this->createElement('password','new_password');  
    $element->setLabel('New Password:'); 
    $element->addValidator('StringLength', false, array(6,24));  
    $element->setRequired(true); 
    $element->addValidator('NotEmpty');  
    $this->addElement($element); 

    $element = $this->createElement('password','new_password_confirm'); 
    $element->setLabel('Confirm:'); 
    $element->addValidator('StringLength', false, array(6,24)); 
    $element->addValidator('IdenticalField', false, array('new_password', 'Confirm Password')); 
    $element->setRequired(true); 
    $this->addElement($element); 

    $this->addElement('submit', 'submit', array('label' => 'Submit')); 
} 

}

public function updatePasswordAction() 
{ 
    $resourceModel = new Core_Model_Resource_User();  
    $form   = new Admin_Form_UserPassword(); 
    $form->setMethod(Katana_Form::METHOD_POST); 
    $form->setAction($this->getActionUrl('update-password')); 
    if($this->getRequest()->isPost()){ 
     $id    = $this->getRequest()->getParam('id'); 
     $record   = $resourceModel->find($id)->current(); 
     $currPassword = $record->password; 
     $typedPassword = md5($this->getRequest()->getParam('password'));   
     if($currPassword !== $typedPassword){    
      $form->getElement('password')->addError('Current password is incorrect.'); 
     } 
     if($form->isValid($_POST)){ 
      $data  = $form->getValues(); 
      $result  = $resourceModel->updatePassword($id, $data['new_password']); 
      if($result){ 
       $this->redirectSimple('list'); 
      } 
     } 
    } else { 
     $id  = $this->getRequest()->getParam('id');   
     $recordData = array(
      'id' => $id 
     ); 
     $form->populate($recordData);   
    } 
    $this->getView()->form = $form;  
} 
+0

「働いていない」とはどういう意味ですか?いくつかのエラーはありますか?何も起こりません? – BartekR

+0

無効なcurrentpasswordを送信すると、エラーメッセージが表示されません。 ($ form-> isValid($ _ POST)){ – jkushner

+0

()を実行する直前に、updatePasswordAction内で、私は$ form-> getElement( 'password') - > addError 'Zend_Form_Element :: addError()'は追加の関数であり、それらを取得するには 'Zend_Form :: getErrorMessages()'を使う必要があります。あなたは 'getErrorMessagess()'を使っていますか? – BartekR

答えて

6

を示しています。

私はこれを回避するために使用する少なくとも2つの方法があります:あなたはフォーム要素にエラーを追加するとき

if($currPassword !== $typedPassword){    
    $form->getElement('password')->addError('Current password is incorrect.'); 
    $form->markAsError(); 
} 

// or 

if ($form->isValid($_POST) && 0 == sizeof($form->getMessages()) { 
    // form was valid, and no errors were set on elements 
} 

明確にするためには、そこにその要素に付加された誤りはあるが、Zend_Formの:: isValidはバリデーターのみを実行し、適切なエラーを設定しますが、特定の要素に対してエラーが設定されているかどうかはチェックしません。

ただし、$form->getMessages()を呼び出して、フォームまたはその子要素に添付されているすべてのエラーメッセージを取得できます。これが0でフォームを検証した場合は、エラーがなかったことを意味します。フォームにisValidが渡されたが、要素にエラーが追加された場合は、追加したエラーメッセージが含まれます。

+1

$ form-> markAsError();投稿してくれてありがとう。 +1 – wesside

0

このように動作させました。

コントローラー:

if ($trial->getKind() != 'debt' && $_POST['kind'] == 'debt') 
{ 
    $editForm->getElement('kind')->markAsError(); 
} 

if ($editForm->isValid($_POST)) { ... } 

フォーム:

public function isValid($data) 
{ 
    $valid = parent::isValid($data); 

    if ($this->getElement('kind')->hasErrors()) { 
     $this->getElement('kind')->addError($this->_translate->translate('You can\'t change trial kind to debt.')); 
     $valid = false; 
    } 

    return $valid; 
} 

そしてthis commentが助けてくれました。

関連する問題