【问题标题】:Symfony2: add class to every selectSymfony2:为每个选择添加类
【发布时间】:2012-07-06 04:44:19
【问题描述】:

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

【问题讨论】:

  • 您是否偶然通过了其他课程?如果您也将生成的 html 粘贴到此处会有所帮助。

标签: forms symfony


【解决方案1】:

您应该首先确保您尝试使用的主题文件与您在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_widget,在 2.1.* 版本中,正确的块是 choice_widget_collapsed

【讨论】:

  • 你说得对!我正在使用 Symfony2.0.14,所以我查看了文件 form_div_layout.html.twig 的错误版本。将 class='myclass' 添加到choice_widget 而不是choice_widget_collapsed 有效。此外,您使用 {% set attr = attr|merge({class: 'myclass' ~ (attr.class is defined ? ' ' ~ attr.class : '')}) %} 的解决方案也有效,这就是我'我会用。非常感谢。
【解决方案2】:

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

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

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

两者必须匹配。

【讨论】:

  • 模板名称无关。
  • @gilden 如果您尝试通过 form_theme “加载”新的 twig 模板,模板文件的名称应该与您要加载的名称匹配,不是这样,否则将没有要加载的文件
  • 我没有一次必须将我的表单主题模板命名为 form_div_layout.html.twig。甚至食谱文章在the example 中也使用了不同的模板名称。
  • 我唯一说的是你的模板文件的名字必须和你通过form_theme加载它时使用的名字一致。这与您链接的文档中的描述完全相同。两者(模板文件的名称和form_theme中的名称)相同(fields.html.twig)
  • 啊,对不起,我的错。猜猜我还在睡觉:)
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2012-04-28
相关资源
最近更新 更多