繁体   English   中英

Zend Framework:如果验证失败并保留表单字段,则发布到其他操作,然后返回到原始操作

[英]Zend Framework: Post to different action then return to original action if fails validation AND keep form fields

这听起来很奇怪,但是我在一页上有两种形式。 一个只是回发自己。 我发表了第二篇文章,以使代码更简洁。 也许不是正确的选择...

我现在遇到的问题是,如果第二个表单未通过验证,我将重定向回带有该表单的页面,但是我不知道如何用用户输入的原始信息来填写表单字段。 有没有办法做到这一点,并继续发布到两个单独的动作,还是我只需要硬着头皮把两个表格都发布回相同的动作并处理混乱的逻辑?

我将两种形式都提交给同一动作。 真的不应该对此太乱。 在每个表单中都包含一个隐藏字段,以指示要提交的表单。

Application_Form_Login:

 /* other form elements */
 $this->addElement('hidden', 'login', array(
      'value' => 1
 ));

Application_Form_Register:

 /* other form elements */
 $this->addElement('hidden', 'register', array(
      'value' => 1
 ));

控制器:

$loginForm = new Application_Form_Login();
$registerForm = new Application_Form_Register();

if($this->_request->isPost()) {
     if($this->_request->getPost('login')) {
         if($loginForm->isValid($this->_request->getPost())) {
             // validated, redirect
             $this->_helper->redirector('profile', 'user');
         }
     }
     if($this->_request->getPost('register')) {
         if($registerForm->isValid($this->_request->getPost())) {
             // validated, proceed as needed
         }
     }
}

$this->view->loginForm = $loginForm;
$this->view->registerForm = $registerForm;

视图:

echo $this->loginForm;

echo $this->registerForm;

使用这种类型的设置,如果您的任何一个表单isValid()验证,则isValid()将保留已输入的所有数据,并且您仍然会在成功验证其中一个或两个表单时进行重定向。

就个人而言,我认为每个表格都应该像您一样张贴到其自己的控制器上。 这样可以将用于处理该表单的代码放在一个地方。 这里的问题是,您想返回验证失败的原始页面。 但为什么? 为什么不像在页面上只有一个表单那样简单地在目标控制器中重新显示表单呢?

例如,考虑一个登录表单出现在sie的每个页面上(可能是因为它出现在站点模板/布局中)。 它发布到AuthController::loginAction()类的东西。 如果登录失败,则通常不会将他发送回他来自的页面。 您将他留在登录页面上,并使用您希望的形式从$_POST预填写该表单(可能是用户名,而不是他的密码)。

有关类似的讨论,请参见此答案

更新 :对此有另一种想法。 如果您真的想在两个不同的控制器中处理该过程,以使他停留在他发布表单的页面上,则至少将该表单处理提取到一个动作助手中 这样,您至少可以保留该表单处理DRY

更新 :Rob Allen刚刚写了一篇很棒的博客文章“布局中的表单” ,其中描述了一种方法,该方法将动作帮助器与用于实例化和处理表单的preDispatch()方法结合使用。 非常好。

您如何重定向? 如果您再次显示表单页面,我看不到问题。 您可以使用Zend_Form :: populate()预填充表单。

好吧,我只是将两个表单都放在同一页上提交。

我不明白为什么您的代码应该不那么可读。 了解如何使用动作助手,您的控制器将突然变得极其简单易读:

public function indexAction() 
{
    $request = $this->getRequest();

    // send forms to view, so we can print them
    // but also so we can access them in action helpers
    $this->view->form = $this->_getForm('Form1', '/');
    $this->view->form2 = $this->_getForm('Form2', '/');

    if ($request->isPost())
    {
        // process the first form
        if (isset($_POST['form_submit_button']) && $this->view->form->isValid($_POST))
        {
            $this->_helper->form($this->view->form->getValues());
        }
        // process the second form
        else if (isset($_POST['form2_submit_button']) && $this->view->form2->isValid($_POST))
        {
            $this->_helper->form2($this->view->form2->getValues());
        }
}

每个表单的处理将有其自己的动作帮助器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM