0

我遇到了一个关于 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”键旁边添加了一个简单的 标记。因此,我在选择列表中将“  -- New Category --”作为第一个选项。

我试过的

  1. 树枝自动逃生

    {% autoescape false %}
        {{ form_row(form.parent) }}
    {% endautoescape %}
    
  2. 树枝延伸

我尝试编写自定义 Twig 扩展,其唯一目的是转义(html_decode)我传递给它的整个对象集 - 仍然不好。不幸的是,我没有保存我的代码以将其粘贴到此处,因此我将提供一个链接,其中另一个用户提出了与我相同的方法(实际上是针对 JSON,但概念是相同的)。链接到 SO 答案

所以,简单地说,作为我最后的想法 - 我必须做什么,才能在我的选择列表中使用一些 HTML,如“strong”或“ ”而不让它转义?

提前致谢。

4

1 回答 1

1

在这种情况下,选项组可能是更好的选择?

您可以尝试在 twig 中自定义单个表单字段。您实际上在模板中创建了一个具有特殊名称的块并自定义显示。

块命名约定是_{field_id}_rowand _{field_id}_widget。所以是这样的:

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

查看Twig 桥代码以了解如何输出选择:

{% 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 回答