2012-11-12 28 views
9

Giả sử có một thực thể trong Symfony2 rằng có một trường bestfriend, mà là một thực thể User được lựa chọn từ một danh sách các User thực thể đáp ứng một yêu cầu phức tạp. Bạn có thể làm cho lĩnh vực này trong một hình thức bằng cách xác định rằng nó là một entity field type, ví dụ:Entity lập bản đồ trong một lĩnh vực lựa chọn Symfony2 với optgroup

lĩnh vực
$builder->add('bestfriend', 'entity', array(
    'class' => 'AcmeHelloBundle:User', 
    'property' => 'username', 
)); 

Hình thức này được trả lại như một <select>, trong đó mỗi một trong các giá trị hiển thị ở dạng:

<option value="user_id">user_username</option> 

Vì vậy, người ta sẽ hiển thị trường bằng cách sử dụng các thẻ <optgroup> để làm nổi bật tính năng đặc biệt của bạn bè.

Tiếp theo nguyên tắc này, tôi đã tạo ra một loại lĩnh vực, cụ thể là FriendType, tạo ra các mảng sự lựa chọn như trong this answer, được trả lại như sau:

$builder->add('bestfriend', new FriendType(...)); 

Lớp FriendType tạo ra một <select> tổ chức với cùng <option> s nhưng được tổ chức theo <optgroup> s.

Ở đây tôi gặp sự cố! Khi gửi biểu mẫu, khung công tác nhận ra rằng trường người dùng không phải là một cá thể của Người dùng, nhưng nó là một số nguyên. Làm cách nào để cho Symfony2 hiểu rằng int đã truyền là id của một thực thể thuộc kiểu User?

+0

Thành thật mà nói, tôi không hiểu câu hỏi của bạn, nhưng tôi nghĩ bạn có thể giải quyết nó bằng DataTransfor mer – nikita2206

+0

@ nikita2206 Xem xét câu trả lời của riêng tôi. – JeanValjean

Trả lời

9

Dưới đây là giải pháp của tôi. Lưu ý rằng nó không được đề cập trong tài liệu chính thức Symfony2, nhưng nó hoạt động! Tôi đã khai thác thực tế là trường thực thể loại is child of choice.

Do đó, bạn chỉ có thể chuyển mảng choices làm thông số.

$builder->add('bestfriend', 'entity', array(
    'class' => 'AcmeHelloBundle:User', 
    'choices' => $this->getArrayOfEntities() 
)); 

nơi hàm getArrayOfEntities() là một chức năng mà lấp đầy danh sách lựa chọn với các bạn của bạn bè của tôi, bởi bạn bè của tôi đã tổ chức:

private function getArrayOfEntities(){ 
    $repo = $this->em->getRepository('AcmeHelloBundle:User'); 
    $friends = $repo->findAllFriendByComplexCriteria(...); 
    $list = array(); 
    foreach($friends as $friend){ 
     $name = $friend->getUsername(); 
     if(count($friend->getFriends())>0){ 
      $list[$name] = array(); 
      foreach($friend->getFriends() as $ff){ 
       $list[$name][$ff->getUsername()] = $ff; 
      } 
     } 
    } 
    return $list; 
} 

Tôi biết ví dụ có thể là vô nghĩa, nhưng nó hoạt động. ..

PS: Bạn cần phải vượt qua trình quản lý thực thể để cho phép nó hoạt động ...

+0

là có cách nào chúng ta có thể làm điều đó trong phương thức finishView? –

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