2013-06-18 14 views
7

ドキュメントには、ウィジェットの名前/ IDに基づいて、symfonyの方法がcustomize a Individual fieldにあります。ここSymfony Twigは、コレクションのIndividualフィールドをカスタマイズします

{% form_theme form _self %} 

{% block _product_name_widget %} 
    <div class="text_widget"> 
     {{ block('field_widget') }} 
    </div> 
{% endblock %} 

{{ form_widget(form.name) }} 

、_product_name_widget断片は、そのID(及び名称は、商品[名]である)PRODUCT_NAMEあるフィールドに使用するテンプレートを定義します。

これは通常のウィジェットでは機能しますが、ウィジェットがコレクション内にある場合は機能しません。余分な列のために。このように:

name="productbundle_product_type[foobar][1][value]" id="productbundle_product_type_foobar_1_value" 

コレクション内でTwigカスタマイズを行う方法はありますか?

私はこのような何かを考えたが、それは動作しません:

{% for db in edit_form.list %} 
    {% block _productbundle_product_type_foobar_{{ db.name }}_widget %} 
     <div class="text_widget"> 
      {{ block('field_widget') }} 
     </div> 
    {% endblock %} 
{% endfor %} 

でも次は動作しません:

{% _productbundle_product_type_foobar_1_value_widget %} 

それを動作させるための方法は何ですか?

+0

そして、 '{%block_product_tund_product_type_foobar_1 _ {{db.name}} _ widget%}'( '_1_') – cheesemacfly

+0

を使用しない場合、以下も機能しません:' {%_productbundle_product_type_foobar_1_value_widget%} ' – user2382765

+0

私は驚いています。 states: 'ここで、_product_name_widgetフラグメントは、idがproduct_name(かつ、nameはproduct [name])のフィールドに使用するテンプレートを定義しています。 'したがって、ウィジェットの名前が' productbundle_product_type [foobar] [1] [value] '{%block _product_tund_product_type_foobar_1_value_widget%} 'を使用できるはずです。 – cheesemacfly

答えて

3

私は夜のカップルの前にプロジェクトに取り組んでかつ正確にこの問題が発生しました - 私が見つけた解決策は、この(プロジェクト固有のコードを剥奪)のように見えるブロックのペアです:

{# Collection markup #} 
{% block my_collection_widget %} 
    {# Customise collection row prototype for allow_add #} 
    {% if prototype is defined %} 
     {% set data_prototype = block('my_collection_item_widget') %} 
     <div id="my_prototype" data-prototype="{{ data_prototype }}" style="display: none"></div> 
    {% endif %} 

    {% for prototype in form %} 
     {{ block('my_collection_item_widget') }} 
    {% endfor %} 
{% endblock my_collection_widget %} 

{# Collection row markup #} 
{% block my_collection_item_widget %} 
    {# Collection contains simple, single type #} 
    {{ form_errors(prototype) }} 
    {{ form_label(prototype) }} 
    {{ form_widget(prototype) }} 

    {# OR #} 

    {# Collection contains a compound type, render child types independantly #} 
    {{ form_errors(prototype.inner_widget) }} 
    {{ form_label(prototype.inner_widget) }} 
    {{ form_widget(prototype.inner_widget) }} 
{% endblock my_collection_item_widget %} 
+0

'メソッド "inner_widgetは存在しません。メソッド "inner_widget"。 My_collection_widgetの名前は何ですか? _productbundle_product_type_foobar_widgetは機能しません。必要な要件を満たしていないと思います。 – user2382765

+0

両方のブロックの 'my​​_collection'を、レンダリングしているフォームのコレクションの名前に置き換えます。 * _item_widgetブロック内では、コレクション内の1つのアイテムに対してカスタムマークアップを提供します。コレクションがシンプル(単一のタイプ)の場合は、必要なカスタムマークアップで{{form _ *(prototype)}}を呼び出します。コレクションがより複雑な場合(各コレクションアイテムに複数のタイプが含まれている場合)、上記の例では、各埋め込みタイプをカスタマイズする方法を示しています。 – ptlis

+0

私は同じページにいない:-)私はちょうどより多くを追加する可能性なしで、コレクションを示しています。 '$ builder - > add( 'foobar'、 'collection'、array( 'type' => new ProductbundleProductType()、)); ' – user2382765

関連する問題