Php Symfony表单集合呈现

Php Symfony表单集合呈现,php,forms,symfony,twig,symfony-forms,Php,Forms,Symfony,Twig,Symfony Forms,我用的是symfony2.3 我有字段类型为“collection”的表单 细枝中的可视化代码: {% for field in form.fields %} {{ form_row(field.name) }} {% endfor %} 除form.fields为空时外,一切正常。 然后细枝环里什么都看不见,巫婆没事。 但是在表单的末尾有“form.fields”元素的“label”。唯一的标签 解决方法: {% for field in form.fields %}

我用的是symfony2.3 我有字段类型为“collection”的表单

细枝中的可视化代码:

{% for field in form.fields %}
    {{ form_row(field.name) }}
{% endfor %}
除form.fields为空时外,一切正常。 然后细枝环里什么都看不见,巫婆没事。 但是在表单的末尾有“form.fields”元素的“label”。唯一的标签

解决方法:

    {% for field in form.fields %}
        {{ form_row(field.name) }}
    {% endfor %}
    <div class="hidden">
        {{ form_row(form.fields) }}

正如您正确猜测的那样,Symfony TwigBridge跟踪渲染的内容和未渲染的内容。这很有用,因为有一个名为
form\u rest(form)
的函数,它特别适用于打印隐藏的表单字段,并防止出现“伟大的朱庇特!我忘了打印该字段!”的情况您通常会在表单末尾的提交按钮前找到
form\u rest

还认为集合是一个复合表单类型,其中包含子窗体的变量列表。当未触发

for
循环时,由于表单类型为空,对
{{form_row(form.fields)}}
的调用将打印出集合表单类型。默认情况下,这将打印(您猜到)集合标签和空div。另一方面,当集合不是空的时候,SimfOny会将集合视为已呈现,因为所有的孩子都已经呈现(参见)

。 您可以查看Symfony标准主题,尤其是块
表单行
(显示标签打印)和
表单小部件复合物
(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) }}
…然后添加一个自定义集合输出,如下所示(注意名称语法和缺少的
form_标签
call):

{%block collection\u row-%}
{{-form_错误(form)-}
{{-form_小部件(form)-}
这里有什么?
{%-endblock集合_行%}

希望这有帮助

正如您正确猜测的,Symfony TwigBridge会跟踪渲染的内容和未渲染的内容。这很有用,因为有一个名为
form\u rest(form)
的函数,它特别适用于打印隐藏的表单字段,并防止出现“伟大的朱庇特!我忘了打印该字段!”的情况您通常会在表单末尾的提交按钮前找到
form\u rest

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

还认为集合是一个复合表单类型,其中包含子窗体的变量列表。当未触发

for
循环时,由于表单类型为空,对
{{form_row(form.fields)}}
的调用将打印出集合表单类型。默认情况下,这将打印(您猜到)集合标签和空div。另一方面,当集合不是空的时候,SimfOny会将集合视为已呈现,因为所有的孩子都已经呈现(参见)

。 您可以查看Symfony标准主题,尤其是块
表单行
(显示标签打印)和
表单小部件复合物
(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) }}
…然后添加一个自定义集合输出,如下所示(注意名称语法和缺少的
form_标签
call):

{%block collection\u row-%}
{{-form_错误(form)-}
{{-form_小部件(form)-}
这里有什么?
{%-endblock集合_行%}
希望这有帮助

{{form_label(form.emails)}
    {{ 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.emails%}中的电子邮件为% {{表格错误(电子邮件)} {{表格(电子邮件)} {%endfor%}
添加电子邮件 {{form_小部件(form.emails)}
我只是在block-thant处理添加到集合之后添加
{{form_widget(form.emails)}
,并且在表单的末尾不再添加标签

干杯

{{form_label(form.emails)}
    {form.emails%}中的电子邮件为% {{表格错误(电子邮件)} {{表格(电子邮件)} {%endfor%}
添加电子邮件 {{form_小部件(form.emails)}
我只是在block-thant处理添加到集合之后添加
{{form_widget(form.emails)}
,并且在表单的末尾不再添加标签

干杯

我用以下方法解决了这个问题:

{{ form_label(form.collection) }}
{% for element in form.collection %}
    {{ form_widget(element) }}
{% else %}
    {{ form_widget(form.collection) }}
{% endfor %}
(我知道有点晚了,但Symfony 5还是有问题)

我用以下方法解决了这个问题:

{{ form_label(form.collection) }}
{% for element in form.collection %}
    {{ form_widget(element) }}
{% else %}
    {{ form_widget(form.collection) }}
{% endfor %}

(我知道有点晚了,但Symfony 5仍然存在问题)

是的,我使用了一些伪代码:/。主要问题是当集合为空时。就像symfony不会将其标记为“已处理”,然后在表单的末尾呈现。如果这是一个新集合,您必须知道将不会有任何元素。您必须通过原型向集合中添加新项。是的,我使用了一些伪代码:/。主要问题是当集合为空时。就像symfony不会将其标记为“已处理”,然后在表单的末尾呈现。如果这是一个新集合,您必须知道将不会有任何元素。您必须按原型将新项目添加到集合中。当
allow\u add
allow\u delete
设置为
false
时,是否会发生这种情况?是的,它是