2011-08-23 9 views
9

Symfony 2のデータベーステーブルの値を使って選択リストを作成するにはどうすればよいですか?Symfony 2選択リスト付きフォーム

私は2つの実体がありますManyToOneの関係で学生教室を、私はfolowingフィールドを持つフォームを作成する必要があります。年齢教室(選択リストを利用可能なクラスから)。私は私の教室フォーム

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

を持っている私の学生フォーム

私はこれがあります。

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   

種類:私はこの次のエラーを取得する

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

をよろしく、 Cearnau Dan

+0

ためのクリーンなソリューションです。説明:http://groups.google.com/group/symfony2/browse_thread/thread/ da8f72b33f9f93ba – tttony

答えて

24

まだ回答が見つからないのかどうかはわかりませんが、自分のプロジェクトでこれを把握するにはちょっとした努力が必要でした。

フォームクラスは、コントローラと同じようにDoctrineを使用するように設定されていないため、同じ方法でエンティティを参照することはできません。あなたがしたいことは、あなたがしようとしているようにDoctrineエンティティからオプションを読み込むことを可能にする特殊なフィールド型であるentity Field Typeを使用することです。

大丈夫です。代わりに、あなたが選択フィールドを作成するためにやっていることの、この操作を行います。私はあなたがリポジトリまたはものにquery_builder機能を置くことができれば、私は私のように乱暴に振るのようなものだかわからない

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

を行く。ここまでで、私が上にリンクしたドキュメントは、何をすべきかについてかなり明確です。次のステップは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]); 
    } 
}