3

以下のコードを使用してプロトタイプをレンダリングしています。

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

BackboneJSは、このtwigブロックによって生成されたコードを読み取り、<%= myModelProperty%>をモデルプロパティ値に置き換えることになっています。

そして、値が小枝でエスケープされ、次のように置き換えられるため、これは発生しません。

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

しかし、成功しませんでした。

だから私の質問は、小枝のフィールド値をエスケープしない方法です。

ありがとう!

編集

解決策:実際、この方法は正しかったので、変数をエスケープしないようにするには、「raw」フィルターを使用する必要があります。私はこの特定の出力をエングローブする自動エスケープブロックセットを持っています。それが「エスケープされていない」必要がある理由です。

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タグで値を出力するときにエスケープが行われるため、以前に行っていたのは、出力が実際に呼び出され、値がエスケープされたブロックにエスケープされていない値を送信することでした。

これは私のために働きます!ありがとう!

4

2 に答える 2

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タグで値を出力するときに行われるため、以前に行っていたのは、出力が実際に呼び出され、値がエスケープされたブロックにエスケープされていない値を送信することでした。

これは私のために働きます!ありがとう!

于 2012-08-02T11:37:44.337 に答える
1

これを行うには、 rawフィルターを使用するのが適切な方法です。それで成功していない場合は、他の何かが間違っています。キャッシュをクリアするか、app / config/config.ymlで小枝のキャッシュを無効にしてみてください

twig:
    cache: ~

キャッシュの問題ではない場合は、次にどこを見ればよいかわかりません。

于 2012-07-10T17:34:31.540 に答える