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

时间:2015-05-01 12:49:16

标签: forms symfony

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

form_row(form.items)

然后,当我尝试自己呈现它时,它会重复。

这是我的twig文件中的代码:

{{ 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) }}

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

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

这里添加的是我的输出:

<!-- 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>

你有什么想法会发生这种情况吗?

我跟着documentation。我错过了什么吗?

编辑:

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

3 个答案:

答案 0 :(得分:4)

我找到了解决方案。

事实证明,当集合为空时,它的渲染永远不会发生。我可以使用 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) }}

答案 1 :(得分:3)

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

然后在表单末尾执行form_end。这通常不是什么大问题,但是from the docs

  

除非您将form_rest()设置为false

,否则此助手也会输出render_rest

因此,您必须简单地为false传递render_rest值:

{{ form_end(form, {'render_rest': false}) }}

我不确定form_widget 如何解决您的问题,但我也不确定您是如何尝试这种替代方案的 - 也许您是在for循环。

另外,您应该考虑制作自己的form.html.twig模板文件,以便重复使用您为收藏选择的标记格式。它允许您只需执行form_widget(...)而无需拆分碎片,即使收集为空,您的form_end也会始终考虑输出字段。

答案 2 :(得分:0)

不幸的是我还没有评论(没有50代表),但也许这是浏览器本身造成的。由于某处标记而导致渲染问题?查看原始http响应是否具有相同的功能。因为它适用于form_row(form.items)而不是你自己的,它可能是&#34;那。

我会在输出之前检查它是否为空。