【发布时间】:2014-02-23 22:05:53
【问题描述】:
我在一个页面中有 10 个表单(它们位于标签页中)。
我的控制器功能非常庞大,为了使表单模块化,我打算只在我的控制器函数中显示表单,然后向其对应的控制器执行 POST。
这 10 种表单中的一些在其他页面中使用,因此通过更改操作 url,可以更轻松地在单独的控制器中管理它们。
但是,如果表单无效,我将如何显示表单错误并防止重置表单?
如果嵌入式控制器可以重定向,我可以实现这一点。我错过了另一个选择吗?
Symfony2 必须有一个不允许在嵌入式控制器中重定向的理由,但我想知道为什么。
第三次修改:
实际表格的图片:http://imgur.com/sIx3sgs,tnZkvqM,ZAP950s,hk45oTW#0
- 图片1:Step1(只能创建一次)
- 图2:Step5(可多次创建)可以看到创建表单和编辑表单
- 图 3:Step5 ui 表单向上滑动。
- 图 4:Step6 与 Step1 相同
这些表单不需要按顺序排列,用户可以创建并保存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'));
}
}
【问题讨论】:
-
@AndrzejOśmiałowski 我发布了我的代码。我对其进行了编辑以使其更短。
-
您的表单(整个表单)是
step kind的表单吗? -
@AndrzejOśmiałowski 不,他们被命名为
step,但他们来自完全不同的实体。我无法将其设为多步骤表单,因为某些步骤是重复的(用户可以创建step实体的多个实例)。 -
我换个方式问:每个表单的职责是什么?
-
@AndrzejOśmiałowski 创建/编辑实体,然后将其应用于数据库。对于某些实体,我必须调用额外的方法,例如
$step1->setSomething($getSomething),它是最小的,但是当你将这些最小调用乘以 10 时,你最终会得到一个大函数。另外,如果我需要使用完全相同的表单,那么我希望能够创建表单并让对应的控制器处理帖子。