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 Builder 内に組み込みのエスケープ機能はありますか?

私が推測したのは、フォームビューがデータを介し$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

エンコードされた HTML をデコードし、それをサービスとして追加する Twig 拡張機能を作成することになりました。

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

autoescape セクションが追加されていることに注意してください。

于 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 に答える