2015-08-04 1 views
2

Я чувствую, что мне не хватает чего-то простого здесь ... TLDR: использование поля sonata_type_model, которое использует модальное значение при добавлении новых сущностей в parent, как передать родительский элемент субу, чтобы добавить его в ссылочное поле вспомогательной сущности?Как правильно установить свойство референтной сущности при создании сущности в Sonata Admin Bundle с использованием поля sonata_type_model

#

У меня есть два объекта в игре, "Пользователь" и "Роль" сущности.

Пользователь -> OneToMany -> Роль.

Я пытаюсь понять, как создавать, редактировать и удалять роли с пользовательской страницы сонаты администратора.

В моем классе UserAdmin, я настроил поля формы следующим образом:

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

Существующие роли отображаются нормально. Если я нажму кнопку «добавить» в поле ролей, появится окно Modal с полями из моей «роли» админ-формы. Моя проблема заключается в том, что когда я сохраняю новую роль, она неправильно ссылается на пользователя, на котором он был создан. Я не знаю, как передать родительский объект USER дочернему элементу ROLE! Это должно быть просто, но. Я не могу найти этот ответ нигде.

ответ

0

Если вы хотите, чтобы один пользователь мог иметь много ролей (опция «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(). Else, вы должны сделать 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 должен работать в Сонате

+0

Спасибо за ответ! Моя структура не является стандартной, между пользователями и ролями не существует много-ко-многим отношениям, но каждый объект роли специфичен для пользовательского объекта. Единственный способ, которым я смог заставить это работать, - это подключить функцию jQuery ajaxComplete(), чтобы вручную установить пользовательский объект в роли роли, как указано в моем ответе ниже – Pez

0

Я не думаю, что это предполагаемый способ решить эту проблему, но необходимости установить " user "в форме сущности" role ", которая открывается в модальном окне, когда редактирование объекта User было достигнуто с помощью функции jQuery ajaxComplete() для прослушивания открытия окна ajax, проверяя, была ли она правильной, захватывая Идентификатор пользователя из URL-адреса страницы и установка этого идентификатора в скрытом элементе формы

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]); 
     } 
    }); 
}); 

Скверный решение, но иногда нам нужно просто вещи, чтобы работать ...

Смежные вопросы