在控制器中,我创建了一组表单来一次编辑多个类别实体:
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() 表单添加到每个类别的项目集合中。这也是为了填写它,并在类别中添加一个额外的项目。
因此我的问题是:如何向表单中的集合添加额外的空项目?
正如您将注意到的,对于类别,我自己创建集合,其中每个类别的项目集合由 Symfony2 基于其表单定义中的关联(OneToMany)处理。
我知道有一种方法可以使用 jQuery 和原型来做到这一点,但我的目标是避免这种情况。
添加:
我想到的一种解决方案是遍历每个类别,获取其项目,添加一个空项目,然后将每个类别添加到 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:必须管理传递给选择字段的实体。也许将它们保留在实体管理器中?
但是,保留它们不是一种选择,因为无论它们是否有意义,我都会在数据库中存储许多新实体。基本上,我想提供额外的空项目表格以供选择填写。我不想添加额外的空项目...