1

在控制器中,我创建了一组表单来一次编辑多个类别实体:

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:必须管理传递给选择字段的实体。也许将它们保留在实体管理器中?

但是,保留它们不是一种选择,因为无论它们是否有意义,我都会在数据库中存储许多新实体。基本上,我想提供额外的空项目表格以供选择填写。我不想添加额外的空项目...

4

0 回答 0