【问题标题】:ZEND: Displaying form error messages on failed validationZEND:在验证失败时显示表单错误消息
【发布时间】:2015-04-17 04:44:11
【问题描述】:

我有一个表格说:

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');表格重新显示 作为已清除错误的新表单,但我需要显示它们。

我这样做是否正确?

问候 汤姆

【问题讨论】:

    标签: forms validation zend-framework


    【解决方案1】:

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

    editActionupdateUserDetailsAction 组合成一种方法:

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

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

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

    【讨论】:

    • 除了结合这两种方法,没有其他“优雅”的方法了吗?我是 ZEND 的新手,想使用最佳实践。那应该如何显示验证错误?我想过,但不确定。
    • 我已经更新了答案:我认为这是一个更紧凑的解决方案,一个地方的代码更少。
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2019-06-11
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多