2012-03-15 40 views
16

Tôi có trong symfony đã tạo 2 thực thể: Người dùng và Vai trò trong mối quan hệ nhiều-nhiều. Điều đó có nghĩa là mọi người dùng đều có thể đặt nhiều vai trò và vai trò hơn cho nhiều người dùng.symfony2 hộp kiểm tra nhiều biểu mẫu

tài lớp:

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

//.... 
} 

Vai trò lớp:

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

tôi không thể hình dung làm thế nào để soạn xây dựng truy vấn trong Symfony2 để liệt kê tất cả các vai trò đó tồn tại và bổ sung nó vào cuối cùng của UserForm, nơi có thể được chọn (như hộp kiểm) vai trò được cấp cho người dùng. Tôi cố gắng để sử dụng bộ sưu tập như thế này trong loại người dùng

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

Điều tốt nhất tôi nhận được từ symfony được hàng với textbox với những cái tên được lựa chọn vai diễn. Nhưng đây không phải là những gì tôi cần.

Trả lời

30

Tôi đã sử dụng loại đối tượng thay vì thu thập. Bộ sưu tập đồ vật chủ yếu được sử dụng để thực sự tạo đối tượng Role và gán nó cho User.

Nếu bạn muốn chỉ cần liệt kê tất cả vai trò hiện tại và có thể lựa chọn và gán nó cho người sử dụng thì:

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

EDIT: điều này sẽ làm cho các widget như một bội số <select>, hãy tham khảo entity type để hiển thị dưới dạng danh sách hộp kiểm.

+8

đặt tùy chọn 'mở rộng' thành 'true' để có danh sách hộp kiểm. Và bạn cần triển khai phương thức '__toString()' trên mô hình 'Role' (được sử dụng để hiển thị nhãn bên cạnh mỗi hộp kiểm. – GiDo

+1

Tôi thấy mình phải thêm một phương thức khác vào thực thể User để trả về vai trò như một Collection thay vì một mảng - getRolesAsCollection –

+2

Và làm thế nào để bạn gọi cụ thể là 'getRolesAsCollection' và ở đâu? –

6

@ user1041880: Nếu bạn sử dụng các chức năng an ninh symfony (mà cần vai trò của euser thứ như một mảng), bạn có thể làm điều đó như thế này:

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

Và trong lớp người dùng của bạn:

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

Symfony3:

Trong trường hợp bất cứ ai đang sử dụng 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

Tôi có cùng định dạng như trên (Symfony 3: answer 4). Trường được biểu diễn bằng 'roles' đã được thiết lập là ManyToMany. có nó thiết lập bằng cách sử dụng ArrayCollection() (cũng đã cố gắng mà không có). Dù bằng cách nào tôi nhận được một lỗi và không thể cho cuộc sống của tôi con số nó ra.Chúng tôi sẽ yêu một số thông tin phản hồi – LoveFineArt

+0

Tôi có định dạng chính xác như trên (Symfony 3: Câu trả lời 4) .Các lĩnh vực đại diện bởi 'vai trò' đã được thiết lập như ManyToMany.Tôi có nó thiết lập bằng cách sử dụng ArrayCollection() (cũng đã cố gắng mà không có). Dù bằng cách nào tôi nhận được một lỗi và không thể cho cuộc sống của tôi con số nó ra. Sẽ yêu một số fe edback. Không có ArrayCollection: ERROR = "Không thể chuyển đổi giá trị cho đường dẫn thuộc tính" người dùng ": Dự kiến ​​một Doctrine \ Common \ Collections \ Collection object." – LoveFineArt

Các vấn đề liên quan