複数のエンティティを更新したいと思います。更新に伴い、「コメント」というフィールドを追加したいと考えています。このフィールドはエンティティに関連していません。コメントは別のテーブルに保存します。
これは私が試したものです(以下のコントローラーコード)-これはコードの単なるサンプルですが、私がやろうとしていることのアイデアを与えるはずです:
$form = $this->createFormBuilder();
foreach (array(1,2,3) as $id) {
$subform = $this->createFormBuilder()
->add('story', 'entity', array(
'class' => 'AcmeDemoBundle:Story',
'query_builder' => function($em) use ($id) {
$qb = $em->createQueryBuilder('s')
$qb->select(array('j'))
->add('from', 'AcmeDemoBundle:Story')
->addWhere('j.id = :id')
->setParameter('id', $id);
return $qb;
},
'property' => 'id',
'required' => true, 'expanded' => true, 'multiple' => true
)
->add('comment', 'textarea');
}
$form->add($subform, '', array('label' => '');
...
// then I send the form to the template with $form->createView()
私が期待していたのは、各エンティティ (1、2、3) がチェックボックスで、その横にコメント ブロックがあるフォームでした。代わりに、配列内の最後のエンティティ (上記の場合、エンティティ番号 3) に対して、1 つのチェックボックスと 1 つのコメントのみを取得します。フォーム ビルダーは、追加したすべてのサブフォームを無視し、最後のサブフォームのみを取得しているようです。これは、DB に送信される SQL を見る場合にも当てはまります。# 3 の選択のみがあり、1 の選択はありません。 2.
生成された html が私がやろうとしていることをサポートしていることを考えると、上記が機能することを期待しています。
<input type="checkbox" id="form_form_story_0" name="form[form][story][]" value="3">
<textarea id="form_form_comment" name="form[form][comment] />
また、フィールドに一意の名前を付けようとしました-たとえば ->add('story_' . $id) などですが、何もしませんでした。また、各クエリビルダーに一意の名前 $em->createQueryBuilder('s'.$id) を付けようとしましたが、それもうまくいきませんでした。
また、query_builder を削除すると機能しません (そしてクラスを使用するだけです)。
更新:プレーンテキストフィールドでサブフォームを作成しようとしても、エンティティとは何の関係もないようです...
サブフォームの名前が異なる場合は、次を使用して2 を更新します。
$subForm = $this->get('form.factory')->createNamedBuilder("form$id"), 'form', array())
それは動作します。残念ながら、これは小枝内のサブフォームをループできないことを意味します。