コントローラーで、フォームのコレクションを作成して、複数のカテゴリ エンティティを一度に編集します。
private function createCategoriesCrudForm($categoryCollection)
{
$new_category = new reportcategory();
$new_category->setName('New category?');
$categoryCollection->addCategory($new_category);
$form = $this->createFormBuilder($categoryCollection)
->add('categories', 'collection', array
(
'required' => false,
'allow_add' => true,
'prototype' => true,
'prototype_name' => 'proto_category',
'type' => new reportCategoryType()
))->getForm();
return $form;
}
ご覧のとおり、既存のカテゴリごとにフォームを作成し、新しいカテゴリを追加するために使用できる空のフォームを作成します。
各カテゴリには多数の項目があります。これらのアイテムは reportCategoryType() フォームに読み込まれ、フォームのコレクションでもあります。それらは次のように追加されます。
->add('items', 'collection', array
(
'required' => false,
'allow_add' => true,
'prototype' => true,
'prototype_name' => 'proto_item',
'type' => new reportItemType()
))
これはすべて機能しますが、空の reportItemType() フォームを各カテゴリの項目コレクションに追加したいと考えています。これは、項目を埋めて、カテゴリに項目を追加するためでもあります。
したがって、私の質問は次のとおりです。フォームのコレクションに余分な空のアイテムを追加するにはどうすればよいですか?
お気づきのように、カテゴリについては、フォーム定義の関連付け (OneToMany) に基づいて、各カテゴリの項目コレクションが Symfony2 によって処理されるコレクションを自分で作成します。
jQuery とプロトタイプを使用してこれを行う方法があることは知っていますが、それを避けることを目指しています。
追加した:
私が考えた 1 つの解決策は、各カテゴリをループし、その項目をフェッチし、空の項目を追加してから、各カテゴリを categoryCollection に追加することです。コードでは、これは次のようになります。
$cats = $this->getEm()->getRepository(....)->findAll();
$categoriesCollection = new reportCategoryCollection();
foreach ($cats as $cat)
{
$new_item = new reportItem();
$new_item->setName("New item?");
$cat->addItem($new_item);
foreach ($cat->getItems() as $item)
$categoriesCollection->addCategory($cat);
}
しかし、これはエラーにつながります:
FormException: 選択フィールドに渡されるエンティティは管理する必要があります。たぶんエンティティマネージャーでそれらを永続化しますか?
ただし、意味があるかどうかに関係なく、多くの新しいエンティティをDBに保存するため、それらを永続化することはオプションではありません。基本的に、必要に応じて記入できる追加の空の項目フォームを提供したいと思います。余分な空のアイテムを追加したくない...