Forms ZEND:在验证失败时显示表单错误消息

Forms ZEND:在验证失败时显示表单错误消息,forms,validation,zend-framework,Forms,Validation,Zend Framework,我有一张表格,上面写着: class Application_Form_UserDetails extends Zend_Form { public function init() { $pswd = new Zend_Form_Element_Password('password'); $pswd->setLabel('New password:'); $pswd->setAttrib('size', 25); $pswd->setRequ

我有一张表格,上面写着:

class Application_Form_UserDetails extends Zend_Form
{

public function init()
{

    $pswd = new Zend_Form_Element_Password('password');
    $pswd->setLabel('New password:');
    $pswd->setAttrib('size', 25);
    $pswd->setRequired(false);
    $pswd->addValidator('StringLength', false, array(4,15));
    $pswd->addErrorMessage('Wron password');
}
}
在我的用户详细信息控制器类中,我有:

  class UserDetailsController extends Zend_Controller_Action {



public function editAction()
{

    $userId = $this->userInfo->id;

    $DbTableUsers = new Application_Model_DbTable_User;

    $obj = $DbTableUsers->getUserDetails($userId);

    $this->view->formUser = new $this->_UserDetails_form_class;
    $this->view->formCompany = new $this->_CompanyDetails_form_class;

    if ($obj) {

        $this->view->formUser->populate($obj);
    }

    $url = $this->view->url(array('action' => 'update-user-details'));
    $this->view->formUser->setAction($url);

    }







public function updateUserDetailsAction()
{


    $formUser = new $this->_UserDetails_form_class;


    if ($formUser->isValid($this->getRequest()->getPost())) {



    }
    else {
       //validation failed

        $formUser->markAsError();

        $this->view->formUser = $formUser;
        $this->_helper->redirector('edit', 'user-details');


    }


}



  }
第一次编辑操作称为生成和显示的表单。 用户填写表单并发送它updateUserDetailsAction被调用。 在updateUserDetailsAction中,在验证失败时,我将表单标记为有错误,并希望使用我以前在updateUserDetailsAction类中设置的错误消息显示表单

然后我重定向: $this->_helper->redirector'edit','user details'

以显示相同的表单,但有错误,以便用户重新输入正确的值。 问题是我不知道如何让编辑操作知道表单必须显示验证错误

在$this->_helper->redirector'edit','user details';形式被重新显示 作为一个新的形式与清除错误,但我需要他们显示

我这样做对吗

问候
Tom

问题源于这样一个事实,即您正在重定向,并且在每个方法中您都在创建表单的新实例,这意味着表单类正在丢失其状态—您从请求中注入的数据以及传递给此对象的任何其他值

将editAction和updateUserDetailsAction组合到一个方法中:

...
$formUser = new Form();
// populate the form from the model
if ($this->getRequest()->isPost()) {
    if ($formUser->isValid($this->getRequest()->getPost())) {
        // update the model
    }
}
...
并将表单提交到编辑操作。这将简化代码并消除代码重复


如果您只是想修复代码,您可以在控制器的init方法中将form对象实例化为将其设置为控制器的属性。这将使您在重定向后重用同一实例。我仍然认为上面的解决方案更简洁,也更容易被其他人理解。

除了结合这两种方法之外,没有其他优雅的方法了吗?我是ZEND的新手,希望使用最佳实践。这就是显示验证错误的方法吗?我想到了,但不确定。我更新了答案:我认为这是一个更紧凑的解决方案,更少的代码集中在一个地方。