如何在多个页面中拆分长symfony表单?
我想为具有许多属性的实体创建一个表单。为了确保数据输入的方便性,我想将该表单拆分为多个页面(例如2或3个页面)。 让我们以广告实体为例:如何在多个页面中拆分长symfony表单?,symfony,symfony-forms,submit-button,Symfony,Symfony Forms,Submit Button,我想为具有许多属性的实体创建一个表单。为了确保数据输入的方便性,我想将该表单拆分为多个页面(例如2或3个页面)。 让我们以广告实体为例: 在第1页,用户将输入广告文本 在第2页中,用户将输入其联系人 在第3页中,用户将提供广告的(X,Y)位置 此拆分需要在第一页中保存可用数据(插入数据库),然后再移动到下一页。不幸的是,由于限制,这是不可能的 问题是:是否有任何文档或示例可以解决此问题 如果没有可用的文档,您是否认为最好将我的实体拆分为n个实体,以便每页有一个实体 谢谢您的帮助。您可以将所有提交
谢谢您的帮助。您可以将所有提交的数据存储在会话或临时表中,然后在结束时将其全部保存在一起。然而,我尽我所能避免像这样的额外工作 我认为很可能是您的表单步骤遵循约束规定的顺序
尽管如此,有时我认为这类问题可以通过做出更好的设计或流程决策来解决。i、 e.限制问题的数量,或者在开始时只问关键问题。如果不知道细节,就很难知道是否可以做到这一点。您不必拆分实体,但您的表单:创建3个表单,每个表单包含广告实体所需的属性 您需要:
- 在控制器内的每一步都保留(而不是刷新)$ad对象
- 在控制器内转发时,将$ad对象作为参数传递
- 在最后一步中刷新$ad对象
public function newAdStep1() {
new Ad() // New instance of $ad
new formStep1($ad) // The first form containing only the ad text field
// The form was filled, manage it...
form->isValid()? {
persist($ad); // Persist the first part of your ad object
forward(newAdStep2, $ad) // Go on to step 2, your $ad object as an argument
}
// ... or display step1 to user
createView createAdStep1.html.twig('form' => $form);
}
public function newAdStep2($ad) {
new formStep2($ad); // Now the second form, containing the "contact" fields
isValid ? {
persist($ad)
forward(newAdStep3, $ad)
}
createView createAdStep2($form, $ad); // Your $ad object needs to be sent to the view
}
public function newAdStep3($ad) {
new formStep3($ad); // Third and last form, containing the (X,Y) fields
isValid ? {
$em->persist($ad);
$em->flush(); // Your instance of $ad can be stored in database now
return('success !');
}
return view createAdStep3($form, $ad);
}
你可能应该使用。它为构建多步骤表单提供了便利
可以为整个流程创建一种表单类型,也可以为每个步骤创建一种表单类型
安装起来很容易。一切都解释清楚了。非常感谢。我得试试你的解决办法。我有点担心isValid()。我尝试过它,并且isValid在createForm之后返回true,所以这个解决方案可能不可行。然而,使用转发的概念非常巧妙。如果你修改你的代码片段并用真实世界的codec替换它,这可能会很有帮助。你能测试一下你的代码吗?我用Symfony3尝试了您的解决方案,但最后一步冲水不起作用。你们能帮我一下吗:现在,假设在第一步用户关闭浏览器之后呢?非常感谢。这似乎是一个很好的解决方案!:)绝对完美!再次感谢!我怀疑捆绑是否是一个很好的解决方案。我个人通常更喜欢编码作为一个好的解决方案。会话不是一个好地方,并且会导致会话滥用。我会使用缓存。