Symfony2表单:选择一个实体或添加一个新实体

时间:2012-04-17 15:55:57

标签: forms symfony

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

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

  1. 从下拉列表中选择多个客户端(collectionentity表单类型混合)
  2. 如果不在下拉列表中,则动态创建新客户端(collection类型的默认方式)。
  3. 通过在同一页面中创建多个表单,我已经看到了一些方法,但这不是我希望实现的方式。

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

5 个答案:

答案 0 :(得分:7)

我遇到了类似的问题,可能导致您的解决:

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

在我的Form类中:

    $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',
            ));
        }
    }); 

答案 1 :(得分:3)

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

答案 2 :(得分:1)

如果我已经理解,您现在想要在“飞行中”的表格中创建和存储新客户。我认为您必须使用JavaScript并在控制器中设置其他操作。

  1. JS - >捕获事件以向您的数据库添加新客户端(即“添加新”按钮单击事件)
  2. JS - >在此事件中,使用新客户端的值通过AJAX调用控制器。 (使用FOSJsRoutingBundle很容易)
  3. Symfony2 - >在新操作中,将新客户端存储在数据库中。
  4. JS - > OnSuccess事件,在您的AJAX调用中,将新客户端添加到DropDownBox (ddb.append(新元素标记)
  5. 这样做就可以将新客户端存储在数据库中并添加到您的下拉框

答案 3 :(得分:1)

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

例如,对你来说就是:

customer->entity
new_customer-> collection

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

我不确定这是不是最好的方式,但这是我解决问题的唯一方法!

答案 4 :(得分:0)

collection表单类型允许动态添加和删除allow_addallow_delete属性。

通过以下2个链接获取更多信息:

如果您不想在同一页面上获得补充表格,您可以将它们整合到对话框中......但您肯定需要一个表格来创建新项目......