web-dev-qa-db-ja.com

symfony2でform_rest()がフィールドを表示しないようにする方法は?

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」フィールドは表示されます:(

何が問題なのかご存知ですか?

65
Minipipo1

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

{% do form.contenu.setRendered %}
192
Francesc Rosas

別の私の意見ではこれを行うためのハックの少ない方法:

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

公式ドキュメント (v3.0)にあるため、ほとんどベストプラクティスと思います。

42
Andresch Serj

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

{# Token CSRF #}
{{ form_widget(form._token) }}
32
gremo

一部のフィールドを表示したくない状況は、設計が不適切なフォームを示唆しています。いくつかの引数を__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(.....);
    }
    ....
}
....

何らかの理由でフォームクラスをリファクタリングできない場合でも、不要なフィールドを表示できますが、CSS <div>属性を持つdisplay:noneにラップすることができます。その方法は「彼らはまだそこにいます」(そして、すべての手段で通常通り処理されます)が、ユーザーには見えません。

お役に立てれば...

10
Jovan Perovic