2015-07-19 42 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您有任何想法吗? –

相关问题