Twig и автоматическое экранирование

Я изучаю Symfony2. В настоящее время я пытаюсь отобразить метку формы в шаблоне ветки. Метка включает тег html, который неправильно отображается в моем файле ветки.

Далее следует фрагмент кода, в котором создается поле формы:

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

В файле ветки я отображаю метку поля следующим образом:

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

person JeanValjean    schedule 18.04.2012    source источник


Ответы (2)


От самого 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 %}
person AlterPHP    schedule 18.04.2012
comment
Я прочитал в [twig docs on autoescape][1], что Функции, возвращающие данные шаблона (например, макросы и родитель), всегда возвращают безопасную разметку. Итак, я предполагаю, что проблема связана с функцией form_label. Следовательно, решение состоит в том, чтобы переписать эту функцию, чтобы отключить автоматическое экранирование! [1]: twig.sensiolabs.org/doc/tags/autoescape.html - person JeanValjean; 18.04.2012
comment
Однако в этом случае опция autoescape false не работает! Как я уже упоминал в своем вопросе, я попробовал все варианты, описанные в официальной документации Twig. - person JeanValjean; 18.04.2012
comment
:) В любом случае, спасибо за интерес! Я думаю, что документы Twig должны быть улучшены! - person JeanValjean; 18.04.2012
comment
Речь идет не о Twig, а о Symfony, так как form_label, form_row, form_widget и т. д. являются помощниками Symfony, основанными на Twig;) - person AlterPHP; 18.04.2012
comment
Да, вы были точны! Документы Symfony2 должны быть улучшены! :) - person JeanValjean; 18.04.2012
comment
Наконец-то я нашел быстрый и уродливый ярлык. Я новичок, поэтому я не могу опубликовать это как новое решение. Тем не менее, я хочу поделиться решением, которое я использую. Просто я использую код {% autoescape false %}{{ form.zipcode.vars['label'] }}{% endautoescape %} в файле twig. Я также переписал {% block generic_label %}, чтобы сделать его автоматическим в моем файле twig. - person JeanValjean; 18.04.2012
comment
Я отредактирую свой ответ с вашим решением и попрошу модерацию, чтобы дать вам репутацию за этот ответ! - person AlterPHP; 18.04.2012
comment
Вау, спасибо! Вот полный код: {% block generic_label %} {% без пробелов %} {% если требуется %} {% 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 %} - person JeanValjean; 18.04.2012
comment
Я не думаю, что переопределение вашего блока является хорошим ответом, так как лучше продолжать экранирование в качестве поведения по умолчанию на всем сайте. Но трюк с вызовом только form.field.vars.label действительно полезен для конкретного случая! - person AlterPHP; 18.04.2012
comment
Что ж, я отключаю автоэкранирование только для статического html-кода, который я предоставляю через частный объект. Я не даю возможность такому пользователю отправлять неэкранированные коды... Более того, переопределение блока предлагается в документации Symfony2 для настройки форм! Итак, почему переопределение блокировки не является хорошим выбором? - person JeanValjean; 18.04.2012
comment
Вероятно, это хороший выбор для вас, потому что вы знаете, как вы хотите управлять своими метками, но отключение автоматического экранирования для рендеринга меток не кажется хорошим ответом для личного использования. Я добавлю это как альтернативный ответ... - person AlterPHP; 18.04.2012
comment
Я просто рассуждаю о возможности получить какую-то внешнюю атаку, отключив автоэкранирование на своем пути. Любая теория? - person JeanValjean; 18.04.2012
comment
Пока вы контролируете свои ярлыки, все в порядке. - person AlterPHP; 19.04.2012
comment
Хорошо спасибо! Этого достаточно для меня. Более того, этот код будет использоваться один раз в нескольких десятках форм Symfony. - person JeanValjean; 19.04.2012

Отключать фильтр autoespace только для отображения переменной — не лучший вариант, потому что когда вы читаете код, он не очень понятен.

Итак, вместо:

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

Ты можешь использовать :

{{ label|trans|raw }}

person Sebastien Malot    schedule 27.12.2012