Флажок symfony2 many-to-many - программирование
Подтвердить что ты не робот

Флажок symfony2 many-to-many

У меня в symfony создано 2 объекта: User и Role во многих отношениях. Это означает, что у каждого пользователя может быть больше ролей и ролей, которые могут быть установлены для многих пользователей.

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

  /**
   * @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, - это строки с текстовыми полями с выбранными именами ролей. Но это не то, что мне нужно.

4b9b3361

Ответ 1

Я использовал тип сущности вместо коллекции. Я обычно собираюсь в основном создавать объект Role и назначать его User.

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

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

EDIT: это приведет к тому, что виджет станет несколько <select>, обратитесь к тип сущности, чтобы отобразить как Список флажков.

Ответ 2

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

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

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

public function getRolesAsCollection()
{
    return $this->roles;
}

Ответ 3

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
))