【问题标题】:Symfony 2, Twig: how not to escape field value (used with backbonejs & symfony 2)Symfony 2,Twig:如何不转义字段值(与bonejs 和 symfony 2 一起使用)
【发布时间】:2012-07-10 16:13:07
【问题描述】:

我正在使用以下代码渲染原型:

{{form_widget(form.get('prototype').myField, {'attr': {'value': '<%= myModelProperty %>'} }) }}

BackboneJS 应该读取这个 twig 块生成的代码,并将 替换为一些模型属性值。

这不会发生,因为该值在 twig 中被转义,因此被替换为:

&lt;%= viewport %&gt;

我尝试在 *form_div_layout.html* 文件中将值强制为 RAW:

> {% block field_widget %} {% spaceless %}
>     {% set type = type|default('text') %}
>     <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value|raw }}" {% endif %}/> {%
> endspaceless %} {% endblock field_widget %}

但没有成功。

所以我的问题是如何不转义树枝中的字段值。

谢谢!

编辑

解决方案: 所以实际上方法是正确的,我必须使用“原始”过滤器来让我的变量不被转义。 我有一个自动转义块集,可以包含这个特定的输出,这就是为什么它必须“未转义”的原因。

Symfony 2 的 Twig 包提供了几个块来渲染表单数据,这些块使用一个特定的块来进行属性渲染,称为“{% block widget_attributes %}”。

我所做的是编辑这个块(我有一个带有我所有自定义块的单独模板文件),所以我可以添加一层“是否应该转义这个值”:

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} 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 %}
        {# Attribute value can be defined as an array. ['data']: contains the actual value, ['escape']: boolean (true if the value HAS to be escaped)#}
        {% if attrvalue.data is defined %}
            {% if not attrvalue.escape %}
                {{attrname}}="{{ attrvalue.data|raw }}"
            {% else %}
                {{attrname}}="{{ attrvalue.data|e }}"
            {% endif %}
        {% else %}
            {{attrname}}="{{attrvalue}}"
        {% endif %} 
    {% endfor %}

{% endspaceless %}
{% endblock widget_attributes %}

从我的树枝文件中调用:

{{ form_widget(form.displays.get('prototype').myField, {'attr': {'value': { 'data': myvalue, 'escape': false } } }) }}

转义是在 {{ }} twig 标签中打印值时完成的,所以我之前所做的是将未转义的值发送到实际调用 print 并且值因此被转义的块。

这对我有用! 谢谢!

【问题讨论】:

  • 你为什么不尝试在 javascript 中取消转义值?如果可能在 JS 中,它会更容易。
  • 这可能是一种方法,但更干净的方法是不要让它一开始就逃脱它。
  • 我找到了解决方案!在我的原始帖子的编辑中进行了描述。感谢大家的帮助!

标签: symfony backbone.js twig


【解决方案1】:

解决方案:所以实际上方法是对的,我必须使用raw 过滤器才能使我的变量不被转义。我有一个 autoescape 块集,它包含这个特定的输出,这就是为什么它必须是“未转义”的原因。

Symfony 2 的 Twig 包提供了几个块来呈现表单数据,这些块使用称为 {% block widget_attributes %} 的特定块来呈现属性。

我所做的是编辑这个块(我有一个带有我所有自定义块的单独模板文件),所以我可以添加一层“是否应该转义这个值”:

{% block widget_attributes %}
  {% spaceless %}
      id="{{ id }}" name="{{ full_name }}"{% if read_only %} 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 %}
        {# Attribute value can be defined as an array. ['data']: contains the actual value, ['escape']: boolean (true if the value HAS to be escaped)#}
        {% if attrvalue.data is defined %}
          {% if not attrvalue.escape %}
            {{ attrname }}="{{ attrvalue.data|raw }}"
          {% else %}
            {{ attrname }}="{{ attrvalue.data|e }}"
          {% endif %}
        {% else %}
          {{ attrname }}="{{ attrvalue }}"
        {% endif %} 
      {% endfor %}

  {% endspaceless %}
{% endblock widget_attributes %}

从我的树枝文件中调用:

{{ form_widget(form.displays.get('prototype').myField, {'attr': {'value': { 'data': myvalue, 'escape': false } } }) }}

转义是在打印 {{ }} twig 标签中的值时完成的,所以我之前所做的是将未转义的值发送到实际调用 print 并且值因此转义的块。

这对我有用!谢谢!

【讨论】:

    【解决方案2】:

    使用raw 过滤器是执行此操作的正确方法。如果你没有成功,那么还有其他问题。尝试在 app/config/config.yml 中清除缓存或禁用树枝缓存

    twig:
        cache: ~
    

    如果不是缓存问题,那么我不确定下一步该去哪里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2012-12-04
      相关资源
      最近更新 更多