1

好的,不好的问题,因为从语义上我认为我可以通过块名称本身来收集差异。我真正的问题是如何控制在给定元素上何时widget_attributes以及需要哪些属性出现在容器和元素上。widget_containter_attributes

考虑以下:

<div class="ui-select foo bar baz">
    <select id="abc_hello_worldtype_name" name="abc_hello_worldtype[name]" class="thud grunt">
        ...
    </select>
</div>

我要做的主要事情是必须在divselect. 出于风格原因以及与行为相关的要求,这都是必需的。

让我困惑的主要是原始的 widget_attributes 和 widget_container_attributes 都使用attr传入的变量。这些不打算一起使用吗?


我发现自己今天做了以下事情;只是从原件复制我自己的块并添加到条件句中。这一切似乎太复杂了。我知道我做错了。

{% block choice_widget_collapsed %}
{% spaceless %}
    {% set attr = attr|merge({'class': (attr.class|default('') ~ ' ui-select')|trim}) %}
    <div {{ block('ui_select_container_attributes') }}>
        <select {{ block('ui_select_widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
            {% if empty_value is not none %}
                <option value=""{% if required %} disabled="disabled"{% if value is empty %} selected="selected"{% endif %}{% endif %}>{{ empty_value|trans({}, translation_domain) }}</option>
            {% endif %}
            {% if preferred_choices|length > 0 %}
                {% set options = preferred_choices %}
                {{ block('choice_widget_options') }}
                {% if choices|length > 0 and separator is not none %}
                    <option disabled="disabled">{{ separator }}</option>
                {% endif %}
            {% endif %}
            {% set options = choices %}
            {{ block('choice_widget_options') }}
        </select>
    </div>
{% endspaceless %}
{% endblock choice_widget_collapsed %}

注意 和 上的块ui_*引用。这些块看起来像:divselect

{% block ui_select_widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% elseif attrname == 'class' %} class="foopa {{ attrvalue|replace({'ui-select':''}) }}" {% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}
    {% endfor %}
{% endspaceless %}
{% endblock ui_select_widget_attributes %}

{% block ui_select_container_attributes %}
{% spaceless %}
    {% if id is not empty %}id="{{ id }}" {% endif %}
    {% for attrname, attrvalue in attr %}{{ attrname }}="{{ attrvalue }}" {% endfor %}
{% endspaceless %}
{% endblock ui_select_container_attributes %}
4

1 回答 1

2

当表单字段呈现为单个表单输入(文本输入、选择、复选框...)时,使用 widget_attributes。当它被呈现为输入的集合(表单、多个复选框、多个输入,...)时,widget_container_attributes 用于围绕输入的容器(主要是 div)。所以不,它们不打算同时使用。

这两个块之间的区别在于 widget_attributes 呈现特定于表单的属性(“value”、“name”...),而 widget_container_attributes 仅呈现通用 HTML 属性。

如果您想在“attr”选项之外添加其他标记,最好的办法是从表单主题中复制相应的块(例如“choice_widget_collapsed”),将其粘贴到您的模板中,重命名该块以匹配您的元素带有前导下划线(“_”)和“widget”后缀的 ID(例如,如果您的元素的 ID 是“form_my_element”,则该块将被称为“_form_my_element_widget”)并修改模板中的标记。

{% block body %}
...
{{ form(form) }}
...
{% endblock %}

{% block _form_my_element_widget %}
... modified version of the "choice_widget_collapsed" markup ...
{% endblock %}
于 2013-08-20T08:27:12.837 回答