0

Symfony2 での Twig のエスケープに関する問題に遭遇しました。

問題

現在、Symfony のフォーム ビルダーを使用して、プロジェクトのカテゴリを管理するためのフォームを作成しています。フォームを作成するための現在のコードは次のとおりです。

$Form
    ->add('title', 'text', array('label' => 'Title', 'attr' => array('class' => 'span8')))
    ->add('parent', 'entity', array(
        'label' => 'Category',
        'attr' => array('class' => 'selectPicker span8'),
                'property' => 'indentedTitle',
                'empty_value' => ' -- New Category --',
                'required' => false,
                'class' => 'News\Entity\Category',
                'query_builder' => function(EntityRepository $Repository) {
                    return $Repository->createQueryBuilder('c')
                            ->orderBy('c.root, c.left');
                    }
                ))
    ->add('commit', 'submit', array('label' => 'Save', 'attr' => array('class' => 'btn btn-info')));

エンティティ "indentedTitle" に追加したコールバックは、ツリー セットのカテゴリ レベルに応じて、タイトルの前に 2 行追加するだけです。

public function getIndentedTitle() {
    return str_repeat("--", $this->level) . $this->title;
}

HTMLコードを追加して、選択リストに出力したカテゴリ名を少し変更しようとすると、自動的にエスケープされることを除いて、これまでのところすべて正常に動作しています。たとえば、フォーム ビルダの「empty_value」キーの横に単純な タグを追加したことがわかります。その結果、選択リストの最初のオプションとして「  -- New Category --」が表示されます。

私が試したこと

  1. Twig 自動エスケープ

    {% autoescape false %}
        {{ form_row(form.parent) }}
    {% endautoescape %}
    
  2. 小枝の延長

渡したオブジェクトのセット全体をエスケープ(html_decode)するという単一の目的で、カスタムのTwig拡張機能を作成しようとしましたが、それでもうまくいきません。残念ながら、コードを保存してここに貼り付けなかったので、別のユーザーが私と同じ方法を提案したリンクを提供します (実際には JSON 用ですが、概念は同じです)。SO回答へのリンク

ですから、私の最終的な考えとして簡単に言えば、選択リストで「strong」や「 」などの HTML をエスケープせずに使用するには、どうすればよいですか?

前もって感謝します。

4

1 に答える 1

1

この場合、オプション グループの方がよい選択ではないでしょうか。

小枝でその個々のフォームフィールドをカスタマイズしてみることができます。基本的に、テンプレートに特別な名前でブロックを作成し、それ以降の表示をカスタマイズします。

ブロックの命名規則は_{field_id}_row_{field_id}_widgetです。だから、このようなもの:

{% block _parent_widget %}
    {# spit out the select field here with whatever you need #}
{% endblock %}

Twig ブリッジ コードを見て、select を出力する方法を確認してください。

{% block choice_widget_collapsed %}
{% spaceless %}
    {% if required and empty_value is none and not empty_value_in_choices %}
        {% set required = false %}
    {% endif %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if empty_value is not none %}
            <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ 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 %}

{% block choice_widget_options %}
{% spaceless %}
    {% for group_label, choice in options %}
        {% if choice is iterable %}
            <optgroup label="{{ group_label|trans({}, translation_domain) }}">
                {% set options = choice %}
                {{ block('choice_widget_options') }}
            </optgroup>
        {% else %}
            <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label|trans({}, translation_domain) }}</option>
        {% endif %}
    {% endfor %}
{% endspaceless %}
{% endblock choice_widget_options %}

次に、現在のテンプレートがフォームテーマでもあることを twig に伝えます。

{% form_theme your_form_name _self %}
于 2013-10-25T12:18:48.430 に答える