簡單的答案是,你可以定義自定義查詢構建器對每個元素,您添加到形式,即
$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您有任何想法嗎? –