Symfony2:为每个选择添加类

时间:2012-07-06 04:44:20

标签: forms symfony

我正在尝试自定义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'未添加到select中。 我做错了什么?

2 个答案:

答案 0 :(得分: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。*中,您应该在版本2.1中覆盖choice_widget。*正确的块是choice_widget_collapsed

答案 1 :(得分:0)

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

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

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

两者都必须匹配。