2016-07-28 15 views
3

は、残りの要素をレンダリングするためにform_widget()を呼び出し、その後、私は周りのカスタムCSSを追加するform_row()で両方のフィールドをレンダリングしていますのは、私は2つのフィールドのみ(ユーザー名と電子メール)フォームにレンダリングされる要素が残っているかどうかを検出するにはどうすればよいですか?

との簡単なフォームをレンダリングするSymfony Form Componentを使用していましょう(別のオプションはform_rest()) 私が探しているのは、余分なフィールドがある場合にカスタムhtmlを追加するために、form_widget()がオブジェクトを印刷するかどうかを事前にチェックする方法です。 私はそれをやった方法は、このようなものです:

//app/form/index.html.twig 
{# Other template code #} 
... 
{# Rendering form: #} 
{{ form_start(form) }} 

{{ form_row(form.username) }} 
{{ form_row(form.email) }} 

{% set form_rendered = form_widget(form) %} 
{% if form_rendered %} 
    <h3>Other fields</h3> 
    {{ form_rendered | raw }} 
{% endif %} 

{{ form_end(form) }} 
{# End form #} 
... 
{# Other template code #} 

しかし、私はそれに満足していません。もっと良い方法はありますか?

編集:(デフォルトで有効)CSRFの保護を使用する場合は、フォームは、我々は印刷されませんでしたトークンのための余分な隠しフィールドを持っているので、前のコードは常に、<h3>Other fields</h3>を印刷します。 {{ form_row(form._token) }}でどこかにレンダリングする必要があります。

答えて

3

src/Symfony/Component/Form/FormView.phpのコードをチェックすることで、私が望むものとまったく同じ機能を発見しました。

{% if not form.isRendered() %} 
    <h3>Other fields</h3> 
    {{ form_widget(form) }} 
{% endif %} 
:今すぐ機能のようなテンプレートで使用することができます

//src/Symfony/Component/Form/FormView.php 

    /**                 
    * Returns whether the view was already rendered. 
    * 
    * @return bool Whether this view's widget is rendered 
    */ 
    public function isRendered() 
    { 
     $hasChildren = 0 < count($this->children); 

     if (true === $this->rendered || !$hasChildren) { 
      return $this->rendered; 
     } 

     if ($hasChildren) { 
      foreach ($this->children as $child) { 
       if (!$child->isRendered()) { 
        return false; 
       } 
      } 

      return $this->rendered = true; 
     } 

     return false; 
    } 

関連する問題