2012-03-15 7 views
16

He creado en symfony 2 entidades: usuario y función en relación muchos a muchos. Eso significa que cada usuario puede tener más roles y se pueden establecer roles para muchos usuarios.Symfony2 casilla de verificación de muchos a muchos

clase Usuario: Clase de

/** 
    * @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; 

//.... 
} 

Rol:

/** 
* @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; 
//... 
} 

No puedo entender cómo componer generador de consultas en Symfony2 para listar todos los roles que existe y añadirlo al final de UserForm donde se pueden seleccionar (como casillas de verificación) roles otorgados al usuario. He intentado utilizar la colección como esta en UserType

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

La mejor que recibo de Symfony se filas con cuadros de texto con los nombres seleccionados de papeles. Pero esto no es, lo que necesito.

Respuesta

30

He usado tipo de entidad en lugar de la recopilación. La colección I thing se usa principalmente para crear realmente crear un objeto y asignarlo a User.

Si desea simplemente una lista de todas las funciones existentes y ser capaz de seleccionar y asignar al usuario a continuación:

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

EDITAR: esto va a mostrar el widget como un múltiplo <select>, consulte entity type para renderizar como una lista de casillas de verificación.

+8

establezca la opción 'expanded' en' true' para tener una lista de casillas de verificación. Y debe implementar el método '__toString()' en el modelo 'Rol' (usado para mostrar la etiqueta al lado de cada casilla de verificación. – GiDo

+1

Encontré que tenía que agregar otro método a la entidad Usuario para devolver roles como una Colección en lugar de como una matriz - getRolesAsCollection. –

+2

Y cómo se llama a este específico 'getRolesAsCollection' y dónde? –

6

@ user1041880: si utiliza las funciones de seguridad de Symfony (que necesita los papeles de º Euser como una matriz), puede hacerlo de esta manera:

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

Y en su clase de usuario:

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

Symfony3:

En caso de que alguien está usando 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 
)) 
+0

Tengo exactamente el mismo formato que el anterior (Symfony 3: respuesta 4). El campo representado por 'roles' se ha configurado como ManyToMany. hazlo configurar usando ArrayCollection() (también intenté sin). De cualquier forma, recibo un error y no puedo por la vida de mi entender. Me encantaría recibir algún comentario. – LoveFineArt

+0

Tengo exactamente el mismo formato que el anterior (Symfony 3: respuesta 4). El campo representado por 'roles' ha sido configurado como ManyToMany. Lo tengo configurado usando ArrayCollection() (también intenté sin). De cualquier forma, recibo un error y no puedo por la vida de averiguarlo. Me encantaría algo de fe edback. Sin ArrayCollection: ERROR = "Incapaz de transformar el valor de la propiedad" de los usuarios ":" Se esperaba un objeto Doctrine \ Common \ Collections \ Collection ". – LoveFineArt

Cuestiones relacionadas