5

 在我的一些选择中,我有一个硬空格 ( )。不知何故,在某个地方,他们正在逃脱。我试过了:

{% 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 和渲染之间的某个地方,它被转义了。

表单生成器中是否有内置转义?

我推断的是,通过$form->createView()数据呈现表单视图的点仍然是未转义的。但是,当它通过 form_widget 到达 Twig 时,它已经被逃脱了。这样做form_widget(foobar)|raw表明了这一点。

编辑:我添加了一个解决方法作为答案,但我仍然有兴趣接受一个解释如何防止完全发生初始转义的答案。

4

4 回答 4

8

我在无线电标签上遇到了同样的问题。这解决了它。

{% for child in form %}

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

  {{ form_widget(child) }}

{% endfor %}
于 2012-11-25T21:36:43.553 回答
4

我最终创建了一个 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/Resources/config/services.yml 中注册服务

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

用法:

{{ form_widget(foobar)|htmldecode }}

我仍然不知道在哪里执行转义,因为它只对数据本身执行(我尝试创建一个数据事件来修改表单的数据),但这至少给了我正在寻找的最终结果为了。

于 2012-07-03T17:36:55.660 回答
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 %}

请注意添加了自动转义部分。

于 2014-02-09T23:08:20.900 回答
1

可能不是最好的解决方案,但是在您的表单构造函数中这样做呢(我们强制&nbsp;成为空格字符):

public function __construct() {

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

        $this->fooChoices[$key] = html_entity_decode($fooChoice, ENT_NOQUOTES, 'UTF-8');
    }
}
于 2012-07-03T13:47:34.150 回答