2012-01-08 4 views
5

コレクションフォームフィールドのアイテムにカスタムグローバルテンプレートを追加することは可能ですか?symfony2のカスタムコレクションテンプレート

コレクションテンプレート自体をカスタマイズするのではなく、コレクションに含まれる各オブジェクトに特定のクラスまたはマークアップを追加するなど、コレクション内の各オブジェクトのレンダリングをカスタマイズしたいと思います。

私はコレクションのフィールドを持つフォームを持っているが、このようにコメントを追加しました:

$builder 
    ->add('items', 'collection', array(
     'type' => new ItemType(), 
     'allow_add' => true, 
     'allow_delete' => true, 
     'prototype' => true 
    )); 

は、私は(とりわけ)コレクション内の各項目に、「削除」ボタンを追加するには、小枝のテンプレートを定義します。

コレクションをカスタマイズするための 'collection_widget'テンプレートがあることがわかりました。これは、コレクション自体のためだけであり、個々のアイテムではありません。

注1:すべてのフォームのすべてのコレクションでこれを行うにはグローバルテンプレートを使用する必要がありますが、私は各フォームテンプレートでこれを解決できますが、それは重要ではありません。

注2:これまではjqueryでこれを解決しました。collection_widgetにクラスを追加し、jqueryを持つすべての子にボタンを追加しました。これは今のところうまく動作しますが、jqueryの処理をすべて行うことなく、100%のテンプレートソリューションを探しています。理想的には、新しい項目を追加するための行プロトタイプでも機能するはずです。

答えて

12

最後に、これには良い解決策が見つかりました。 まず、collection_widgetカスタムテンプレート(generic form_widgetからコピー)を作成し、form_rowsブロックを呼び出す代わりに、form_rowsブロックのカスタマイズであるcollection_rowsブロックを呼び出します。 collection_rowsブロックの中で、必要なものをカスタマイズすることができます。私はちょうど各子にカスタムクラスを追加しました。

{% block collection_widget %} 
{% spaceless %} 
    <div {{ block('widget_container_attributes') }}> 
     {{ block('collection_rows') }} 
     {{ form_rest(form) }} 
    </div> 
{% endspaceless %} 
{% endblock collection_widget %} 

{% block collection_rows %} 
{% spaceless %} 
    {{ form_errors(form) }} 
    {% for child in form %} 
     {{ form_row(child, {'attr':{'class':'collection-item'}}) }} 
    {% endfor %} 
{% endspaceless %} 
{% endblock collection_rows %} 

はここで2つのテンプレートです