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



我觉得我在这里错过了一些简单的东西…TLDR:使用sonata_type_model字段,当添加新的子实体到父时使用模态,我如何将父传递给子实体以将其添加到子实体的引用字段?

<标题> #

我有两个实体在起作用,"用户"one_answers"角色"实体。

User -> OneToMany -> Role.

我想弄清楚如何从用户的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实体!这应该很简单,但是。我找不到这个答案

如果你希望一个User可以有多个角色('multiple => true'选项在你的类中),并且角色可以被许多用户使用,你应该选择ManyToMany关系。

使用这样的东西来代替实际的OneToMany:

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

在子实体中:

//EntityRole
/**
* @ORMManyToMany(targetEntity="User", inversedBy="roles", cascade={"persist", "remove"})
* @ORMJoinTable(name="users_roles",
*     joinColumns={@ORMJoinColumn(name="role_id", referencedColumnName="id")},
*     inverseJoinColumns={@ORMJoinColumn(name="user_id", referencedColumnName="id")}
* )     *
* @var ArrayCollection $users
*/
protected $users;

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

如果它是好的,你必须编辑你的addRole()和removeRole()方法。

她一定是这样的:

public function addRole(NamespaceBundleEntityRole $roles)
{
     $this->roles[] = $roles;
     $roles->addUser($this);
     return $this;
}
public function removeRole(NamespaceBundleEntityRole $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]);
        }
    });
});

一个讨厌的解决方案,但有时我们只是需要的东西工作…

最新更新