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

时间:2015-02-16 15:56:57

标签: 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->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');


    }


}



  }

第一次调用Edit动作时,构建并显示表单。 用户填写表单并发送它(调用updateUserDetailsAction)。 在updateUserDetailsAction中,在验证失败时,我将表单标记为有错误,并希望显示包含我之前在updateUserDetailsAction类中设置的错误消息的表单。

然后我重定向: $ this-> _helper->重定向器('edit','user-details');

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

在$ this-> _helper->重定向器('edit','user-details');表格重新显示 作为一个清除错误的新表格但我需要它们显示。

我这样做的方法是否正确?

问候 汤姆

1 个答案:

答案 0 :(得分:0)

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

editActionupdateUserDetailsAction合并为一种方法:

...
$formUser = new Form();
// populate the form from the model
if ($this->getRequest()->isPost()) {
    if ($formUser->isValid($this->getRequest()->getPost())) {
        // update the model
    }
}
...

并将表单提交给编辑操作。这将简化您的代码并删除代码重复。

如果您只想修复代码,可以在控制器的init()方法中实例化表单对象,将其设置为控制器的属性。这将使您在重定向后重用相同的实例。我仍然认为上面的解决方案对于其他人来说更紧凑,更容易理解。