2011-08-23 13 views
9

Jak utworzyć listę wyboru z wartościami z tabeli bazy danych w Symfony 2?Symfony 2 Formularz z listą wyboru

Mam 2 podmioty: Student i Classroom z relacji ManyToOne i muszę utworzyć formularz z polami folowing: nazwę, nazwisko, wiek, klasie (wybierz listę z dostępnych klas).

W moim Student Formularza mam

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

W moim klasie Form mam to:

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

otrzymuję ten następujący błąd:

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 Pozdrawiam, Cearnau Dan

+0

tu wyjaśnienie: http://groups.google.com/group/symfony2/browse_thread/thread/ da8f72b33f9f93ba – tttony

Odpowiedz

24

Nie jestem pewien, czy znalazłeś odpowiedź, ale po prostu musiałem trochę pogrzebać, żeby to zrozumieć.

Klasa formularza nie jest skonfigurowana do używania Doctrine, tak jak kontroler, więc nie można odwoływać się do jednostki w ten sam sposób. To, co chcesz zrobić, to użyć opcji entity Field Type, która jest specjalnym wyborem typu pola, umożliwiając załadowanie opcji z encji Doktryny, gdy próbujesz to zrobić.

OK, tak długo, krótko mówiąc. Zamiast robić to, co robisz, aby utworzyć pole wyboru, to zrobić:

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

Nie jestem pewien, czy można umieścić funkcję query_builder do repozytorium czy co, ja niby kołysząc się dziko jak ja udać się. Do tego momentu dokumentacja, do której dołączyłem, jest dość jasna co zrobić. Myślę, że następnym krokiem jest przeczytanie Doctrine's QueryBuilder.

Chociaż jesteś tam myślę, że chcesz usunąć ten kawałek, gdzie jesteś osadzanie formularz Classroom,

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

Prawdopodobnie nie chcą ludziom tworzenie własnych klas. Chyba że to zrobisz, to tak.

+0

Tak, pole Typ pola jest tym, czego potrzebuję. – ziiweb

+0

Właśnie uratowałeś mi wiele godzin +1 –

0

Jeśli żywe są odwzorowywane, jest to czyste rozwiązanie dla Symfony 2.8+ lub 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]); 
    } 
}