2012-10-04 18 views
9

मेरे पास 2 संस्थाएं हैं - उपयोगकर्ता और समूह। उनके पास कई से अधिक रिश्ते हैं और समूह का उपयोग उपयोगकर्ताओं की भूमिकाओं को स्टोर करने के लिए किया जाता है।सिम्फनी 2 एंबेडेड फॉर्म संग्रह कई

मैं एक संग्रह को जोड़कर एक उपयोगकर्ता संपादित करें प्रपत्र बनाने के लिए कोशिश कर रहा हूँ, मैं (क्या पहले से ही डीबी में है तक सीमित) एक ड्रॉप-डाउन से चयन करके एक नई भूमिका को जोड़ने के लिए सक्षम होना चाहते हैं

प्रयोक्ता प्रकार। php:

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('username') 
      ->add('email') 
      ->add('forename') 
      ->add('surname') 
      ->add('isActive') 
      ->add('joinDate', 'date', array('input' => 'datetime', 'format' => 'dd-MM-yyyy')) 
      ->add('lastActive', 'date', array('input' => 'datetime', 'format' => 'dd-MM-yyyy')) 
      ->add('groups', 'collection', array(
        'type' => new GroupType(), 
        'allow_add' => true, 
        )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Sfox\CoreBundle\Entity\User' 
     )); 
    } 
} 

और GroupType.php:

class GroupType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('role'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       "data_class" => 'Sfox\CoreBundle\Entity\Group' 
       )); 
    } 
} 

यह बुनियादी टेक्स्ट बॉक्स के रूप में भूमिका को प्रदर्शित करता है, लेकिन अगर मैं फार्म के लिए एक प्रविष्टि जोड़ने, यह एक नई ईएनटी जारी रहती है झरना समूह में ry और अगर मैं एक प्रविष्टि संपादित करना था, तो यह अंतर्निहित समूह डेटा बदल जाएगा।

मैं एक GroupSelectType.php बनाने की कोशिश की:

class GroupSelectType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('role', 'entity', array('class'=>'SfoxCoreBundle:Group', 'property'=>'name')); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       "data_class" => 'Sfox\CoreBundle\Entity\Group' 
       )); 
    } 
} 

एक "संस्था" प्रकार के रूप में क्षेत्र को जोड़ने, यह सही सलेक्ट बॉक्स प्रदर्शित करता है (लेकिन मूलभूत मूल्यों के साथ) मैं नहीं कर सकते करने के लिए इसे बाध्य करने के लिए लग रहे हैं उपयोगकर्ता टाइप प्रकार!

मैं चाहता हूं कि फॉर्म को उपयोगकर्ता इकाई में अंतर्निहित 'समूह' ArrayCollection को संशोधित करना है।

क्या कोई जानता है कि मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

14

खैर मैं किसी और इसी तरह की समस्याओं से जूझ के लिए एक समाधान ...

मैं एक कस्टम प्रपत्र प्रकार बना सकते हैं और इसलिए मैं इकाई प्रबंधक प्रेषित कर सकता है एक सेवा के रूप में यह घोषणा करने के लिए किया था बाहर काम किया।

class GroupSelectType extends AbstractType 

{ 
    /** 
    * @var ObjectManager 
    */ 
    private $om; 

    private $choices; 

    /** 
    * @param ObjectManager $om 
    */ 
    public function __construct(ObjectManager $om) 
    { 
     $this->om = $om; 

     // Build our choices array from the database 
     $groups = $om->getRepository('SfoxCoreBundle:Group')->findAll(); 
     foreach ($groups as $group) 
     { 
      // choices[key] = label 
      $this->choices[$group->getId()] = $group->getName() . " [". $group->getRole() ."]"; 
     } 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new GroupToNumberTransformer($this->om); 
     $builder->addModelTransformer($transformer); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       "choices" => $this->choices, 
       )); 
    } 

    public function getParent() 
    { 
     return 'choice'; 
    } 

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

निर्माता में मैं सभी उपलब्ध समूहों हो रही है और उन्हें एक "विकल्प" में डाल: मैं तो मेरे समूह फार्म के लिए एक पूर्णांक में वस्तुओं

कस्टम GroupSelectType बदलने के लिए एक dataTransformer बनाने के लिए आवश्यक सरणी जिसे एक विकल्प के रूप में चयन बॉक्स में पास किया जाता है।

आप यह भी देखेंगे कि मैं एक कस्टम डेटा ट्रांसफॉर्मर का उपयोग कर रहा हूं, यह समूह इकाई (जिसे फॉर्म के प्रतिपादन में उपयोग किया जाता है) को समूह इकाई में बदलना है। मैं GroupSelectType एक सेवा के रूप में अच्छी तरह से और [@ doctrine.orm.entity_manager]

services.yml में पारित (बंडल config) बनाया:

services: 
    sfox_core.type.group_select: 
     class: Sfox\CoreBundle\Form\Type\GroupSelectType 
     arguments: [@doctrine.orm.entity_manager] 
     tags: 
      - { name: form.type, alias: group_select } 

GroupToNumberTranformer.php

class GroupToNumberTransformer implements DataTransformerInterface 
{ 
    /** 
    * @var ObjectManager 
    */ 
    private $om; 

    /** 
    * @param ObjectManager $om 
    */ 
    public function __construct(ObjectManager $om) 
    { 
     $this->om = $om; 
    } 

    /** 
    * Transforms an object (group) to a string (number). 
    * 
    * @param Group|null $group 
    * @return string 
    */ 
    public function transform($group) 
    { 
     if (null === $group) { 
      return ""; 
     } 

     return $group->getId(); 
    } 

    /** 
    * Transforms a string (number) to an object (group). 
    * 
    * @param string $number 
    * @return Group|null 
    * @throws TransformationFailedException if object (group) is not found. 
    */ 
    public function reverseTransform($number) 
    { 
     if (!$number) { 
      return null; 
     } 

     $group = $this->om 
     ->getRepository('SfoxCoreBundle:Group') 
     ->findOneBy(array('id' => $number)) 
     ; 

     if (null === $group) { 
      throw new TransformationFailedException(sprintf(
        'Group with ID "%s" does not exist!', 
        $number 
      )); 
     } 

     return $group; 
    } 
} 

और मेरा संशोधित UserType.php - नोटिस मैं अब अपने कस्टम फॉर्म प्रकार "group_select" का उपयोग कर रहा हूं क्योंकि यह एक सेवा के रूप में चल रहा है:

class UserType extends AbstractType 
{ 
    private $entityManager; 

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

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new GroupToNumberTransformer($this->entityManager); 

     $builder 
      ->add('username') 
      ->add('email') 
      ->add('forename') 
      ->add('surname') 
      ->add('isActive') 
      ->add('joinDate', 'date', array('input' => 'datetime', 'format' => 'dd-MM-yyyy')) 
      ->add('lastActive', 'date', array('input' => 'datetime', 'format' => 'dd-MM-yyyy')); 
     $builder 
      ->add(
       $builder->create('groups', 'collection', array(
        'type' => 'group_select', 
        'allow_add' => true, 
        'options' => array(
          'multiple' => false, 
          'expanded' => false, 
          ) 
        )) 
     ); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Sfox\CoreBundle\Entity\User' 
     )); 
    } 

    public function getName() 
    { 
     return 'sfox_corebundle_usertype'; 
    } 
} 
+0

इस जवाब ने मुझे एक टन मदद की! धन्यवाद! – jcbwlkr

+0

बिल्कुल सही धन्यवाद! –

+0

बहुत उपयोगी। धन्यवाद – Rinat

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