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」フィールドは表示されます:(
何が問題なのかご存知ですか?
別のオプションは、フィールドをレンダリング済みとして明示的にマークすることです。
{% do form.contenu.setRendered %}
別の私の意見ではこれを行うためのハックの少ない方法:
{{ form_widget(form._token) }} // render the CSRF Token
{{ form_end(form, {'render_rest': false}) }} // do not render anything else
公式ドキュメント (v3.0)にあるため、ほとんどベストプラクティスと思います。
{{ form_rest(form) }}
は、各フィールドを「手動で」レンダリングした後、最後に移動します。 CSRFトークンに使用している場合は、いつでもレンダリングできます。
{# Token CSRF #}
{{ form_widget(form._token) }}
一部のフィールドを表示したくない状況は、設計が不適切なフォームを示唆しています。いくつかの引数を__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
にラップすることができます。その方法は「彼らはまだそこにいます」(そして、すべての手段で通常通り処理されます)が、ユーザーには見えません。
お役に立てれば...