4

我正在尝试自定义 Symfony2 表单渲染以向生成的每个选择添加一个类。我认为有一个自定义 form_div_layout.html.twig :

{% block choice_widget_collapsed %}
{% spaceless %}
    <select class='myclass' {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
    {% if empty_value is not none %}
        <option value="">{{ 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>
{% endspaceless %}
{% endblock choice_widget_collapsed %}

并将其与

{% form_theme form 'YOPYourOwnPoetBundle:Form:form_div_layout.html.twig' %}

会成功的。

但是,“myclass”类未添加到选择中。我究竟做错了什么?

4

2 回答 2

4

您应该首先确保您尝试使用的主题文件与您在form_theme表达式中使用的名称具有相同的名称,并且该文件确实存在。如果这些不匹配,我不记得 Twig 是否抛出异常。

此外,您可能class在构建表单或呈现表单时不小心传递了一个属性。发生的情况是您的元素现在有两个class属性。

一种解决方法是将您的新类实际添加到现有类的集合中。

{% block choice_widget_collapsed %}
{% spaceless %}
{% set label_attr = label_attr|merge({class: label_attr.class|default('') ~ ' required'}) %}
    {% set attr = attr|merge({class: (attr.class|default('') ~ ' myclass')|trim}) %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
    {# ... #}
</select>
{% endspaceless %}
{% endblock choice_widget_collapsed %}

这允许您添加以后可能需要的特定元素的任何可选类。

编辑

查看 Sf2 Github 存储库,似乎主题文件最近已更改。在 2.0.* 版本中,您应该覆盖choice_widget2.1.* 版本,正确的块是choice_widget_collapsed.

于 2012-07-06T06:39:03.610 回答
0

我想您应该将表单主题行更改为:

{% form_theme form 'YOPYourOwnPoetBundle:Form:form_div_layout.html.twig' %}

或者您需要将 twig 文件的名称更改为 fields.html.twig

两者都必须匹配。

于 2012-07-06T06:18:40.607 回答