Symfony 2,Twig:如何不逃避字段值(与backbonejs& symfony 2一起使用)

时间:2012-07-10 16:13:07

标签: symfony backbone.js twig

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

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

BackboneJS 应该读取此twig块生成的代码,并替换&lt;%= myModelProperty%&gt;通过一些模型属性值。

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

&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 %}

但没有成功。

所以我的问题是如何避免在树枝中逃避字段值。

谢谢!

修改

解决方案: 所以实际上方法是正确的,我必须使用“原始”过滤器来获取我的变量未被转义。 我有一个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标签中打印值时完成转义,因此我之前所做的是将未转义的值发送到实际调用打印的块以及因此转义值的位置。 / p>

这对我有用! 谢谢!

2 个答案:

答案 0 :(得分:3)

解决方案:事实上,该方法是正确的,我必须使用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标签中打印值时完成转义,所以我之前做的是将未转义的值发送到实际调用打印的块以及因此转义值的位置。

这对我有用!谢谢!

答案 1 :(得分:1)

使用raw过滤器是执行此操作的正确方法。如果你没有取得成功,那么别的东西就错了。尝试清除缓存或禁用app / config / config.yml中的twig缓存

twig:
    cache: ~

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