如何在多个页面中拆分长symfony表单?

如何在多个页面中拆分长symfony表单?,symfony,symfony-forms,submit-button,Symfony,Symfony Forms,Submit Button,我想为具有许多属性的实体创建一个表单。为了确保数据输入的方便性,我想将该表单拆分为多个页面(例如2或3个页面)。 让我们以广告实体为例: 在第1页,用户将输入广告文本 在第2页中,用户将输入其联系人 在第3页中,用户将提供广告的(X,Y)位置 此拆分需要在第一页中保存可用数据(插入数据库),然后再移动到下一页。不幸的是,由于限制,这是不可能的 问题是:是否有任何文档或示例可以解决此问题 如果没有可用的文档,您是否认为最好将我的实体拆分为n个实体,以便每页有一个实体 谢谢您的帮助。您可以将所有提交

我想为具有许多属性的实体创建一个表单。为了确保数据输入的方便性,我想将该表单拆分为多个页面(例如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尝试了您的解决方案,但最后一步冲水不起作用。你们能帮我一下吗:现在,假设在第一步用户关闭浏览器之后呢?非常感谢。这似乎是一个很好的解决方案!:)绝对完美!再次感谢!我怀疑捆绑是否是一个很好的解决方案。我个人通常更喜欢编码作为一个好的解决方案。会话不是一个好地方,并且会导致会话滥用。我会使用缓存。