Symfony 2表单,带有选择列表

时间:2011-08-23 18:13:11

标签: php forms select doctrine symfony

如何使用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 个答案:

答案 0 :(得分:24)

不确定你是否找到了答案,但我只是需要进行一些挖掘来为我自己的项目解决这个问题。

表单类未设置为像控制器那样使用Doctrine,因此您无法以相同的方式引用Entity。你想要做的是使用entity Field Type这是一个特殊的选择字段类型,允许你按照你想要的方式从Doctrine实体加载选项。

好长话短说。不要做你正在做的事情来创建选择字段,而是这样做:

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

我不确定你是否可以将query_builder函数放入存储库或者什么,当我走的时候,我有点疯狂。到目前为止,我上面链接的文档非常清楚要做什么。我想下一步是阅读Doctrine's QueryBuilder

当你在那里时,我想你想放弃嵌入课堂表格的位置,

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

您可能不希望人们创建自己的教室。除非你这样做,否则。是的。

答案 1 :(得分:0)

如果实体已映射,则这是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]);
    }
}