2012-01-27 7 views
6

エンティティフィールド型のカスタムクエリパラメータ

$formMapper 
      ->add('article_subcategories', 'entity', 
        array(
         'label' => 'Podkategorie', 
         'multiple' => true, 
         'expanded' => true, 
         'read_only' => true, 
         'class' => 'FachowoArticleBundle:ArticleSubcategory', 
         'query_builder' => function (EntityRepository $er) 
         { 
          return $er 
            ->createQueryBuilder('sc') 
             ->where('sc.article_category = :id') 
             ->orderBy('sc.name', 'ASC') 
             ->setParameter('id', $id); 
         } 
        )); 

がどのように私は、この関数に$ IDを渡すことができます内部フォームマッパー?

答えて

8

PHP 5.3のクロージャを使用することができます。ほとんどの言語でクロージャが自動的に行われますが、PHPではリストを明示的に指定する必要があります。

'query_builder' => function (EntityRepository $er) use ($id) 
    { 
     return $er 
     ->createQueryBuilder('sc') 
     ->where('sc.article_category = :id') 
     ->orderBy('sc.name', 'ASC') 
     ->setParameter('id', $id); 
    } 
1

良い方法は何フォームを作成するときにオプションの配列を使用し、その配列内のIDを渡し、その後、フォームにすることです。

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $id = $options['id']; 
    $builder 
     ->add('foo', 'entity', array(
      'class' => 'Foo', 
      'query_builder' => function (EntityRepository $er) use ($id) { 
       return $er->findByBar($id); 
      } 
     )) 
    ; 
} 
+2

あなただけで追加できないことに留意すべきです任意の項目をFormTypeの$ optionsに追加します。 FormTypeのgetDefaultOptionsメソッドをオーバーライドして宣言する必要があります。 –

関連する問題