【问题标题】:Symfony2 Form : Select an entity or add a new oneSymfony2 Form:选择一个实体或添加一个新实体
【发布时间】:2012-04-28 23:55:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

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

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

    在我的表单类中:

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

    【讨论】:

    • 自 symfony 3(可能是 2.?)以来,在 add 方法中需要使用 EmbedItemForm::class,因为类型为 string|null。
    • 这对我很有效。我只是修改了它,所以我不必使用两个不同的表单键。在侦听器之前,我使用我的自定义表单类型。在侦听器中,我只检查 if(is_numeric($data['item']) 然后删除表单并添加 EntityType 表单。
    • @patrick 我正在使用完全相同的示例,但由于某种原因,我收到错误“此表单不应包含额外字段”。我确定调用 eventListener 以正确删除/添加字段。
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    例如,对你来说是:

    customer->entity
    new_customer-> collection
    

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

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

    【讨论】:

      【解决方案4】:

      如果我理解的话,您现在想在“即时”表单中创建和存储新客户。我认为您必须使用 JavaScript 并在控制器中设置额外的操作。

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

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

      【讨论】:

      • 这个想法是创建一个显示现有客户端的下拉列表,同时还能够以相同的形式创建一个新客户端(如果列表中不存在)。我确实决定使用一些js来实现这种行为。
      【解决方案5】:

      collection 表单类型允许使用allow_addallow_delete 属性即时添加和删除。

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

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

      【讨论】:

      • 感谢您的回答。我知道collection 类型。但是我觉得我可以添加和删除现有客户端,或者添加和删除新客户端,但不能添加现有客户端并以相同的形式创建新客户端(例如)。我错了吗 ?我希望它很清楚。
      • 我想您必须将“添加现有客户”与“添加新客户”区分开来,因为表单必须不同。
      • 我相信这并不能回答最初的问题,对我来说是:是否有一种优雅的方式可以将现有对象或新对象添加到集合中?我不明白为什么这个答案被接受了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多