我遇到了关于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 - ”作为我的选择列表中的第一个选项。
Twig autoescape
{% autoescape false %}
{{ form_row(form.parent) }}
{% endautoescape %}
Twig extension
我尝试编写自定义的Twig扩展,其唯一目的是转义(html_decode)我传递给它的整个对象集 - 仍然没有用。不幸的是我没有保存我的代码将其粘贴到这里,所以我将提供一个链接,其他用户提出了与我相同的方法(它实际上是JSON,但概念是相同的)。 link to SO answer
所以,简单地说我最后的想法 - 我要做什么,为了在我的选择列表中使用像“强”或“& nbsp”这样的HTML而不让它被转义?
提前致谢。
答案 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 %}