Zend_Form不显示调用addError的错误消息

jku*_*ner 2 zend-framework zend-form

我正在实现updatePasswordAction,它没有显示当前密码无效的错误.我无法使用Zend_Validate类来实现它与提供的记录 - >密码一起使用,所以我现在只在我的控制器操作中验证,如果失败,那么我将错误消息添加到表单元素.这是在我跑步之前$form->isValid.无论如何,它的工作.但是当验证失败时,它不会在元素上显示错误消息.任何帮助将不胜感激.

仅供参考:当我提交空白当前密码时,它会显示验证

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'));
}
Run Code Online (Sandbox Code Playgroud)

}

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;     
}
Run Code Online (Sandbox Code Playgroud)

dre*_*010 6

向元素添加错误不会导致表单本身无效.

我用至少有两种方法来解决这个问题:

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
}
Run Code Online (Sandbox Code Playgroud)

为了澄清,当您将错误添加到ELEMENT表单时,该元素附加了一个错误,但Zend_Form :: isValid只运行验证器并设置适当的错误,它不会检查您是否设置了错误一个特定的元素.

但是,您可以调用$form->getMessages()以获取附加到表单或其子元素的所有错误消息.如果这是0并且您已经验证了表单,则表示没有错误.如果表单已通过,isValid但您向元素添加了错误,则会包含您添加的错误消息.