我在一个页面中有10个表单(它们在选项卡式页面中)。
我的控制器功能非常强大,为了使表格模块化,我打算只显示控制器功能中的表格,然后对其相应的控制器进行POST。
这10种形式中的某些形式在其他页面中使用,因此通过更改操作URL,可以更轻松地在单独的控制器中管理它们。
但是,我该如何显示表格错误并防止表格无效(如果无效)呢?
如果嵌入式控制器可以重定向,则可以实现此目的。我是否缺少其他选择?
Symfony2必须有一个理由不允许在嵌入式控制器中进行重定向,但是我想知道为什么。
第三编辑:
实际形式的图片:http : //imgur.com/sIx3sgs,tnZkvqM,ZAP950s,hk45oTW#0
不需要按顺序排列这些表格,用户可以创建并保存step6,而无需创建step1。
第二编辑:
这不是一个多步骤表单。为了方便起见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'));
}
}
我提出了我可以想到的4种解决方案,从最佳到最坏的顺序依次为:
AJAX
实际上,这是最好的选择,因为它减少了整个页面的请求,并且是高度模块化的。
您将渲染所有10个嵌入式控制器,但是每个Submit按钮将执行指向对应控制器的ajax发布,该ajax发布将仅处理对应表单,并且将仅返回该特定表单的视图。
而且您不需要花哨的JavaScript,因为只需在单击Submit时进行AJAX调用,并将响应加载到表单所在的div。
嵌入式控制器中无重定向
问题是如果用户按下F5,它将重新发送POST数据。
如果表单无效,则保存在会话中发布的数据/表单错误
和修改Symfony2内部,以允许从嵌入式控制器重定向
这两个选项不太理想,因为这会增加复杂性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句