2012-03-15 13 views
16

Symfony'de 2 öğe oluşturdum: Çoktan çoğa ilişkide Kullanıcı ve Rol. Bu, her kullanıcının daha fazla role sahip olabileceği ve rollerin birçok kullanıcıya ayarlanabileceği anlamına gelir.symfony2 çoktan çoğuna form onay kutusu

Kullanıcı sınıfı:

/** 
    * @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 sınıfı:

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

ben var tüm rolleri listelemek ve sonunda eklemek için Symfony2'deki sorgu oluşturucu oluşturmak için nasıl anlamaya olamaz UserForm, kullanıcıya verilen rolleri (onay kutuları olarak seçilebilir) seçilebilir. Ben rolleri seçilmiş isimlerle Kullanıcıtürü

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

ben symfony aldığım en iyi böyle textboxes satırları koleksiyonu vardır kullanmaya çalıştı. Ama bu, ihtiyacım olan şey değil.

cevap

30

Koleksiyon yerine varlık türü kullanıyorum. Ben aslında koleksiyon aslında bir Role nesne oluşturmak için kullanılır ve User için atayın. entity type bakın bu katları <select> olarak widget'ı verecek:

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

DÜZENLEME: Sadece mevcut tüm rolleri listelemek ve seçmek mümkün ve daha sonra kullanıcıya atamak isterseniz

onay kutusu listesi olarak işlemek için

+8

"genişletilmiş" seçeneğini onay kutusuna sahip olmak için "true" olarak ayarlayın. Ve 'Role' modelinde '__toString()' yöntemini uygulamanız gerekir (her onay kutusunun yanındaki etiketi görüntülemek için kullanılır. – GiDo

+1

Kullanıcı varlığına rolleri Koleksiyon olarak döndürmek için Kullanıcı varlığına başka bir yöntem eklemem gerektiğini buldum. Bir dizi - getRolesAsCollection –

+2

Ve bu özel 'getRolesAsCollection' olarak nasıl adlandırırsınız ve nerede? –

6

user1041880 @:

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

Ve kullanıcı sınıfında: Eğer (bir dizi olarak inci Euser rollerini ihtiyacı olan) symfony güvenlik işlevlerini kullanırsanız, böyle yapabilirsin

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

Symfony3: durumda herkes yılında

Symfony3 kullanıyor:

+0

Tam olarak yukarıdakiyle aynı biçime sahibiz (Symfony 3: answer 4) 'roller' ile gösterilen alan ManyToMany olarak ayarlanmıştır. ArrayCollection() kullanarak kurulum yapınız (ayrıca denemedim) Her iki durumda da bir hata alıyorum ve benim yaşamım için bunu anlayamıyorum Bazı geri bildirimleri çok isterim .. – LoveFineArt

+0

Yukarıdaki gibi aynı formatta var (Symfony 3: Cevap 4) 'rolleri' ile temsil edilen alan ManyToMany olarak ayarlanmıştır.ArayCollection() (aynı zamanda denemeden) kullanarak kurdum. Her iki şekilde de bir hata alıyorum ve benim için hayatımı anlayamıyorum. Biraz seveceksin edback. ArrayCollection olmadan: ERROR = "Özellik yolu için" değer "dönüştürülemiyor" kullanıcılar ": Bir Doctrine \ Common \ Collections \ Collection nesnesi bekleniyor." – LoveFineArt