1

複数のエンティティを更新したいと思います。更新に伴い、「コメント」というフィールドを追加したいと考えています。このフィールドはエンティティに関連していません。コメントは別のテーブルに保存します。

これは私が試したものです(以下のコントローラーコード)-これはコードの単なるサンプルですが、私がやろうとしていることのアイデアを与えるはずです:

$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())

それは動作します。残念ながら、これは小枝内のサブフォームをループできないことを意味します。

4

2 に答える 2

0

上記の説明/質問どおりには機能しません。

->add

次に示すように、その子の以前のコピーを上書きします。

Symfony\Component\Form
...
public function add(FormInterface $child)
...
$this->children[$child->getName()] = $child;

問題を「解決」するために、サブフォームのアイデアを破棄し、次のように各項目に個別に名前を付けました。

$form
...
->add("comment_$id", 'textarea')

エンティティの配列を作成し、小枝でそのエンティティのコメント フィールドを次のようにレンダリングします。

{% for entity in entities %}
...
{% set child = "comment_" ~ entity.id %}{{ form_widget(form.children[child]) }}
...
于 2013-01-31T12:09:03.120 に答える