2013-05-24 17 views
21

私は簡単な問題があります。Symfony2 - > Twig - > Form - > Field - > Set rendered = true

私は例えば、フィールドを持つフォームがあります:私は、複数のブロックを使用し、私はフィールドをレンダリング停止したい私の小枝ファイルで

$builder 
    ->add('x') 
    ->add('y') 
    ->add('z') 
; 

を... 私はb.html.twigを見ますファイル!

{% block form %} 
    {{ form.x.set('rendered', true) | default() }} 
    {{ parent() }} 
{% endblock form %} 

b.html.twig

a.html.twig

{% block body %} 
    {% block form %} 
     {{ form_widget(form) }} 
    {% endblock form %} 
{% endblock body %} 

iは物体カントことを、 "デフォルト()" 私はエラーを取得を削除した場合文字列に変換されます。 実際にフォームはすべてのフィールドをレンダリングします... xフィールドを含みます。しかし、彼らはxフィールドをレンダリングすべきではありません...

ありがとうございます!

答えて

65

私はここに質問足りませんか?あなたはそれが簡単なコールではないにもかかわらず、レンダリングされたとしてフィールドを設定したい場合は次のとおりです。

{% do form.x.setRendered %} 

私は、私の謝罪を誤解している場合。フォームで定義されているが、テンプレートに記述されていないフォームフィールドをレンダリング防ぐために、次の決算フォームステートメントを使用することができます

3

何らかの種類の決定ロジックを含めることによって、FormTypeのフォームフィールドを削除(または追加のみ)する必要があります。

たとえば、cerain変数の存在/値をチェックします。

この変数は、コンストラクタに注入できます。

テンプレートから削除することは、テンプレートに属していないアプリケーションロジックです。

その他の選択肢がない場合はFormView::setRendered()メソッドをご覧ください。

あなたは小枝attribute functionを使用して、オブジェクトのメソッドにアクセスすることができます。

{{ attribute(object, method, arguments) }} 
+0

問題は、私がデフォルトで "form_widget(form)"を含むグローバルフォームテーマを使用していることです。 私は一番下にフィールドが必要です。それはrendered = trueを設定するためです。その後、私はそれを底部で使用することができ、私のグローバルテーマはフィールドをレンダリングしませんでした... – PatrickB

+0

私の答えを更新...あなたの正確な質問は、手動でフォームの行のsetRendered()を呼び出す方法です? – nifr

+0

質問はどのようにtwig(only)^^でこれを行うかです。現時点では、私は自作のtwig関数を使用しています:public function renderState(FormView $ field){$ field-> setRendered(true); } – PatrickB

2

:については

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'id', 
      HiddenType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'name', 
      TextType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'comment', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ) 
     ->add(
      'amount', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ); 
} 

{{ form_end(form, {'render_rest': false}) }} 

たとえば、我々は次の形式を定義しますこのフォームでは次のテンプレートについて説明しますが、フィールドidをレンダリングしたくないので、のオプションをform_endで使用して、フィールドのレンダリングをブロックするid

{{ form_start(form) }} 
{{ form_row(form.name) }} 
{{ form_row(form.comment) }} 
{{ form_row(form.amount) }} 
{{ form_end(form, {'render_rest': false}) }} 
+4

説明を追加した方がよいでしょう。 – johnnyRose

+0

これはすべてのフィールドで機能します。 _csrf_tokenの場合は、手で_csrfフィールドを追加することを覚えておく必要があります – Tom

関連する問題