26

我有一个order和一个client实体。

我想知道是否可以使用实际的 Symfony2 表单系统创建一个订单表单,该表单允许:

  1. 从下拉列表中选择多个客户端(混合collectionentity表单类型)
  2. collection如果不在下拉列表中,则动态创建新客户端(该类型的默认方式)。

我已经看到了通过在同一页面中创建多个表单来实现它的某种方法,但这不是我想要实现它的方式。

有没有更好的方法来做到这一点?

4

5 回答 5

7

我有一个类似的问题,可能会导致您的解决:

我有一个类别和项目关系(多对一),我想选择一个现有项目或创建一个新项目。

在我的表单类中:

    $builder->add('item', 'entity', array(
        'label' => 'Item',
        'class' => 'ExampleItemBundle:Item',
    ));

    $builder->add('itemNew', new EmbedItemForm(), array(
        'required' => FALSE,
        'mapped' => FALSE,
        'property_path' => 'item',
    ));

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
        $data = $event->getData();
        $form = $event->getForm();

        if (!empty($data['itemNew']['name'])) {
            $form->remove('item');

            $form->add('itemNew', new EmbedItemForm(), array(
                'required' => TRUE,
                'mapped' => TRUE,
                'property_path' => 'item',
            ));
        }
    }); 
于 2015-08-25T13:25:59.210 回答
3

property_path您可以使用该选项将表单中的两个字段映射到同一属性。然后,使用表单事件,使用提交的数据做出决定并修改表单,以便只有一个字段有一个mapped选项,即true.

于 2014-07-07T12:43:21.077 回答
1

就我而言,我遇到了同样的问题,我通过在我的formType;中创建 2 个属性来解决它。

例如,对您来说,它将是:

customer->entity
new_customer-> collection

在您的订单实体文件中,您必须添加 3 个方法(getter、setter 和 remover)getter 和 remover 不做任何事情,但 setter 应该调用setCustomer(c)

我不确定这是否是最好的方法,但这是我弄清楚的唯一方法!

于 2013-02-14T08:41:25.050 回答
1

如果我理解的话,您现在想在“动态”表单中创建和存储新客户。我认为您必须使用 JavaScript 执行此操作并在控制器中设置其他操作。

  1. JS -> 捕获事件以将新客户端添加到您的数据库(即“添加新”按钮单击事件)
  2. JS -> 在此事件中,使用新客户端的值通过 AJAX 调用您的控制器。(使用FOSJsRoutingBundle很容易做到)
  3. Symfony2 -> 在您的新操作中,将新客户端存储在您的数据库中。
  4. JS -> OnSuccess 事件,在您的 AJAX 调用中,将新客户端添加到您的 DropDownBox (ddb.append(new element tag)

只需这样做,您就可以将新客户端存储在数据库中并添加到您的下拉框中

于 2012-08-03T07:49:14.790 回答
0

collectionForm 类型允许使用和属性动态添加和allow_add删除allow_delete

通过以下 2 个链接了解更多信息:

如果您不喜欢在同一页面上获得补充表单,您可以将它们集成到对话框中...但是您肯定需要一个表单来创建新项目...

于 2012-04-17T16:14:55.937 回答