Symfony2:Twig autoescaping

时间:2013-10-25 11:57:31

标签: php symfony twig

我遇到了关于Twig在Symfony2中逃脱的问题。

问题

我目前正在使用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”中添加的回调只是在标题之前添加了两行,具体取决于树集中的类别级别。

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

到目前为止一切正常,但是当我尝试添加一些HTML代码来修改我在选择列表中输出的类别名称时,它会自动转义。例如,您可以看到我在表单生成器中的“empty_value”键旁边添加了一个简单的& nbsp 标记。因此,我将“& nbsp - New Category - ”作为我的选择列表中的第一个选项。

我尝试了什么

  1. Twig autoescape

    {% autoescape false %}
        {{ form_row(form.parent) }}
    {% endautoescape %}
    
  2. Twig extension

  3. 我尝试编写自定义的Twig扩展,其唯一目的是转义(html_decode)我传递给它的整个对象集 - 仍然没有用。不幸的是我没有保存我的代码将其粘贴到这里,所以我将提供一个链接,其他用户提出了与我相同的方法(它实际上是JSON,但概念是相同的)。 link to SO answer

    所以,简单地说我最后的想法 - 我要做什么,为了在我的选择列表中使用像“强”或“& nbsp”这样的HTML而不让它被转义?

    提前致谢。

1 个答案:

答案 0 :(得分:1)

在这种情况下,也许option groups是更好的选择?

您可以在树枝上尝试customizing that individual form field。实质上,您可以使用特殊名称在模板中创建一个块,并自定义显示内容。

块命名约定为_{field_id}_row_{field_id}_widget。所以像这样:

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

查看Twig bridge code以了解如何输出选择:

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