11

我想为具有许多属性的实体创建一个表单。为了确保数据输入的方便性,我想将该表单拆分为多个页面(例如 2 或 3 页)。我们以广告实体为例:

  1. 在第 1 页,用户将输入广告文字
  2. 在第 2 页,用户将输入他的联系人
  3. 在第 3 页,用户将提供广告的 (X,Y) 位置

此拆分将需要在移动到下一页之前将可用数据(插入数据库中)保存在第一页中。不幸的是,由于限制,这是不可能的。

问题是:是否有任何文档或任何示例可以解决此问题?

如果没有可用的文档,您是否认为最好将我的实体拆分为 n 个实体以便每页有一个实体?

谢谢你的帮助。

4

3 回答 3

12

您可能应该使用CraueFormFlowBundle。它为构建多步骤表单提供了便利。

您可以为整个流程创建一种表单类型,或为每个步骤创建一种表单类型。

设置非常简单。一切都在这里解释。

于 2014-01-21T10:59:21.580 回答
12

您不必拆分您的实体,但您的表单:创建 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);
}
于 2014-01-21T10:49:29.250 回答
1

您可以将所有提交的数据存储在会话或临时表中,然后在最后将它们全部保存在一起。但是,我尽量避免这样的额外工作。

我认为您的表单步骤很可能遵循约束规定的顺序。

话虽如此,有时我认为这种问题可以通过做出更好的设计或工艺决策来解决。即限制问题的数量或一开始只问重要的问题。不知道来龙去脉,很难知道这是否可以做到。

于 2014-01-21T10:36:23.543 回答