<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 嵌入式表单集合多对多

      Symfony 2 Embedded Form Collection Many to Many(Symfony 2 嵌入式表单集合多对多)

    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 嵌入式表单集合多对多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以
                PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的
                mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)
                Laravel Gmail Configuration Error(Laravel Gmail 配置错误)
                Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)
                Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)
                <tfoot id='B22uz'></tfoot>

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

                    • <legend id='B22uz'><style id='B22uz'><dir id='B22uz'><q id='B22uz'></q></dir></style></legend>

                            <tbody id='B22uz'></tbody>

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

                        • <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>