这听起来可能有点奇怪,但我在一页上有两个表格。一个只是发回给自己。我在另一个动作中发布了第二个帖子,以保持代码更清洁。也许不是正确的选择...
我现在遇到的问题是,如果第二个表单没有验证,我会重定向回带有表单的页面,但我不知道如何让表单字段填写用户输入的原始信息。有没有办法做到这一点并继续发布到两个单独的操作,或者我是否需要硬着头皮让两个表单都发布回相同的操作并处理混乱的逻辑?
这听起来可能有点奇怪,但我在一页上有两个表格。一个只是发回给自己。我在另一个动作中发布了第二个帖子,以保持代码更清洁。也许不是正确的选择...
我现在遇到的问题是,如果第二个表单没有验证,我会重定向回带有表单的页面,但我不知道如何让表单字段填写用户输入的原始信息。有没有办法做到这一点并继续发布到两个单独的操作,或者我是否需要硬着头皮让两个表单都发布回相同的操作并处理混乱的逻辑?
我会将两种形式都提交给相同的操作。真的不应该有什么太乱的东西。在每个表单中都包含一个隐藏字段来表示正在提交哪个表单。
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()
将保留已输入的任何数据,并且您仍然会在成功验证一个或两个表单时重定向。
就个人而言,我认为每个表单都应该像您一样发布到自己的控制器。这将用于处理该表单的代码保存在一个地方。这里的问题是您想在验证失败时返回原始页面。但为什么?为什么不简单地在目标控制器中重新显示表单,就像页面上只有一个表单一样?
例如,考虑一个出现在 sie 的每个页面上的登录表单(可能是因为它在站点模板/布局中)。它发布到类似AuthController::loginAction()
. 如果登录失败,那么您通常不会将他送回他来自的页面。您将他留在登录页面,并按照您的意愿预先填写表单$_POST
(可能是用户名,但不是他的密码)。
有关类似讨论,请参见此答案。
更新:对此有另一个想法。如果您真的想在两个不同的控制器中处理处理以使他保持在他发布表单的页面上,至少将该表单处理提取到action helper中。这样,您至少可以保持表单处理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());
}
}
每个表单的处理都有自己的动作助手。