![](/img/trans.png)
[英]Custom choices list of sonata_type_model field with Sonata Admin
[英]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.