我在一个页面中有10个表单(它们位于标签页中)。
我的控制器功能非常庞大,为了使表单模块化,我计划只在控制器功能中显示表单并对其对应的控制器执行POST。
这10个表单中的一些用于其他页面,因此通过更改操作URL,可以更轻松地在单独的控制器中管理它们。
但是,如果表单无效,我将如何显示表单错误并阻止重置表单?
如果嵌入式控制器可以重定向,我可以实现这一点。我错过了另一种选择吗?
Symfony2必须有理由不允许嵌入式控制器中的重定向,但我想知道为什么。
第三次修改:
实际表格的图片:http://imgur.com/sIx3sgs,tnZkvqM,ZAP950s,hk45oTW#0
这些表单不需要按顺序排列,用户无需创建step1即可创建和保存step6。
第二次修改:
这不是一个多步形式。为方便起见,我将它们命名为Step1
,Step2
等。
修改
这就是我所拥有的:
class DefaultController extends Controller{
public function processAction(){
$request = $this->getRequest();
/*** FORM 1 ****/
$entity = new Step1();
$form1 = $this->createForm(new Step1Type(), $entity);
if ($request->getMethod() == 'POST'){
$form1->bindRequest($request);
if($form1->isValid()){
return $this->redirect($this->generateUrl('some_link'));
}
}
/***/
//Do the same for other forms
return array(
'form1' => $form1->createView()
//[...to form10]
);
}
}
这就是我想要的:(我会用嵌入式控制器来做,但你不能重定向)
class DefaultController extends Controller{
public function processAction(){
$request = $this->getRequest();
/*** FORM 1 ****/
$entity = new Step1();
$form1 = $this->createForm(new Step1Type(), $entity);
//change $form1 action url to point to Step1Controller->createAction()
/***/
//Do the same for other forms
return array(
'form1' => $form1->createView()
//[...to form10]
);
}
}
class Step1Controller extends Controller{
public function createAction(){
$request = $this->getRequest();
$entity = new Step1();
$form = $this->createForm(new Step1Type(), $entity);
$form->bindRequest($request);
if($form->isValid()){
//save entity
return $this->redirect($this->generateUrl($getRedirectLinkFromForm));
}
return $this->redirect($this->generateUrl('some_other_link'));
}
}
答案 0 :(得分:1)
我提出了4个我能想到的解决方案,从最好到最差:
<强> AJAX 强>
这实际上是最好的,因为它减少了整个页面请求,并且它是高度模块化的。
您将渲染所有10个嵌入式控制器,但每个提交按钮将改为执行指向对应控制器的ajax帖子,该控制器仅处理相应的表单,并且仅返回该特定表单的视图。
你不需要对你的javascript感兴趣,因为你只需要在点击提交时进行AJAX调用并将响应加载到表单所在的div。
嵌入式控制器中没有重定向
问题在于,如果用户按下F5,它将重新发送POST数据。
在案例表单无效的情况下保存会话中发布的数据/表单错误
和修改Symfony2内部以允许从嵌入式控制器重定向
这两个选项不太理想,因为它会增加复杂性。