71

Symfony2を使い始めましたが、いくつか問題があります。手作業でフィールドをレンダリングしたかったのですが、まだレンダリングされているフィールドも関数で表示されるform_rest()ため、機能しません。同じフィールドが2つあります。

これが私のコードです:

<div>
     {{ form_errors(form.contenu) }}
     <textarea id="{{ form.contenu.vars.id }}" name="{{ form.contenu.vars.full_name }}">{{ form.contenu.vars.value }}</textarea>
</div>

そして、フォームの最後に、これを入れなければなりません:

{{ form_rest(form) }}

ただし、「contenu」フィールドが表示されます:(

何が問題なのか分かりますか?

4

4 に答える 4

205

別のオプションは、フィールドをレンダリング済みとして明示的にマークすることです。

{% do form.contenu.setRendered %}
于 2012-11-21T10:08:05.553 に答える
60

私の意見では、それを行うためのもう1つのハッキーな方法は、次のとおりです。

{{ form_widget(form._token) }} // render the CSRF Token
{{ form_end(form, {'render_rest': false}) }} // do not render anything else

これは公式ドキュメント(v3.0)からのものなので、私が推測するほとんどのベストプラクティスです。

于 2016-05-18T13:49:41.143 に答える
32

{{ form_rest(form) }}各フィールドを「手動で」レンダリングした後、最後に移動します。CSRFトークンに使用している場合は、いつでも次のコマンドでレンダリングできます。

{# Token CSRF #}
{{ form_widget(form._token) }}
于 2012-05-13T09:49:11.223 に答える
10

一部のフィールドを表示したくない状況は、不適切に設計されたフォームを示唆しています。いくつかの引数__constructを条件付きにする(たとえば、いくつかのフィールドを含める/除外する)か、個別のFormクラスを作成する(私の意見では少しやり過ぎです)ことができます。

数か月前、ユーザーがレコードを挿入/更新したときにフォームが異なるという一般的なケースがありました。それはこのようなものでした:

...
public function __construct($isUpdateForm){
    $this->isUpdateForm= $isUpdateForm;
}

public function buildForm(FormBuilder $builder, array $options){
    ....
    $builder->add('some_filed', 'text', ..... );

    if ( $this->isUpdateForm ){
        $builder->add(.....);
    }
    ....
}
....

何らかの理由でフォームクラスをリファクタリングできない場合でも、不要なフィールドを表示し<div>ても、CSSdisplay:none属性を持つフィールドにラップすることができます。そうすれば、「それらはまだそこにあります」(そして、必ず正常に処理されます)が、ユーザーには表示されません。

お役に立てれば...

于 2012-05-13T11:17:26.157 に答える