一台汽车机油适用于几种车型,但在我的情况下,我们系统中有数百种车型,我不想把它们全部加载到一个页面上,然后,让用户选择特定的车型,最好是用ajax调用得到汽车品牌、汽车系列的车型。用户选择项的子集合,将所选的项张贴到服务器。
在表单类型中,我在下面添加了一个表单字段,如我们所知,如果我不将其选项设置为空数组,实体字段将得到所有的car模型,这将导致巨大的性能损失。
->add('applicableModels', 'entity', array(
'class' => 'VMSP\CarBundle\Entity\CarModel',
'choices'=>array(),
'multiple'=>true,
'property_path' => "modelName",
'label' => 'vmsp_product.product.form.applicable_model',
)
)那么,如何从一个大集合中添加一组子项,并将这些选定的项分配给实体类型?
发布于 2015-07-19 10:01:53
简单的答案是,您可以为每个元素定义一个自定义查询生成器,将其添加到表单中,即
$data = $builder->getData();
\\...
->add('applicableModels', 'entity', array(
'class' => 'VMSP\CarBundle\Entity\CarModel',
'multiple' => true,
'property_path' => "modelName",
'label' => 'vmsp_product.product.form.applicable_model',
'query_builder' => function (EntityRepository $er) use ($data) {
$qb = $er->createQueryBuilder('e')
->where('e.manufacturer IN (:manufacturer)')
->setParameter('manufacturer', $data['manufacturer']);
return $qb->orderBy('e.name');
},
))因此,您可能有一种“向导”,其中用户选择一个制造商,页面重新加载,而显示的汽车只是一个子集。
不过,在类似的情况下,我做的事情有点不同。在表单中,选项被设置为空数组。在前端,这些选项是通过Ajax调用单独的API来填充的。然后,在表单“预提交”事件上,我用所选的选项填充字段。
$builder->addEventListener(
FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
if (!empty($data['applicable_model'])) {
$form->add('applicable_model', 'entity', array(
'class' => 'VMSP\CarBundle\Entity\CarModel',
'query_builder' => function (EntityRepository $er) use ($data) {
$qb = $er->createQueryBuilder('e')
->where('e.id IN (:applicable_model)')
->setParameter('applicable_model', $data['applicable_model']);
return $qb;
},
));
}更新:我了解到addEventListener部件可能会被DataTransforme替换,参见https://stackoverflow.com/a/31938905/410761
https://stackoverflow.com/questions/31499111
复制相似问题