我有一个order
和一个client
实体。
我想知道是否可以使用实际的 Symfony2 表单系统创建一个订单表单,该表单允许:
- 从下拉列表中选择多个客户端(混合
collection
和entity
表单类型) collection
如果不在下拉列表中,则动态创建新客户端(该类型的默认方式)。
我已经看到了通过在同一页面中创建多个表单来实现它的某种方法,但这不是我想要实现它的方式。
有没有更好的方法来做到这一点?
我有一个类似的问题,可能会导致您的解决:
我有一个类别和项目关系(多对一),我想选择一个现有项目或创建一个新项目。
在我的表单类中:
$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',
));
}
});
property_path
您可以使用该选项将表单中的两个字段映射到同一属性。然后,使用表单事件,使用提交的数据做出决定并修改表单,以便只有一个字段有一个mapped
选项,即true
.
就我而言,我遇到了同样的问题,我通过在我的formType
;中创建 2 个属性来解决它。
例如,对您来说,它将是:
customer->entity
new_customer-> collection
在您的订单实体文件中,您必须添加 3 个方法(getter、setter 和 remover)getter 和 remover 不做任何事情,但 setter 应该调用setCustomer(c)
我不确定这是否是最好的方法,但这是我弄清楚的唯一方法!
如果我理解的话,您现在想在“动态”表单中创建和存储新客户。我认为您必须使用 JavaScript 执行此操作并在控制器中设置其他操作。
只需这样做,您就可以将新客户端存储在数据库中并添加到您的下拉框中
collection
Form 类型允许使用和属性动态添加和allow_add
删除allow_delete
。
通过以下 2 个链接了解更多信息:
如果您不喜欢在同一页面上获得补充表单,您可以将它们集成到对话框中...但是您肯定需要一个表单来创建新项目...