2015-07-19 84 views
0

汽車機油適用於幾款車型,但在我的情況下,我們的系統中有數百款車型,我不想將它們全部加載到一頁,然後,讓用戶選擇特定的車型型號,最好用汽車品牌,汽車系列的ajax來獲取汽車模型。用戶選擇項目的子集合,將這些選定的內容發佈到服務器。Symfony:如何添加從大集合到實體類型的子集項目?

在表單類型中,我添加了一個如下所示的表單字段,如我們所知,如果我沒有將其選項選項設置爲空數組,則實體字段將獲得所有車型,這將導致巨大的性能罰款。

->add('applicableModels', 'entity', array(
         'class' => 'VMSP\CarBundle\Entity\CarModel', 
         'choices'=>array(), 
         'multiple'=>true, 
         'property_path' => "modelName", 
         'label' => 'vmsp_product.product.form.applicable_model', 
        ) 
     ) 

那麼,如何從大集合中添加一組子項目,並將這些選定項目分配給實體類型?

回答

1

簡單的答案是,你可以定義自定義查詢構建器對每個元素,您添加到形式,即

$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

+0

優秀的,這就是我期待的,謝謝你,弗朗西斯。 –

+0

@videni高興聽到! –

+0

我剛剛注意到您的更新,我檢查了該帖子,但我不明白爲什麼它在將字段類型從實體更改爲文本時起作用,因爲我們需要的是集合,但是隻有一個item.do您有任何想法嗎? –

相關問題