Symfony 2 Форма со списком выбора - PullRequest
9 голосов
/ 23 августа 2011

Как создать список выбора со значениями из таблицы базы данных в Symfony 2?

У меня есть 2 объекта: Студент и Класс с отношением ManyToOne, и мне нужно создать форму с полями: name , фамилия , возраст , класс (выберите список из доступных классов).

В моей Студенческой форме У меня есть

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

В моем классе у меня есть это:

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

Я получаю следующую ошибку:

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         

С уважением, Cearnau Dan

Ответы [ 2 ]

24 голосов
/ 21 сентября 2011

Не уверен, что вы уже нашли ответ, но мне просто пришлось немного покопаться, чтобы выяснить это для моего собственного проекта.

Класс формы не настроен для использования Doctrine, как контроллер, поэтому вы не можете ссылаться на Entity таким же образом. То, что вы хотите сделать, это использовать тип поля сущности , который является специальным выбором Тип поля, позволяющим вам загружать опции из сущности Doctrine, как вы пытаетесь это сделать.

Хорошо, так долго рассказывать. Вместо того, чтобы делать то, что вы делаете, чтобы создать поле выбора, сделайте это:

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

Я не уверен, что вы могли бы поместить функцию query_builder в репозиторий или что-то в этом духе, я как бы круто качаюсь на ходу. До этого момента документация, на которую я ссылался выше, довольно ясно о том, что делать. Я предполагаю, что следующим шагом будет чтение QueryBuilder от Doctrine .

Пока вы там, я думаю, что вы хотите отбросить тот момент, когда встраиваете форму класса,

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

Вы, вероятно, не хотите, чтобы люди создавали свои собственные классные комнаты. Если вы этого не сделаете, тогда да.

0 голосов
/ 05 августа 2016

Если сущности сопоставлены, это чистое решение для Symfony 2.8+ или 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]);
    }
}
...