2012-07-02 5 views
5

У меня есть трудное пространство ( ) внутри некоторых моих вариантов выбора. Как-то где-то они убегают. Я пробовал:Symfony2 Formbuilder автоматическое экранирование?

{% autoescape false %} 
    {{ form_widget(foobar) }} 
{% endautoescape %}  

Как также

{{ form_widget(foobar)|raw }} 

И следующее под Twig в config.yml

autoescape: false 

же поле выбора по-прежнему отображается как  Choice Text Here вместо Choice Text Here, и в источник они кодируются как  Choice Text Here

В контроллере у меня есть:

$form ->add('foo', 'choice', array(
      'label' => 'Foo Label', 
      'choices' => $fooChoices, 
      'required' => true)); 
$form = $form->getForm(); 
$foobar = $form->createView(); 

Если я print_r$fooChoices я получаю:

Array ([1] => 60# FooBar [5] => 60# BatBar [11] => 60# DooWop) 

Который показывает мне правильный   (обратите внимание на двойное пространство перед 60-х годов). Где-то между FormBuilder и рендерингом он ускользает.

Есть ли встроенный выход из формы Builder?

То, что я определил, состоит в том, что через точку, в которой вид формы отображается через $form->createView(), данные по-прежнему не отображаются. Но к тому времени, когда он достигнет Twig через form_widget, он был сбежал. Выполнение form_widget(foobar)|raw показывает это.

Редактировать: Я добавил обходной путь в качестве ответа, но мне все еще интересно принять ответ, в котором объясняется, как предотвратить первоначальное экранирование от всего происходящего.

+0

Могу ли я увидеть код виджета формы? Такой функции нет. – Lusitanian

+0

@ Давид Я не уверен, что я следую. Я использую самый простой способ отображения формы в соответствии с документами: http://symfony.com/doc/current/book/forms.html#rendering-the-form – Nick

+0

Я имею в виду класс, в котором вы создаете форма, извините за двусмысленность. – Lusitanian

ответ

8

Я столкнулся с той же проблемой, что и радиоклейки. Это решает.

{% for child in form %} 

    {% autoescape false %} 
    {{ child.vars.label }} 
    {% endautoescape %} 

    {{ form_widget(child) }} 

{% endfor %} 
1

Вероятно, не самое лучшее решение, но что делать, что в вашем виде конструктора (Мы заставляем   быть пространство полукокс):

public function __construct() { 

    foreach ($this->fooChoices as $key => $fooChoice) { 

     $this->fooChoices[$key] = html_entity_decode($fooChoice, ENT_NOQUOTES, 'UTF-8'); 
    } 
} 
+0

И если вам нужно декодировать кавычки (например, '), вы можете использовать 'htmlspecialchars_decode ($ string, ENT_QUOTES)' – geoB

3

Я в конечном итоге создать расширение Twig, который декодирует кодированный HTML и добавить его в качестве услуги:

Перенесение в Vendor/Bundle/Extensions/Twig

namespace Vendor\Bundle\Extensions\Twig; 

class HTMLDecodeTwigExtension extends \Twig_Extension 
{ 

    public function getFilters() 
    { 
     return array(
      'htmldecode' => new \Twig_Filter_Method($this, 'htmldecode', array(
       'is_safe' => array('html')) 
      ), 
     ); 
    } 

    // your custom function 
    public function htmldecode($string) 
    { 
     return html_entity_decode($string); 
    } 

    // Name for Service 
    public function getName() 
    { 
     return 'html_decode_twig_extension'; 
    } 
} 

Регистрация сервиса в Vendor/Bundle/Ресурсы/конфигурации/services.yml

vendor_bundle.htmldecode: 
    class: Vendor\Bundle\Extensions\Twig\HTMLDecodeTwigExtension 
    tags: 
     - { name: twig.extension } 

Использование:

{{ form_widget(foobar)|htmldecode }} 

Я до сих пор не знаю, где экранирование выполняется , поскольку он выполняется только на самих данных (и я попытался создать событие данных для изменения данных формы), но это, по крайней мере, дает мне конечный результат, который я ищу.

+0

Я пробовал этот код и зарегистрировал расширение ветки, но это не решает проблему при применении только к ' form_label'. Вы должны применить его к 'form_widget' – Dean

3

То, что вы действительно должны делать это наиважнейший шаблону form_label

{% block form_label %} 
{% spaceless %} 
    {% if label is not sameas(false) %} 
     {% if not compound %} 
      {% set label_attr = label_attr|merge({'for': id}) %} 
     {% endif %} 
     {% if required %} 
      {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %} 
     {% endif %} 
     {% if label is empty %} 
      {% set label = name|humanize %} 
     {% endif %} 
     {% autoescape false %}<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}</label>{% endautoescape %} 
    {% endif %} 
{% endspaceless %} 
{% endblock form_label %} 

Обратите внимание на добавление секций autoescape.

Смежные вопросы