Php Symfony表单实体,允许添加
我正在用Symfony 2.3构建一个应用程序。 我有一个预订实体,它通过多人关系与客户实体相关联 在我的表格中,我希望能够选择一个现有客户或创建一个新客户。 例如,在my customer中有一个“new customer”选项,选择使用javascript显示客户表单的用户 事实上,我正试图构建一个实体表单字段,其中包含一个“allow_add”选项,就像在collection表单字段中一样 你知道我该怎么做吗Php Symfony表单实体,允许添加,php,forms,symfony,entity,Php,Forms,Symfony,Entity,我正在用Symfony 2.3构建一个应用程序。 我有一个预订实体,它通过多人关系与客户实体相关联 在我的表格中,我希望能够选择一个现有客户或创建一个新客户。 例如,在my customer中有一个“new customer”选项,选择使用javascript显示客户表单的用户 事实上,我正试图构建一个实体表单字段,其中包含一个“allow_add”选项,就像在collection表单字段中一样 你知道我该怎么做吗 非常感谢。我认为最好的方法是使用javascript管理此工作流 如果用户选择创
非常感谢。我认为最好的方法是使用javascript管理此工作流 如果用户选择创建新客户,则可以在模式中打开“创建新客户”表单,并通过Ajax创建新客户。创建操作的响应返回响应中的id,您将使用该id与新创建的客户创建预订
诀窍是:您将始终从现有客户创建预订。您的用户可以在此过程中创建新客户,但事实上,它将在您创建预订记录之前创建。感谢您的贡献。我找到了实现它的方法! 解决方案是在客户表单中有一个字段,必须对其进行映射,在客户实体中有一个实体字段,但不进行映射
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($company) {
$form = $event->getForm();
$data = $event->getData();
$form->add('customer_list', 'entity',
[
'class' => 'SomeBunlde\Entity\Customer',
'label' => 'Client',
'property' => 'fullName',
'expanded' => false,
'multiple' => false,
'mapped' => false,
'query_builder' => function(EntityRepository $er) use ($company)
{
return $er->getByCompanyQueryBuilder($company);
},
]
)
;
if ($data->getCustomer() === null) {
$form->add('customer', new CustomerType());
}
}
在我向实体表单字段添加额外选项重载finishView方法后:
public function finishView(FormView $view, FormInterface $form, array $options)
{
array_unshift($view->children['customer_list']->vars['choices'], new SfFormExt\ChoiceView('test', 'new', 'Nouveau client'));
}
然后,我添加了两个事件侦听器,一个pre_submit,用于删除映射的嵌入式客户表单及其数据:
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function(FormEvent $event) use ($em) {
$data = $event->getData();
if ($data['customer_list'] !== 'new') {
unset($data['customer']);
$event->getForm()->remove('customer');
// setting data w/out customer to avoid extra-field error
$event->setData($data);
}
}
);
以及将现有客户附加到预订的绑定事件:
$builder->addEventListener(
FormEvents::BIND,
function(FormEvent $event) use ($em) {
$form = $event->getForm();
$data = $event->getData();
if (!$form->has('customer')) {
$existing_customer = $form->get('customer_list')->getData();
if ($existing_customer instanceof Customer) {
$data->setCustomer($existing_customer);
}
}
}
);
我知道这可能不是最先进的代码,但它工作得相当好
编辑:我对这种技术有一个问题,因为当customer_list设置为new时,它会抛出一个错误。我没有找到避免此错误的方法(如果您知道我如何实现此目的!),因此我决定修改pre_submit以将客户列表值的数据设置为“”,如果我们是新客户,则在控制器中检测新客户表单上是否存在表单验证错误,以便正确显示它