symfony2 флажок "многие ко многим" - PullRequest
19 голосов
/ 15 марта 2012

Я создал в Symfony 2 сущности: Пользователь и Роль в отношениях «многие ко многим». Это означает, что у каждого пользователя может быть больше ролей, а роли могут быть установлены для многих пользователей.

Класс пользователя:

  /**
   * @ORM\Entity
   * @ORM\Table(name="JEP_User")
   * @ORM\Entity(repositoryClass="Chrchel\JepBundle\Repository\UserRepository")
   */
class User implements AdvancedUserInterface {

/**
 * @ORM\Id()
 * @ORM\Column(name="id",type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(name="username",type="string",length=100,unique=true)
 */
private $username;

 /**
 * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
 *
 */
protected $roles;

//....
}

Класс роли:

/**
 * @ORM\Table(name="JEP_Role")
 * @ORM\Entity()
 */
 class Role implements RoleInterface {

/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

  /** @ORM\Column(name="name", type="string", length=30) */
protected $name;

 /** @ORM\Column(name="role", type="string", length=20, unique=true) */
protected $role;

 /** @ORM\ManyToMany(targetEntity="User", mappedBy="roles") */
protected $users;
 //...
 }

Я не могу понять, как составить построитель запросов в Symfony2, чтобы перечислить все существующие роли и добавить его в конец UserForm, где можно выбрать (в виде флажков) роли, предоставленные пользователю. Я пытался использовать коллекцию, как это в UserType

->add('roles', 'collection',array('label' => 'Role', 'required' => false,'type'=> new RoleType()))

Лучшее, что я получаю от Symfony - это строки с текстовыми полями с выбранными именами ролей. Но это не то, что мне нужно.

Ответы [ 3 ]

31 голосов
/ 15 марта 2012

Я использовал тип сущности вместо коллекции. В общем, коллекция вещей используется для создания объекта Role и присвоения ему User.

Если вы хотите просто перечислить все существующие роли и иметь возможность выбрать и назначить их пользователю, тогда:

->add('roles', 'entity', array(
    'class' => 'MyBundle:Role',
    'property'     => 'name',
    'multiple'     => true
));

РЕДАКТИРОВАТЬ : при этом виджет будет отображаться как кратный <select>, см. тип сущности для отображения в виде списка флажков.

8 голосов
/ 10 сентября 2016

Symfony3:

В случае, если кто-то использует Symfony3 :

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

->add('roles', EntityType::class, array( // <-- EntityType::class is unique to Symfony3
    'class' => 'AppBundle:Role',
    'choice_label' => 'name', // <-- choice_label is unique to Symfony3
    'multiple' => true
))
6 голосов
/ 09 июля 2012

@ user1041880: Если вы используете функции безопасности Symfony (которым нужны роли пользователя в качестве массива), вы можете сделать это следующим образом:

->add('rolesAsCollection', 'entity', array(
    'class' => 'MyBundle:Role',
    'property'     => 'name',
    'multiple'     => true
));

И в вашем классе пользователя:

public function getRolesAsCollection()
{
    return $this->roles;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...