2012-02-27 2 views
3

私はSymfony2プロジェクトにエンティティタイプフォームフィールドを持っています。 getProjects()方法は、空の結果セットを返します。私がいる問題があるSymfony2エンティティフィールドは、選択肢が空の場合にすべてのエントリを表示します

$builder = $this->createFormBuilder(); 
$projects = $this->getProjects(); 

$builder->add('project', 'entity', 
     array(
      'class' => 'MyBundle:Project', 
      'required' => false, 
      'choices' => $projects, 
     )); 

、ドロップダウンリストには、プロジェクトテーブル内のすべてののプロジェクトを持っています。

この動作を無効にする方法はありますか?

+0

このリストにはどんなものがありますか?値が設定されても同じではありませんか? – AlterPHP

答えて

5

私は、選択肢とエンティティのフォームフィールドタイプの使用を混同しているため、予期しない動作が発生していると思います。

エンティティフィールド($ builder-> add()の2番目のパラメータ)を指定し、 'choices'オプションを使用して値を入力しようとしています。しかし、「選択肢」オプションはEntity field typeには直接適用できませんが、Choiceを継承していると言われています。むしろ、エンティティフィールドはデータベースの選択肢を自動的に読み込むためのものです。エンティティ 'クラス'のみを設定すると、フィールドは、昇順の主キー順でテーブルのすべてのエンティティで設定されます。エンティティのサブセットを読み込んだり、特定の順序で読み込んだりするには、 'query_builder'関数を設定することができます。

$builder->add('country', 
       'entity', 
       array('class' => 'My\Bundle\Entity\Country', 
        'property' => 'name', 
        'query_builder' => function(EntityRepository $er) { 
         return $er->createQueryBuilder('country') 
            ->orderBy('country.name', 'ASC'); 
        }, 
        'required' => true, 
        'empty_value' => false)); 

クエリは、必要に応じて単純にも複雑になることがあります。名前の昇順に、すべての国のドロップダウンリストを作成するには、例えば

、。 Using Doctrine's Query Builderを参照してください。

質問でプロジェクトフィールドを作成する方法は、ドロップダウンの基本的な選択肢が2つに設定されていると思われます。最初に 'class'オプションが設定されている場合は、 'choices'オプションが$ this-> getProjects()の結果に設定されます。おそらく後者が空の配​​列であれば、前者をオーバーライドしないので、すべてのプロジェクトがリストに表示されます。

何らかの理由でクエリービルダーを使用してドロップダウンのプロジェクトを取得できない場合は、「選択肢」フィールドタイプを使用してプロジェクトデータを手動で「選択肢」オプションにマップできます。例えば、このような何か:エンティティのフィールドのために、それは別の理由で実際のプロジェクトのエンティティになります一方、この場合には「プロジェクト」フィールドの値は、プロジェクトIDになること

$builder = $this->createFormBuilder(); 
$projects = $this->getProjects(); 

$projectChoices = array(); 
foreach ($projects as $project) { 
    $key = $project->getId(); 
    $value = $project->getName(); 
    $projectChoices[$key] = $value; 
} 

$builder->add('project', 
       'choice', 
       array('choices' => $projectChoices, 
        'required' => false)); 

注意エンティティフィールドを使用することが望ましいです。

+0

包括的な答えをありがとう。 :) 私はクエリビルダーを使用する必要がありますね。私はあなたの答えの最後の部分で小さな間違いをしたと思うフィールド型は、 'エンティティ'の代わりに '選択'でなければなりません。 –

+0

あなたは正しいですよ、ありがとう! – redbirdo

+0

アレイソリューションは問題ありません。しかし、フォームを使用してエンティティを編集すると、フォームビルダーは選択リストに値を設定できないため、失敗します。 –

関連する問題