2011-08-23 44 views
9

我如何创建一个选择列表与Symfony 2中的数据库表中的值?Symfony 2表单与选择列表

我有2个实体:学生课堂有多对一的关系,我需要创建与如下因素字段的表单:年龄教室(选择列表从可用的类)。

在我学生表格我有

$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

这里的解释:http://groups.google.com/group/symfony2/browse_thread/thread/ da8f72b33f9f93ba – tttony

回答

24

不知道你是否找到了答案,但我只需要做一些挖掘工作,找出我自己的项目。

表单类没有设置为使用Doctrine就像控制器一样,因此您无法以同样的方式引用实体。你想要做的是使用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()) 

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

+0

是的,实体字段类型是我所需要的。 – ziiweb

+0

你刚刚为我节省了很多时间,+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]); 
    } 
}