我有一个带有集合的表单,当我使用以下语法时,我可以正确地看到它:
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。我错过了什么吗?
仅当我的收藏品为空时才会发生这种情况
答案 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()
设置为falserender_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;那。
我会在输出之前检查它是否为空。