2012-04-25 6 views
2

私の問題は次のとおりです。symfony2のデータベースの内容に加えてカスタム値を追加する

フォームビルダには、データベースからデータを正常に取得するドロップダウンリストがあります。

public function buildForm(FormBuilder $builder, array $options) { 
      $builder->add('Statusname', 'entity', array('empty_value' => 'All','class' => 'MyProject\EntityBundle\Entity\IssueStatusType', 'property' => 'name', 'required' => false,'query_builder' => function ($repository) { return $repository->createQueryBuilder('es')->orderBy('es.name', 'ASC'); },)) 
} 

正常に動作します。 しかし、私は、リストすなわち

public function buildForm(FormBuilder $builder, array $options) { 
      $builder->add('Statusname', 'entity', array('empty_value' => 'All','not closed' => 'Not closed','class' => 'MyProject\EntityBundle\Entity\IssueStatusType', 'property' => 'name', 'required' => false,'query_builder' => function ($repository) { return $repository->createQueryBuilder('es')->orderBy('es.name', 'ASC'); },)) 
} 

ドロップダウンに私のカスタムデータ

'not closed' => 'Not closed' 

を追加するとき、それは動作しません。何人かが私に理由を教えてくれる?

ありがとうございます。

+0

エンティティフィールドタイプを使用する場合、そのようなオプションを追加することはできません。あなたのテーブルIssueStatusTypeにオプション 'not closed'を追加するだけで、選択ボックスに表示されます。エンティティフィールドの詳細:[http://symfony.com/doc/current/reference/forms/types/entity.html] – Snroki

+0

テーブルとして「not closed」を追加できません。IssueStatusTypeは、私の多くの場所で使用されます。オプション '閉じていない'を表示してはいけません。 –

+0

だから、この投稿のようにあなたのテーブルのオプションを使って選択フィールドを作ろうとすることができます:http://stackoverflow.com/a/9491847/1259367オプションに 'not closed'オプションを追加するだけです。しかし、あなたがこの分野で関係を持っているなら、これがうまくいくかどうかはわかりません。 – Snroki

答えて

5

FormBuilder :: add()メソッドの3番目のパラメータは、オプションの連想配列です。 '閉じていません'は有効なオプションではないため、機能しません。

あなたのケースでは、カスタムコレクションを手作業で作成し、「選択」タイプを使用する必要があります。 これを機能させるには、フォームタイプにエンティティマネージャを注入する必要があります。 これはミニマリストの例です:

class IssueType extends AbstractType 
{ 
    private $entityManager; 

    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('Statusname', 'choice', array(
      'empty_value' => 'All', 
      'required' => false, 
      'choices'  => $this->buildStatusNames(), 
     ) 
    } 

    private function buildStatusNames() 
    { 
     $choices = array(); 
     $types = $this 
      ->entityManager 
      ->getRepository('MyProject\EntityBundle\Entity\IssueStatusType') 
      ->createQueryBuilder('es') 
      ->orderBy('es.name', 'ASC') 
      ->getQuery() 
      ->getResult(); 

     foreach ($types as $type) { 
      // I assume key is retrieved by getId 
      $choices[$type->getId()] = $type->getName(); 
     } 

     $choices['not closed'] = 'Not closed'; 

     return $choices; 
    } 
} 
+0

実際にこれを試しましたか?私は、これが関係を扱うときにはうまくいくとは確信していません。最終的には、IDだけでなくオブジェクトも必要です。 – Cerad

+0

いいえ、choices from dataオプションはフォームビューの作成にのみ使用され、バインディングはデータトランスフォーマ(idを使用)を介して行われます。また、オブジェクトを配列キーとして使用することはできません。 –

+0

私たちのうちの1人は非常に混乱しています。もう一度、実際にあなたの方法を試してみましたか?目標はIDだけを格納するのではなく、オブジェクト間の関係を確立することです。あなたはEntityTypeが何をしているのか見てきましたか? – Cerad

0

エンティティ関係は、ここでは、あなたのユーザーのIDの読みやすい名前が含まれていますビューのフォームを構築している、エンティティ内で管理されています。

フォームが提出されるとき、JF Simonが上記のようにidを使用してオブジェクトを取得し、送信します。エンティティですべてを正しく設定していれば、残りの部分はSymfonyが処理します。

関連する問題