8

在文档中,Symfony 中有一种方法可以根据小部件的名称/ID自定义单个字段。

{% form_theme form _self %}

{% block _product_name_widget %}
    <div class="text_widget">
        {{ block('field_widget') }}
    </div>
{% endblock %}

{{ form_widget(form.name) }}

在这里,_product_name_widget 片段定义了用于 id 为 product_name(名称为 product[name])的字段的模板。

这适用于普通小部件,但如果小部件位于集合内,则不适用。因为额外的列。像这样:

name="productbundle_product_type[foobar][1][value]" id="productbundle_product_type_foobar_1_value"

使 Twig 自定义在集合中工作的方法是什么?

我想过这样的事情,但这不起作用:

{% for db in edit_form.list %}
    {% block _productbundle_product_type_foobar_{{ db.name }}_widget %}
        <div class="text_widget">
            {{ block('field_widget') }}
        </div>
    {% endblock %}
{% endfor %}

即使以下方法也不起作用:

{% _productbundle_product_type_foobar_1_value_widget %}

使它工作的方法是什么?

4

3 回答 3

3

几天前我在做一个项目,正好遇到了这个问题——我找到的解决方案是一对看起来像这样的块(去掉了项目特定的代码):

{# Collection markup #}
{% block my_collection_widget %}
    {# Customise collection row prototype for allow_add #}
    {% if prototype is defined %}
        {% set data_prototype = block('my_collection_item_widget')  %}
        <div id="my_prototype" data-prototype="{{ data_prototype }}" style="display: none"></div>
    {% endif %}

    {% for prototype in form %}
        {{ block('my_collection_item_widget') }}
    {% endfor %}
{% endblock my_collection_widget %}

{# Collection row markup #}
{% block my_collection_item_widget %}
    {# Collection contains simple, single type #}
    {{ form_errors(prototype) }}
    {{ form_label(prototype) }}
    {{ form_widget(prototype) }}

    {# OR #}

    {# Collection contains a compound type, render child types independantly #}
    {{ form_errors(prototype.inner_widget) }}
    {{ form_label(prototype.inner_widget) }}
    {{ form_widget(prototype.inner_widget) }}
{% endblock my_collection_item_widget %}
于 2013-06-18T15:33:31.390 回答
1

这里有几件事:

1. 文档错误

文档似乎与CamelCase 实体有点不一致。至于 5.3 它应该是:(_taskManager_taskLists_entry_widget而不是_task_manager_task_lists_entry_widget

您可以通过转储表单或表单字段来确认命名:{{ dump(form) }}{{ dump(form.yourField) }}在您的模板中,然后unique_block_prefix在该vars部分中查找。

2.不要使用块覆盖,宏更容易

它使事情变得绝对比必要的复杂。只需定义一个宏:

{% import _self as formMacros %}
{% macro formatCollection(form) %}
    <div class="form-group row">
        <div>
            {{ form_widget(form.field1) }}
            {{ form_widget(form.field2) }}
            {{ form_widget(form.field3) }}
        </div>
    </div>
{% endmacro %}

然后只需在每个集合上运行它:

{% for item in form.collectionItems %}
    {{ formMacros.formatCollection(item) }}
{% endfor %}

3. 原型

在渲染集合字段之前获取原型。您可以将其存储在变量中。

{% set prototype = form.collection.vars.prototype %}

然后只要你喜欢使用我们的宏就可以简单地渲染它:

<div data-js="collection" data-prototype="{{ formMacros.formatCollection(prototype)|e('html_attr') }}">
于 2021-07-26T12:43:37.173 回答
1

我知道这是个老问题,但也许人们仍然在发生这种情况。这解释了集合的片段命名

在这些情况下,您可以使用_entry_代替集合元素编号。使用链接中的说明进行片段命名,但这可能会有所不同。有时“类型”是片段名称的一部分,有时第一个字母是大写,有时是小写等。我会使用浏览器开发工具来查找实际名称以确保。您还可以通过将 getBlockPrefix 函数添加到表单类来自定义使用的名称。

因此,在上述情况下,自定义块可能类似于:

{% block _ProductBundle_product_entry_widget %}
   <div> {{ form_row(form.field)}} </div>
{% endblock %}

其中“字段”将是您的集合元素中的字段名称。

于 2019-08-20T19:53:08.427 回答