如何使用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
答案 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]);
}
}