1

我想更新多个实体,并通过更新添加一个名为“comment”的字段。该字段与实体无关;我会将评论保存在单独的表格中。

这是我尝试过的(下面的控制器代码) -这只是代码示例,但应该让我了解我正在尝试做什么:

$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)。似乎表单构建器忽略了我添加的所有子表单,只使用最后一个 - 在查看进入数据库的 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')

制作了一个实体数组,并在 twig 中呈现该实体的评论字段,如下所示:

{% for entity in entities %}
...
{% set child = "comment_" ~ entity.id %}{{ form_widget(form.children[child]) }}
...
于 2013-01-31T12:09:03.120 回答
0
  1. 您的示例代码包含错误:您在循环后添加 $subform,因此您仅显式添加最后生成的 $subform 对象。

  2. 注释行$this->children[$child->getName()] = $child;阻止了添加子表单构建器的“简单”方式,但有一种解决方法:

您可以使用显式名称创建 biulder,而不是为子表单调用$this->createFormBuilder()助手(这将给它命名为“form”)$this->container->get('form.factory')->createNamedBuilder('sub_form_1')

于 2015-06-15T16:38:00.197 回答