繁体   English   中英

在使用sonata_type_model字段在Sonata Admin Bundle中创建子实体时如何正确设置引用实体属性

[英]How to properly set referring entity property when creating sub entity in Sonata Admin Bundle using sonata_type_model field

我觉得这里缺少一些简单的东西... TLDR:使用sonata_type_model字段,在将新的子实体添加到父实体时使用模式,如何将父实体传递给子实体以将其添加到子实体的参考字段中?

我在玩两个实体,“用户”和“角色”实体。

用户-> OneToMany->角色。

我试图弄清楚如何从用户的Sonata Admin Bundle页面上创建,编辑和删除角色。

在我的UserAdmin类中,我已经配置了表单字段,如下所示:

$formmapper->add('roles', 'sonata_type_model', array(
                'required' => false,
                'btn_delete' => true,
                'btn_list' => true,
                'multiple' => true,
                'btn_add' => true,
            ))

现有角色显示良好。 如果单击角色字段下的“添加”按钮,将出现“模态”窗口,其中包含我的“角色”管理表单中的字段。 我的问题是,当我保存新角色时,它没有正确引用创建它的用户。 我不知道如何将父USER实体传递给子ROLE实体! 这应该很简单,但是。 我在任何地方都找不到这个答案

如果您希望一个用户可以有多个角色(类中的“ multiple => true”选项),并且角色可以被多个用户使用,则您应该首选ManyToMany关系。

使用类似这样的东西来替换您实际的OneToMany

//Entity\User   

/**
* @ORM\ManyToMany(targetEntity="Role", mappedBy="users", cascade={"persist"})
*/
protected $roles;

在您的孩子实体中:

//Entity\Role

/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="roles", cascade={"persist", "remove"})
* @ORM\JoinTable(name="users_roles",
*     joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
*     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
* )     *
* @var ArrayCollection $users
*/
protected $users;

您的父实体(用户)应具有方法addRole(),removeRole()和getRole()。 否则,您应该执行php app/console doctrine:generate:entities

如果很好,则必须编辑addRole()和removeRole()方法。

她一定是这样的:

public function addRole(\Namespace\Bundle\Entity\Role $roles)
{
     $this->roles[] = $roles;
     $roles->addUser($this);

     return $this;
}

public function removeRole(\Namespace\Bundle\Entity\Role $roles)
{
    $this->roles->removeElement($roles);
    $roles->removeUser($this);
}

然后,您的addRole应该在Sonata中工作

我不认为这是解决此问题的预期方法,但是需要使用jQuery ajaxComplete()在编辑用户实体时在模式窗口中打开的“角色”实体窗体上设置“用户”实体)函数以侦听ajax窗口的打开情况,检查其是否正确,从页面URL中获取用户ID,然后在隐藏的表单元素中设置该ID

jQuery(document).ready(function() {
    $(document).ajaxComplete(function (event, request, settings) {
        if (settings.url.indexOf('/your-entity-admin-path-') >= 0){
            var pathArray = window.location.pathname.split( '/' );
            $('.modal-body .box-body input[type=hidden]').val(pathArray[3]);
        }
    });
});

令人讨厌的解决方案,但有时我们只需要工作即可...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM