简单的答案是,你可以定义自定义查询构建器对每个元素,您添加到形式,即
$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
优秀的,这就是我期待的,谢谢你,弗朗西斯。 –
@videni高兴听到! –
我刚刚注意到您的更新,我检查了该帖子,但我不明白为什么它在将字段类型从实体更改为文本时起作用,因为我们需要的是集合,但是只有一个item.do您有任何想法吗? –