2011-08-23 37 views
9

Làm cách nào để tạo danh sách lựa chọn với các giá trị từ một bảng cơ sở dữ liệu trong Symfony 2?Biểu mẫu Symfony 2 với danh sách lựa chọn

Tôi có 2 thực thể: StudentClassroom với một mối quan hệ ManyToOne và tôi cần phải tạo ra một hình thức với các trường folowing: tên, họ, tuổi, lớp học (chọn danh sách từ các lớp có sẵn).

Trong Mẫu Sinh viên của tôi tôi có

$builder 
     ->add('name') 
     ->add('surname') 
     ->add('age') 
     ->add('classroom', new ClassroomType()) 
    ; 

Trong lớp Mẫu của tôi có điều này:

$classrooms =$this->getDoctrine()->getRepository('UdoCatalogBundle:Classroom')->findAll(); 
    $builder 
     ->add('clasa','choice',array('choices' => array($classrooms->getId() => $classrooms->getName()))); 

tôi có được điều này báo lỗi sau:

Fatal error: Call to undefined method Udo\CatalogBundle\Form\ClassroomType::getDoctrine() in /var/www/html/pos/src/Udo/CatalogBundle/Form/ClassroomType.php on line 13   

Kind Trân trọng, Cearnau Dan

+0

đây giải thích: http://groups.google.com/group/symfony2/browse_thread/thread/ da8f72b33f9f93ba – tttony

Trả lời

24

Không chắc chắn nếu bạn tìm thấy câu trả lời chưa nhưng tôi chỉ cần làm một số đào xung quanh để tìm ra điều này cho dự án của riêng tôi.

Lớp biểu mẫu không được thiết lập để sử dụng Doctrine như bộ điều khiển để bạn không thể tham chiếu thực thể theo cùng một cách. Những gì bạn muốn làm là sử dụng các entity Field Type đó là một lựa chọn đặc biệt Field Type cho phép bạn tải các tùy chọn từ một thực thể Doctrine như bạn đang cố gắng làm.

Ok câu chuyện dài quá ngắn. Thay vì làm những gì bạn đang làm để tạo ra các lĩnh vực lựa chọn, thực hiện điều này:

->add('category', 'entity', array(
    'class' => 'VendorWhateverBundle:Category', 
    'query_builder' => function($repository) { return $repository->createQueryBuilder('p')->orderBy('p.id', 'ASC'); }, 
    'property' => 'name', 
)) 

Tôi không chắc chắn nếu bạn có thể đặt các chức năng query_builder vào một kho lưu trữ hoặc những gì, tôi là loại lắc lư một cách hoang dại như tôi đi. Đến thời điểm này tài liệu tôi liên kết ở trên là khá rõ ràng về những gì để làm. Tôi đoán bước tiếp theo là đọc trên Doctrine's QueryBuilder.

Trong khi bạn đang ở trong đó tôi nghĩ rằng bạn muốn thả các bit mà bạn đang nhúng các hình thức lớp học,

->add('classroom', new ClassroomType()) 

Bạn có lẽ không muốn mọi người tạo ra các lớp học riêng của họ. Trừ khi bạn làm, sau đó yeah.

+0

Vâng, thực thể Loại trường là những gì tôi cần. – ziiweb

+0

Bạn vừa lưu tôi rất nhiều giờ, +1 –

0

Nếu các thực thể được ánh xạ, đây là một giải pháp sạch cho Symfony 2.8+ hoặc 3+

<?php 

namespace My\AppBundle\Form\Type; 

use My\AppBundle\Entity\Student; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class StudentType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('surname') 
      ->add('age') 
      /* 
      * It will be resolved to EntityType, which acts depending on your doctrine configuration 
      */ 
      ->add('classroom'); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => Student::class]); 
    } 
} 
Các vấn đề liên quan