2011-07-16 13 views
35

मैं अपने फॉर्म में इकाई पसंद सूची का उपयोग कर रहा हूं। मैं केवल विशिष्ट इकाइयों का उपयोग करना चाहता हूं (उदाहरण के लिए: केवल उपयोगकर्ता जो संबंधित हैं) तो, नियंत्रक में, मुझे इन समूहों को मिल रहा है, और उन्हें formBuider में पास करने का प्रयास कर रहा है।सिम्फनी 2 - फॉर्मबिल्डर को डेटा कैसे पास करें?

नियंत्रक:

/.../ 
$groups = $em->getRepository('VendorMyBundle:Group')->getUserGroups($user); 
$form = $this->createForm(new Message($groups), $message); 
/.../ 
तो

, अब क्या? फॉर्मबिल्डर में इसका उपयोग कैसे करें? समूहों की पारित सरणी का उपयोग करने के लिए इस पंक्ति को कैसे बदला जाए?

->add('group','entity',array('class' => 'Vendor\MyBundle\Entity\Group', 'label'=>'Group:')) 

या अन्य तरीके से:

class MessageType 
{ 
/.../ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
    $builder 
     ->add('group','entity', 
     array(
      'class' => 'Vendor\MyBundle\Entity\Group', 
      'property' => 'name', 
      'query_builder' => function ($repository) { 
      $qb = $repository->createQueryBuilder('group'); 
      $qb->add('where', 'group.administrator = :user'); 
      $qb->setParameter('user', $user->getId()); 
      return $qb; 
      }, 
      'label' => 'Group' 
     ) 
    ) 
     // Continue adding fields 
    ; 
    } 
/.../ 
} 

तो मैं कैसे वस्तु $ उपयोगकर्ता प्रपत्र बिल्डर में उपयोग करने के लिए मिल सकता है?

use Doctrine\ORM\EntityRepository; 

... 

$message = new Message(); 

$form = $this->createFormBuilder($message) 
      ->add('group', 'entity', array(
        'class' => 'Vendor\MyBundle\Entity\Group', 
        'label'=>'Group:', 
        'query_builder' => function(EntityRepository $er) { 
         return $er->createQueryBuilder('g') 
           ->... // whatever you want to do 
         } 
        )) 
      ->getForm(); 

आप Doctrine manual में और के लिए विकल्पों के बारे में क्वेरी बिल्डर के बारे में अधिक जानकारी पा सकते हैं: (उपयोगकर्ता $ वर्तमान में लॉग इन उपयोगकर्ता का प्रतिनिधित्व करते हैं)

+2

मैंने एक ही प्रश्न पूछा: - http: // stackoverflow।कॉम/प्रश्न/7807388/पास-डेटा-से-नियंत्रक-टू-टाइप-सिम्फनी 2 बैक्टरीज का समाधान वास्तव में अच्छा है !!! : thumbsup: – xeon

+0

यदि आपको प्रश्नों को निष्पादित करने की आवश्यकता है, तो दृश्य प्रस्तुत करने के लिए एपीआई कॉल आदि बनाएं, फिर आप इसे गलत कर रहे हैं। यदि यह एक बाधा है कि ढांचे पर सिम्फनी स्थान (फॉर्म बिल्डर को मनमाने ढंग से डेटा प्रदान करने का कोई अन्य तरीका नहीं है) तो उन पर शर्म आती है। यह नियंत्रक की स्पष्ट रूप से परिभाषित नौकरी है। – eggmatters

उत्तर

2

आप कस्टम क्वेरी का उपयोग करना चाहते हैं, तो आप इस प्रकार query_builder विकल्प सेट करने के लिए है entitySymfony2 manual में।

+0

हां, मुझे कस्टम क्वेरी का उपयोग करने का तरीका पता है, लेकिन जब मैं वर्तमान लॉग इन उपयोगकर्ता के समूह प्राप्त करना चाहता हूं तो मैं इसका उपयोग कैसे कर सकता हूं? मुझे एक फॉर्म टाइप क्लास में एक कंटेनर घोषित करना होगा? पूर्व: नियंत्रक में मैं $ $ का उपयोग कर रहा हूं-> प्राप्त करें ('security.context') -> getToken() -> getUser() ' – jacobmaster

+1

मैं यहां कईToOne या ManyToMany रिश्ते का उपयोग करने की अनुशंसा करता हूं। यह चीजों को और अधिक आसान बना देगा। –

+0

मैं अपना प्रश्न अधिक विशिष्ट बना देता हूं। शायद अब आप मेरी मदद कर सकते हैं ... – jacobmaster

28

आप उस वस्तु को दे सकते हैं जिसे आप __construct() विधि में उपयोग करना चाहते हैं।

उदाहरण के लिए:

$form = $this 
    ->get('form.factory') 
    ->create(new ApplyStepOneFormType($this->company, $this->ad), $applicant); 

अपने प्रपत्र प्रकार में:

function __construct(\Your\Bundle\Entity\Company $company, \DYB\ConnectBundle\Entity\Ad $ad) { 
    $this->company = $company; 
    $this->ad = $ad; 
} 

और फिर buildForm विधि में अपने प्रपत्र प्रकार में:

$company = $this->company;  
$builder->add('ad', 'entity', array(
    'class' => '\Your\Bundle\Entity\Ad', 
    'query_builder' => function(\Your\Bundle\Repository\AdRepository $er) use ($company) { 
     return $er->getActiveAdsQueryBuilder($company); 
    }, 
)); 
2

Bacteries 'समाधान एक वास्तविक अच्छा एक है । मेरे जैसे अन्य लड़के को सिरदर्द बचाने के लिए बस एक नोट :)

इस भाग में मैं use ($company) भाग इंगित कर सकता हूं। यह फ्रेम द्वारा छिपा हुआ था और निश्चित रूप से इसके बिना कुछ भी ठीक से काम नहीं करता है।

$builder->add('ad', 'entity', array(
    'class' => 
     '\Your\Bundle\Entity\Ad', 
    'query_builder' => 
     function(\Your\Bundle\Repository\AdRepository $er) use ($company) { 
      return $er->getActiveAdsQueryBuilder($company); 
     }, 
    ) 
); 
0

सर्वश्रेष्ठ तरीका (मेरी राय) आपके फॉर्म इकाई प्रबंधक को दे रहा है और इसमें आपको जो कुछ चाहिए उसे चुनें। लेकिन setDefaults में खाली कुंजी घोषित करना न भूलें() अन्यथा डेटा आपके निर्माता को पास नहीं होगा।

कुछ इस एक

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $options['em']->getRepository(''); // select all you need 
    $builder->add('title', 'text') 
      ->add('content', 'textarea'); 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Main\BlogBundle\Entity\Post', 
     'validation_groups' => array('post'), 
     'required' => false, 
     'em' => null // this var is for your entityManager 
     )); 
} 

तरह ईएम के रूप में सरल विकल्प लागू करें ...

+0

क्या यह एमवीसी अनुप्रयोग के उद्देश्य को हराने के लिए नहीं है? मैंने सोचा कि एक ढांचे का पूरा बिंदु प्रतिपादन परत से डेटा परत अस्पष्ट करना था। जहां तक ​​संभव हो। – eggmatters

+0

Symfony2 आपको पता है कि सभी पैटर्न ब्रोक ... तो आश्चर्य मत करो। मैंने समाधान दिखाया जो मेरे लिए काम करता है, अगर आप पैटर्न के साथ काम करना चाहते हैं तो एसएफ 2 विकास के लिए एक खराब एमवीसी है। यदि आपके पास अधिक सुरुचिपूर्ण है - अपना उपयोग करें ... – user1954544

11
//In controller pass the value which you want to use in builder form in array like 

$object = new Question(); 
$form->create(new QuestionType() , $object , array('sqtname'=>2,'question_type'=>2)); 


//In Form type class 
public function buildForm(FormBuilderInterface $builder , array $options) 
    { 
    //for setting data field dynamically 
    if (array_key_exists('question_type', $options) && $options['question_type'] != '') { 
    $data = $em->getReference("RecrutOnlineStandardBundle:StdQuestionType",$options['question_type']->getId()); 
    } else { 
    $data = ""; 
    } 


    $builder->add('StdQuestionType', 'entity', array(
     'class' => 'TestStandardBundle:StdQuestionType', 
     'property' => 'name', 
     'empty_value' => 'Sélectionner un question type', 
     'required' => true, 
     'data' => $data, 
     'query_builder' => function(EntityRepository $er) use ($options) { 
      if (isset($options['sqtname']) && $options['sqtname'] != '') { 
       return $er->createQueryBuilder('sqt') 
           ->where("sqt.name!= ".$options['sqtname']); 
      } else{ 
       return $er->createQueryBuilder('sqt'); 
      } 
     } 
    )); 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
     'data_class' => 'Test\QuestionBundle\Entity\Question', 
     'required' => false, 
     'sqtname' => '', 
     'question_type' =>'' 
     )); 
    } 
3

Bacteries 'समाधान एक अच्छा एक नहीं है। उदाहरण के लिए, यदि आप अपना प्रकार सेवा के रूप में घोषित करते हैं, तो किसी ऑब्जेक्ट को कन्स्ट्रक्टर को पास करना असंभव है।

एक आदर्श समाधान विकल्प है - बस निर्माता को बनाने के विकल्प के रूप में डेटा पास करें।

+0

इसके अलावा, उसका समाधान 3.0 में तोड़ने जा रहा है क्योंकि एफक्यूसीएन द्वारा प्रकारों का निर्माण किया जाता है – Ryall

संबंधित मुद्दे