Symfony2 - 集合类型在我的视图中显示两次

A.D*_*.D. 2 forms symfony

我有一个带有集合的表单,当我使用以下语法时,我可以正确地看到它:

form_row(form.items)
Run Code Online (Sandbox Code Playgroud)

然后当我尝试自己渲染它时,它被复制了。

这是我的树枝文件中的代码:

{{ form_errors(form) }}
{{ form_start(form) }}

    ... some fields here ...

    <div id="{{ form.items.vars.id }}" class="collection items" data-prototype="{{ form_widget(form.items.vars.prototype)|e }}">
        <h3>{{ form_label(form.items) }}</h3>
        <a href="#" class="add_link">Add</a>
        {% for item in form.items %}
            {{ form_row(item) }}
        {% endfor %}
    </div>

    ... some other fields here ...

{{ form_end(form) }}
Run Code Online (Sandbox Code Playgroud)

这是我的表单对象中的代码:

    $builder->add('items', 'collection', array(
        'type' => new ItemType(),
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
        'required' => true,
    ));
Run Code Online (Sandbox Code Playgroud)

添加这里是我的输出:

<!-- This is the one I need, I removed the prototype for the sake of clarity -->
<div id="bundle_data_items" class="collection items" data-prototype="...">
    <h3>
        <label class="required">Items</label>
    </h3>
    <a href="#" class="add_link">Add</a>
</div>
<!-- This one is automatically added. The prototype is empty -->
<div>
    <label class="required">Items</label>
    <div id="bundle_data_items" data-prototype=""></div>
</div>
Run Code Online (Sandbox Code Playgroud)

你知道为什么会发生这种情况吗?

我遵循了那个文档。我错过了什么?

编辑:

仅当我的收藏为空时才会发生这种情况

sja*_*agr 5

当你的集合为空时,for循环{% for item in form.items %}永远不会执行,因此form_row(item)永远不会发生。这意味着,对于 Twig/Symfony,您从未真正输出过该字段。

然后你form_end在表格的最后做。这通常不是什么大问题,但从文档来看

这个助手也会输出form_rest(),除非你设置render_rest为 false

因此,您必须简单地传递一个falserender_rest

{{ form_end(form, {'render_rest': false}) }}
Run Code Online (Sandbox Code Playgroud)

我不确定如何form_widget 解决您的问题,但我也不确定您如何尝试该替代方案 - 也许您在循环之外运行它for

另外,您应该考虑制作自己的form.html.twig模板文件,以便可以重用为集合选择的标记格式。它将允许您简单地进行操作,form_widget(...)而无需分解各个部分,并且form_end即使集合为空,您也将始终考虑要输出的字段。


A.D*_*.D. 5

我找到了解决方案。

事实证明,当集合为空时,它的渲染永远不会发生。我可以使用sjagr解决方案,但由于我想自动渲染一些字段,我无法使用它。

所以我的解决方案如下:

{{ form_errors(form) }}
{{ form_start(form) }}

    ... some fields here ...

    <div id="{{ form.items.vars.id }}" class="collection items" data-prototype="{{ form_widget(form.items.vars.prototype)|e }}">
        <h3>{{ form_label(form.items) }}</h3>
        <a href="#" class="add_link">Add</a>
        {% for item in form.items %}
            {{ form_row(item) }}
        {% else %}
            {% do form.items.setRendered %}
        {% endfor %}
    </div>

    ... some other fields here ...

{{ form_end(form) }}
Run Code Online (Sandbox Code Playgroud)