Symfony 表单集合渲染
Symfony form collection rendering
我正在使用 symfony 2.3
我有字段类型为 "collection"
的表格
twig 中的可视化代码:
{% for field in form.fields %}
{{ form_row(field.name) }}
{% endfor %}
一切正常,期待 form.fields 为空。
然后在 twig 循环中什么都看不到, 就可以了。
但是在表单的末尾,元素 "form.fields" 有 "label"。只有标签。
解决方法:
{% for field in form.fields %}
{{ form_row(field.name) }}
{% endfor %}
<div class="hidden">
{{ form_row(form.fields) }}
如果有元素,会循环渲染。
{{ form_row }} 将为空,因为所有元素都在上面的循环中迭代。
但是,如果 form.fields 为空,则存在 "hidden"(在 div 中)标签。
我错过了什么!?为什么会这样!?
隐藏div内容:
<div class="form-group"><label class="col-sm-2 control-label required">name</label><div class="col-sm-10"><div id="my-id" data-prototype=""></div></div></div>
生成器配置:
$builder->add(
'fieldDataMappers',
'collection',
array(
'type' => new FieldDataType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
)
);
{# src/Acme/TaskBundle/Resources/views/Task/new.html.twig #}
{# ... #}
{{ form_start(form) }}
{# render the task's only field: description #}
{{ form_row(form.description) }}
<h3>Tags</h3>
<ul class="tags">
{# iterate over each existing tag and render its only field: name #}
{% for tag in form.tags %}
<li>{{ form_row(tag.name) }}</li>
{% endfor %}
</ul>
{{ form_end(form) }}
{# ... #}
Symfony2 食谱
http://symfony.com/doc/current/cookbook/form/form_collections.html
此外,集合字段的名称为 fieldDataMappers
而不是 field
。
所以我觉得应该是
{% for field in form.fieldDataMappers %}
{{ form_row(field.name) }}
{% endfor %}
正如您猜对的那样,Symfony TwigBridge 会跟踪渲染的内容和未渲染的内容。这很有用,因为有一个名为 form_rest(form)
的函数,它对打印隐藏的表单字段特别有用,并防止出现 "great jupiter! I forgot to print that field!" 时刻。 :) 您经常会在表单末尾,提交按钮之前找到 form_rest
。
还要考虑集合是一个复合表单类型,它包含子表单的变量列表。当for
循环没有触发时,由于表单类型为空,调用{{ form_row(form.fields) }}
打印出集合表单类型。默认情况下,这将打印(你已经猜到了)集合标签和一个空的 div。另一方面,当集合不为空时,Symfony 将认为集合已渲染,因为所有子项都已渲染(参见 FormView::isRendered)
您可以查看 Symfony 标准主题 form_div_layout.html.twig
,尤其是块 form_row
(显示标签打印)和 form_widget_compound
(div
和 for循环)。
因此,如果您只需要隐藏标签(又快又脏,一些 div
仍然存在),只需使用:
$builder->add(
'fieldDataMappers',
'collection',
array(
'type' => new FieldDataType(),
'label' => false,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
)
);
或者更好的是,只输出整个集合小部件,不带行:
{{ form_widget(form.fieldDataMappers) }}
或者更好的是,你打印整个集合:
{{ form_row(form.fieldDataMappers) }}
...然后添加 Twig theme 以自定义集合输出(注意名称语法和缺少的 form_label
调用):
{% block collection_row -%}
<div>
{{- form_errors(form) -}}
{{- form_widget(form) -}}
</div>
<div class="hidden">Something here?</div>
{%- endblock collection_row %}
希望对您有所帮助!
{{ form_label(form.emails) }}
<ul id="email-fields-list"
data-prototype="{{ form_row(form.emails.vars.prototype)|e }}"
data-widget-tags="{{ '<ol></ol>'|e }}"
data-widget-counter="{{ form.emails|length }}">
{% for email in form.emails %}
<ol>
{{ form_errors(email) }}
{{ form_row(email) }}
</ol>
{% endfor %}
</ul>
<button type="button" class="add-another-collection-widget" data-list-selector="#email-fields-list">Add email</button>
{{ form_widget(form.emails) }}
我只是在处理添加到集合的块之后添加 {{ form_widget(form.emails) }}
,并且在表单末尾没有更多标签。
干杯
我用 :
解决了这个问题
{{ form_label(form.collection) }}
{% for element in form.collection %}
{{ form_widget(element) }}
{% else %}
{{ form_widget(form.collection) }}
{% endfor %}
(有点晚了,我知道,但 Symfony 5 仍然有问题)
我正在使用 symfony 2.3 我有字段类型为 "collection"
的表格twig 中的可视化代码:
{% for field in form.fields %}
{{ form_row(field.name) }}
{% endfor %}
一切正常,期待 form.fields 为空。 然后在 twig 循环中什么都看不到, 就可以了。 但是在表单的末尾,元素 "form.fields" 有 "label"。只有标签。
解决方法:
{% for field in form.fields %}
{{ form_row(field.name) }}
{% endfor %}
<div class="hidden">
{{ form_row(form.fields) }}
如果有元素,会循环渲染。 {{ form_row }} 将为空,因为所有元素都在上面的循环中迭代。 但是,如果 form.fields 为空,则存在 "hidden"(在 div 中)标签。
我错过了什么!?为什么会这样!?
隐藏div内容:
<div class="form-group"><label class="col-sm-2 control-label required">name</label><div class="col-sm-10"><div id="my-id" data-prototype=""></div></div></div>
生成器配置:
$builder->add(
'fieldDataMappers',
'collection',
array(
'type' => new FieldDataType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
)
);
{# src/Acme/TaskBundle/Resources/views/Task/new.html.twig #}
{# ... #}
{{ form_start(form) }}
{# render the task's only field: description #}
{{ form_row(form.description) }}
<h3>Tags</h3>
<ul class="tags">
{# iterate over each existing tag and render its only field: name #}
{% for tag in form.tags %}
<li>{{ form_row(tag.name) }}</li>
{% endfor %}
</ul>
{{ form_end(form) }}
{# ... #}
Symfony2 食谱
http://symfony.com/doc/current/cookbook/form/form_collections.html
此外,集合字段的名称为 fieldDataMappers
而不是 field
。
所以我觉得应该是
{% for field in form.fieldDataMappers %}
{{ form_row(field.name) }}
{% endfor %}
正如您猜对的那样,Symfony TwigBridge 会跟踪渲染的内容和未渲染的内容。这很有用,因为有一个名为 form_rest(form)
的函数,它对打印隐藏的表单字段特别有用,并防止出现 "great jupiter! I forgot to print that field!" 时刻。 :) 您经常会在表单末尾,提交按钮之前找到 form_rest
。
还要考虑集合是一个复合表单类型,它包含子表单的变量列表。当for
循环没有触发时,由于表单类型为空,调用{{ form_row(form.fields) }}
打印出集合表单类型。默认情况下,这将打印(你已经猜到了)集合标签和一个空的 div。另一方面,当集合不为空时,Symfony 将认为集合已渲染,因为所有子项都已渲染(参见 FormView::isRendered)
您可以查看 Symfony 标准主题 form_div_layout.html.twig
,尤其是块 form_row
(显示标签打印)和 form_widget_compound
(div
和 for循环)。
因此,如果您只需要隐藏标签(又快又脏,一些 div
仍然存在),只需使用:
$builder->add(
'fieldDataMappers',
'collection',
array(
'type' => new FieldDataType(),
'label' => false,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
)
);
或者更好的是,只输出整个集合小部件,不带行:
{{ form_widget(form.fieldDataMappers) }}
或者更好的是,你打印整个集合:
{{ form_row(form.fieldDataMappers) }}
...然后添加 Twig theme 以自定义集合输出(注意名称语法和缺少的 form_label
调用):
{% block collection_row -%}
<div>
{{- form_errors(form) -}}
{{- form_widget(form) -}}
</div>
<div class="hidden">Something here?</div>
{%- endblock collection_row %}
希望对您有所帮助!
{{ form_label(form.emails) }}
<ul id="email-fields-list"
data-prototype="{{ form_row(form.emails.vars.prototype)|e }}"
data-widget-tags="{{ '<ol></ol>'|e }}"
data-widget-counter="{{ form.emails|length }}">
{% for email in form.emails %}
<ol>
{{ form_errors(email) }}
{{ form_row(email) }}
</ol>
{% endfor %}
</ul>
<button type="button" class="add-another-collection-widget" data-list-selector="#email-fields-list">Add email</button>
{{ form_widget(form.emails) }}
我只是在处理添加到集合的块之后添加 {{ form_widget(form.emails) }}
,并且在表单末尾没有更多标签。
干杯
我用 :
解决了这个问题{{ form_label(form.collection) }}
{% for element in form.collection %}
{{ form_widget(element) }}
{% else %}
{{ form_widget(form.collection) }}
{% endfor %}
(有点晚了,我知道,但 Symfony 5 仍然有问题)