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

时间:2010-10-06 21:04:19

标签: zend-framework validation zend-form autofill

这可能听起来像一个奇怪的场景,但我在一个页面上有两个表格。一个是回归自己。我将第二篇文章发布到另一个动作以保持代码清洁。也许不是正确的选择...

我现在遇到的问题是,如果第二个表单没有验证,我会重定向回到带有表单的页面,但我不知道如何保持我的表单字段填写用户的原始信息进入。有没有办法做到这一点,并继续发布到两个单独的行动,或者我是否需要咬住子弹并让两个表格回到相同的行动并处理凌乱的逻辑?

4 个答案:

答案 0 :(得分:3)

我会将两个表单提交给同一个操作。真的不应该有任何太乱的东西。在每个表单中都包含一个隐藏字段,表示正在提交的表单。

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()将保留已输入的任何数据,您仍然会重定向成功验证其中一个或两个表单。

答案 1 :(得分:1)

就我个人而言,我认为每个表单都应发布到自己的控制器上。这使得处理表单的代码保存在一个地方。这里的问题是您希望在验证失败时返回原始页面。但为什么?为什么不简单地重新显示目标控制器中的表单,就像在页面上有单个表单一样?

例如,考虑一个出现在sie的每个页面上的登录表单(可能是因为它在站点模板/布局中)。它发布到类似AuthController::loginAction()的内容。如果登录失败,那么您通常不会将他发回到他来的页面。您将他留在登录页面,表单已根据您的预期从$_POST预先填写(可能是用户名,但不是他的密码)。

有关类似的讨论,请参阅this answer

更新:还有另一个想法。如果你真的想要处理两个不同控制器中的处理,以便让他保持在他发布表单的页面上,至少将表单处理提取到action helper。这样,您至少可以保留表单处理DRY

更新:Rob Allen刚刚写了一篇很棒的博文"A form in your layout",其中描述了一种方法,该方法使用动作助手和preDispatch()方法来实例化和处理表格。很好。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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());
        }
}

每个表单的处理都有自己的操作助手。