簡體   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