Symfony widget_属性和widget_容器_属性之间有什么区别?

Symfony widget_属性和widget_容器_属性之间有什么区别?,symfony,twig,symfony-forms,Symfony,Twig,Symfony Forms,好吧,这个问题很糟糕,因为从语义上来说,我认为我可以通过块名本身来收集差异。我真正的问题是,当给定元素上需要widget\u属性和widget\u container\u属性时,如何控制哪些属性显示在容器和元素中 考虑以下几点: <div class="ui-select foo bar baz"> <select id="abc_hello_worldtype_name" name="abc_hello_worldtype[name]" class="thud gru

好吧,这个问题很糟糕,因为从语义上来说,我认为我可以通过块名本身来收集差异。我真正的问题是,当给定元素上需要
widget\u属性
widget\u container\u属性
时,如何控制哪些属性显示在容器和元素中

考虑以下几点:

<div class="ui-select foo bar baz">
    <select id="abc_hello_worldtype_name" name="abc_hello_worldtype[name]" class="thud grunt">
        ...
    </select>
</div>
注意
div
select
上的
ui.*
块引用。这些块看起来像:

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

当表单字段呈现为单个表单输入(文本输入、选择、复选框…)时,将使用widget_属性。当它呈现为输入的集合(表单、多个复选框、多个输入等)时,widget_container_属性用于输入周围的容器(主要是一个div)。因此,不,它们不打算同时使用

这两个块之间的区别在于,widget_属性呈现表单特定的属性(“值”、“名称”…),而widget_容器_属性仅呈现通用的HTML属性

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

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

{% block _form_my_element_widget %}
... modified version of the "choice_widget_collapsed" markup ...
{% endblock %}

\u…\u小部件
块是约定还是Symfony内部识别?它是内部识别的。通常“choice\u小部件”块会在此处呈现(内部呈现“choice\u小部件”)但通过这种方式,您可以只覆盖一个特定表单字段的块。不要忘记,您的模板需要
{%form\u theme form\u self%}
才能工作。
{% block body %}
...
{{ form(form) }}
...
{% endblock %}

{% block _form_my_element_widget %}
... modified version of the "choice_widget_collapsed" markup ...
{% endblock %}