2012-01-27 10 views
6

मैं Symfony 2 में एक Entity फ़ील्ड प्रकार का निर्माण और संबंधित वस्तुओं के फ़िल्टर सूची के लिए बिल्डर क्वेरी करने के लिए एक पैरामीटर के पास करना चाहते हैं:इकाई फ़ील्ड प्रकार कस्टम क्वेरी पैरामीटर

$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); 
         } 
        )); 

कैसे मैं इस समारोह के लिए $ आईडी पारित कर सकते हैं फार्ममैपर के अंदर?

उत्तर

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

एक अच्छा तरीका है के रूप में तो विकल्प सरणी का उपयोग करने के लिए जब आप फ़ॉर्म बनाते हैं, तो सरणी में आईडी गुजरती हैं, है:

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

यह ध्यान देने योग्य है कि आप बस नहीं जोड़ सकते हैं फॉर्मटाइप के $ विकल्पों के लिए मनमानी आइटम; आपको फॉर्मटाइप की getDefaultOptions विधि को ओवरराइड करके उन्हें घोषित करने की आवश्यकता है। –