<small id='cERej'></small><noframes id='cERej'>

<i id='cERej'><tr id='cERej'><dt id='cERej'><q id='cERej'><span id='cERej'><b id='cERej'><form id='cERej'><ins id='cERej'></ins><ul id='cERej'></ul><sub id='cERej'></sub></form><legend id='cERej'></legend><bdo id='cERej'><pre id='cERej'><center id='cERej'></center></pre></bdo></b><th id='cERej'></th></span></q></dt></tr></i><div id='cERej'><tfoot id='cERej'></tfoot><dl id='cERej'><fieldset id='cERej'></fieldset></dl></div>

    <legend id='cERej'><style id='cERej'><dir id='cERej'><q id='cERej'></q></dir></style></legend>

      <bdo id='cERej'></bdo><ul id='cERej'></ul>

  1. <tfoot id='cERej'></tfoot>
    1. Symfony 2 嵌入式表单集合多对多

      时间:2024-08-09

    2. <i id='X8QWj'><tr id='X8QWj'><dt id='X8QWj'><q id='X8QWj'><span id='X8QWj'><b id='X8QWj'><form id='X8QWj'><ins id='X8QWj'></ins><ul id='X8QWj'></ul><sub id='X8QWj'></sub></form><legend id='X8QWj'></legend><bdo id='X8QWj'><pre id='X8QWj'><center id='X8QWj'></center></pre></bdo></b><th id='X8QWj'></th></span></q></dt></tr></i><div id='X8QWj'><tfoot id='X8QWj'></tfoot><dl id='X8QWj'><fieldset id='X8QWj'></fieldset></dl></div>

          <tbody id='X8QWj'></tbody>
        <legend id='X8QWj'><style id='X8QWj'><dir id='X8QWj'><q id='X8QWj'></q></dir></style></legend>

          <bdo id='X8QWj'></bdo><ul id='X8QWj'></ul>

          <small id='X8QWj'></small><noframes id='X8QWj'>

                <tfoot id='X8QWj'></tfoot>

                本文介绍了Symfony 2 嵌入式表单集合多对多的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我有 2 个实体 - 用户和组.它们具有多对多关系,Group 用于存储用户的角色.

                I have 2 Entities - User and Group. They have a many-to-many relationship and Group is used to store a users' roles.

                我正在尝试通过添加集合来制作用户编辑表单,我希望能够通过从下拉列表中选择来添加新角色(仅限于数据库中已有的内容)

                I'm trying to make a User edit form by adding a collection, I want to be able to add a new role by selecting it from a dropdown (limited to what's already in the DB)

                用户类型.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' => 'SfoxCoreBundleEntityUser'
                        ));
                    }
                }
                

                和 GroupType.php:

                and 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" => 'SfoxCoreBundleEntityGroup'
                                ));
                    }
                }
                

                这会在基本文本框中显示表单中的角色,但是如果我在表单中添加一个条目,它会将一个新条目级联到 Groups 中,如果我要编辑一个条目,它会更改底层 Group 数据.

                This displays the roles in the form in basic text boxes, but if I add an entry to the form, it will cascade persist a new entry into Groups and if I were to edit an entry, it would change the underlying Group data.

                我尝试制作一个 GroupSelectType.php:

                I tried making a 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" => 'SfoxCoreBundleEntityGroup'
                                ));
                    }
                }
                

                将该字段添加为实体"类型,这将显示正确的选择框(但使用默认值)我似乎无法将其绑定到 UserType 表单!

                Adding the field as an "entity" type, this displays the correct select box (but with the default values) I cant seem to bind it to the UserType form!

                我想要表单做的只是修改用户实体中的底层组"ArrayCollection.

                All I want the form to do is modify the underlying 'groups' ArrayCollection in the User entity.

                有谁知道我如何做到这一点?

                Does anyone know how I can achieve this?

                推荐答案

                我为其他遇到类似问题的人制定了解决方案...

                Well I worked out a solution for anyone else struggling with similar problems...

                我必须创建一个自定义表单类型并将其声明为服务,这样我才能传入实体管理器.然后我需要制作一个 dataTransformer 将我的组对象更改为表单的整数

                I had to create a custom form type and declare it as a service so I could pass in the Entity Manager. I then needed to make a dataTransformer to change my group objects into an integer for the form

                自定义组选择类型:

                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';
                    }
                }
                

                在构造函数中,我获取所有可用组并将它们放入选择"数组中,该数组作为选项传递给选择框.

                In the constructor I'm getting all available groups and putting them into a "choices" array which is passed to the select box as an option.

                您还会注意到我正在使用自定义数据转换器,这是为了将 groupId(用于呈现表单)更改为 Group 实体.我也将 GroupSelectType 设为服务并传入 [@doctrine.orm.entity_manager]

                You'll also notice I'm using a custom data transformer, this is to change the groupId (which is used in the rendering of the form) to a Group entity. I made the GroupSelectType a service as well and passed in the [@doctrine.orm.entity_manager]

                services.yml(捆绑配置):

                services.yml (bundle config):

                services:
                    sfox_core.type.group_select:
                        class: SfoxCoreBundleFormTypeGroupSelectType
                        arguments: [@doctrine.orm.entity_manager]
                        tags:
                          - { name: form.type, alias: group_select }
                

                GroupToNumberTransformer.php

                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",因为它作为服务运行:

                And my modified UserType.php - Notice I'm using my custom form type "group_select" now as it's running as a service:

                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' => 'SfoxCoreBundleEntityUser'
                        ));
                    }
                
                    public function getName()
                    {
                        return 'sfox_corebundle_usertype';
                    }
                }
                

                这篇关于Symfony 2 嵌入式表单集合多对多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:Doctrine listener - 仅在字段更改时运行操作 下一篇:在 Doctrine Timestampable 中使用 Unix 时间戳

                相关文章

                <tfoot id='B22uz'></tfoot>

                    <bdo id='B22uz'></bdo><ul id='B22uz'></ul>

                1. <legend id='B22uz'><style id='B22uz'><dir id='B22uz'><q id='B22uz'></q></dir></style></legend>

                    <small id='B22uz'></small><noframes id='B22uz'>

                  1. <i id='B22uz'><tr id='B22uz'><dt id='B22uz'><q id='B22uz'><span id='B22uz'><b id='B22uz'><form id='B22uz'><ins id='B22uz'></ins><ul id='B22uz'></ul><sub id='B22uz'></sub></form><legend id='B22uz'></legend><bdo id='B22uz'><pre id='B22uz'><center id='B22uz'></center></pre></bdo></b><th id='B22uz'></th></span></q></dt></tr></i><div id='B22uz'><tfoot id='B22uz'></tfoot><dl id='B22uz'><fieldset id='B22uz'></fieldset></dl></div>