2011-10-18 11 views
24

टाइप करने के लिए करता है, तो मैं अपने फार्म में प्रकार "संस्था" के एक क्षेत्र दिखाने के लिए, और मैं इस इकाई एक तर्क मैं नियंत्रक से पारित के आधार पर प्रकार फ़िल्टर करना चाहते हैं, मैं कैसे कि क्या करते हो ..?गुजर डेटा symfony2

//PlumeOptionsType.php 
public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('framePlume', 'entity', array(
     'class' => 'DessinPlumeBundle:PhysicalPlume', 
     'query_builder' => function(EntityRepository $er) { 
           return $er->createQueryBuilder('pp') 
            ->where("pp.profile = :profile") 
            ->orderBy('pp.index', 'ASC') 
            ->setParameter('profile', ????) 
           ; 
          }, 

    )); 
} 

public function getName() 
{ 
    return 'plumeOptions'; 
} 

public function getDefaultOptions(array $options) 
{ 
    return array(
      'data_class'  => 'Dessin\PlumeBundle\Entity\PlumeOptions', 
      'csrf_protection' => true, 
      'csrf_field_name' => '_token', 
      // a unique key to help generate the secret token 
      'intention'  => 'plumeOptions_item', 
    ); 
} 
} 

और नियंत्रक के अंदर, मैं फॉर्म बनाने:

i have that argument that i need to pass in my action code: 
$profile_id = $this->getRequest()->getSession()->get('profile_id'); 
... 
and then i create my form like this 
$form = $this->createForm(new PlumeOptionsType(), $plumeOptions); 

$ plumeOptions सिर्फ एक वर्ग जारी रहती है। लेकिन इसमें भौतिकप्लेम नामक एक और वर्ग के साथ एक-से-एक संबंध है। अब, जब मैं अपने कोड में 'framePlume' प्रदर्शित करना चाहता हूं, तो मैं एक फ़िल्टर की गई भौतिक प्लूम इकाई दिखाना चाहता हूं।

+0

पहले से ही उत्तर ... जांच http://stackoverflow.com/questions/6716776/symfony-2-how-to-pass-data-to-for mbuilder – xeon

उत्तर

38

इस प्रकार आप प्रपत्र वर्ग के लिए मानकों को पारित कर सकते हैं:

//PlumeOptionsType.php 
protected $profile; 

public function __construct (Profile $profile) 
{ 
    $this->profile = $profile; 
} 

फिर अपने buildForm की query_builder में इसका इस्तेमाल करते हैं:

$profile = $this->profile; 

$builder->add('framePlume', 'entity', array(
    'class' => 'DessinPlumeBundle:PhysicalPlume', 
    'query_builder' => function(EntityRepository $er) use ($profile) { 
          return $er->createQueryBuilder('pp') 
           ->where("pp.profile = :profile") 
           ->orderBy('pp.index', 'ASC') 
           ->setParameter('profile', $profile) 
          ; 
         }, 

)); 

और अंत में अपने नियंत्रक में:

// fetch $profile from DB 
$form = $this->createForm(new PlumeOptionsType($profile), $plumeOptions); 
+0

thx, मुझे लगता है कि आपको वास्तव में क्या मतलब है ... फिर भी, मुझे आपके द्वारा सुझाए गए बिल्कुल सही करने में त्रुटि मिली। $ का उपयोग करते हुए इस जब नहीं वस्तु संदर्भ PlumeBundle \ फार्म \ प्रकार में में \ PlumeOptionsType.php – xeon

+0

http://pastebin.com/RVLFCxL4 http://pastebin.com/778ygFgR – xeon

+0

http://pastebin.com/RVLFCxL4 http://pastebin.com/778ygFgR http://pastebin.com/q81k8w9A मुझे लगता है कि मेरी समस्या कॉलबैक फ़ंक्शन से संबंधित है। मैं PlumeOptionsType के अंदर से प्रोफ़ाइल पढ़ सकता हूं, लेकिन 'query_builder' => फ़ंक्शन (EntityRepository $ er) – xeon

4

आप अपने तर्क को पारित करने के लिए $plumeOptions का उपयोग कर सकते हैं, लेकिन आपको अपने विकल्प के लिए डिफ़ॉल्ट मान निर्दिष्ट करने के लिए PlumeOptionsType में getDefaultOptions() जोड़ने की आवश्यकता होगी। यह देखने के लिए कि यह विधि कैसा दिखना चाहिए, उदाहरण के लिए https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php देखें।

+1

क्या आप और विस्तार कर सकते हैं ..? क्या आप अधिक विशिष्ट हो सकते हैं ?? – xeon

+0

मैं अपने संदेश संपादित 'getDefaultOptions के बारे में अधिक precisions जोड़ने के लिए()' विधि – greg0ire

+0

ठीक है, चलो कहते हैं कि मैं वापस आ) PlumeOptionsType की getDefaultOptions की सरणी (में एक डिफ़ॉल्ट PROFILE_ID जोड़ा। और मैंने -> सेट पैरामीटर ('प्रोफ़ाइल', $ विकल्प ['प्रोफ़ाइल_आईडी']) ... लेकिन पहली जगह पर $ plumeOptions पर profile_id को कैसे पास किया जाए ?? आपकी मदद के लिए धन्यवाद !! – xeon