我有一个order
和一个client
实体。
我想知道是否可以使用实际的Symfony2表单系统创建一个允许的订单表单:
collection
和entity
表单类型混合)collection
类型的默认方式)。通过在同一页面中创建多个表单,我已经看到了一些方法,但这不是我希望实现的方式。
有没有更好的方法来做到这一点?
答案 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并在控制器中设置其他操作。
这样做就可以将新客户端存储在数据库中并添加到您的下拉框
答案 3 :(得分:1)
就我而言,我有同样的问题,我通过在formType
中创建2个属性来解决它;
例如,对你来说就是:
customer->entity
new_customer-> collection
在您的订单实体文件中,您必须添加3个方法(getter,setter和remover)getter和remover不做任何事情,但是setter应该调用setCustomer(c)
我不确定这是不是最好的方式,但这是我解决问题的唯一方法!
答案 4 :(得分:0)
collection
表单类型允许动态添加和删除allow_add
和allow_delete
属性。
通过以下2个链接获取更多信息:
如果您不想在同一页面上获得补充表格,您可以将它们整合到对话框中......但您肯定需要一个表格来创建新项目......