【问题标题】:Twig and autoescaping树枝和自动转义
【发布时间】:2012-04-18 12:26:34
【问题描述】:

我正在学习 Symfony2。目前,我正在尝试在树枝模板中呈现表单标签。标签包含一个 html 标记,该标记在我的 twig 文件中未正确呈现。

下面是创建表单域的代码:

$builder->add('zipcode', 'integer', array(
        'label' => '<abbr title="Zone Improvement Plan">CAP</abbr> code',
        ));

在 twig 文件中,我将字段标签呈现如下:

{{ form_label(form.zipcode) }}

我尝试了 raw、escape、e 过滤器,但我的 html 页面中提供的结果始终是字符串

 <abbr title="Zone Improvement Plan">CAP</abbr> code

而不是相应的 HTML 代码!

有什么建议吗? 提前致谢!

后来我找到了解决方案。 解决方案是在路径中禁用 Symfony 提供的标签块内的自动转义: symfony / src / Symfony / Bridge / Twig / Resources / views / Form / form_div_layout.html.twig

因此,在您的 twig 文件中,您必须将以下几行放在表单之外: {% form_theme form _self %}

{% block generic_label %}
{% spaceless %}
  {% if required %}
      {% set attr = attr|merge({'class': attr.class|default('') ~ ' required'}) %}
  {% endif %}
  <label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{% autoescape false %}{{ label|trans }}{% endautoescape %}</label>
{% endspaceless %}
{% endblock %}

【问题讨论】:

    标签: symfony escaping twig


    【解决方案1】:

    来自JeanValjean本人:

    {% autoescape false %}{{ form.zipcode.vars.label | trans }}{% endautoescape %}
    

    要将这种行为推广到您的整个应用程序,您可以覆盖标签的表单块:

    {% block generic_label %}
        {% spaceless %}
            {% if required %}
                {% set attr = attr|merge({'class': attr.class|default('') ~ ' required'}) %}
            {% endif %}
            <label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
                {% autoescape false %}{{ label|trans }}{% endautoescape %}
            </label>
        {% endspaceless %}
    {% endblock %}
    

    【讨论】:

    • 我在 [twig docs on autoescape][1] 中读到“返回模板数据(如宏和父级)的函数总是返回安全标记”。所以我猜这个问题与form_label函数有关。因此,解决方案是重写此函数以禁用自动转义! [1]:twig.sensiolabs.org/doc/tags/autoescape.html
    • 但是,autoescape false 选项在这种情况下不起作用!正如我在问题中提到的,我尝试了官方 Twig 文档中描述的所有选项。
    • :) 无论如何,感谢您的关注!我认为 Twig 文档必须改进!
    • 不是 Twig 而是 Symfony,因为 form_label、form_row、form_widget 等都是基于 Twig 的 Symfony 助手;)
    • 我终于找到了一个又快又丑的捷径。我是新手,所以我不能将它作为新的解决方案发布。但是,我想分享我正在使用的解决方案。简单地说,我在树枝文件中使用 {% autoescape false %}{{ form.zipcode.vars['label'] }}{% endautoescape %} 代码。我还重写了 {% block generic_label %} 让它在我的树枝文件中自动运行。
    【解决方案2】:

    禁用 autoespace 过滤器只是为了渲染一个变量并不是最好的事情,因为当你阅读代码时它并不是很清楚。

    所以,而不是:

    {% autoescape false %}{{ label|trans }}{% endautoescape %}
    

    你可以使用:

    {{ label|trans|raw }}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多