2012-02-06 8 views
2

フォームに隠れたフィールドのコレクションがあります。symfony2フォームコレクションでデータプロトタイプをカスタマイズする方法は?

<ul id="user_roles"> 
    <li><hidden field value="role1"></li> 
    <li><hidden field value="role2"></li> 
    (...) 
</ul> 

私は新しい役割を追加するためにjQuery(およびデータプロトタイプ)を使用します。

<ul id="user_roles"> 
    <li>role1 <hidden field value="role1"></li> 
    <li>role2 <hidden field value="role2"></li> 
    (...) 
</ul> 

初期レンダリングで問題ありませんが:私はちょうど置く:

{% for role in roles %} 
<li> {{ role }} {{ form_row(role) }} </li> 
{% endfor %} 

しかし、デフォルトのデータ

問題は、私はこのような何かをレンダリングしたいということです-prototypeは{{form_row(role)}}(隠しフィールド)のみをレンダリングします。

ここで、デフォルトのデータプロトタイプを変更する必要がありますか?

{% block collection_widget %} 
{% spaceless %} 
    {% if prototype is defined %} 
     {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %} 
    {% endif %} 
    {{ block('form_widget') }} 
{% endspaceless %} 
{% endblock collection_widget %} 

だからあなたはこのメソッドをオーバーライドすることができます。

答えて

8

次のようにコレクションのウィジェットが定義されている....私はカスタマイズすることができform_div_layout.htmlには{%ブロックのプロトタイプ%}がありませんプロトタイプのレンダリング方法を制御します。

1

また、roles.vars.prototypeを呼び出してJS内で使用することで、テンプレート内からプロトタイプにアクセスすることもできます。あなたはDIV(それが正常にレンダリングされるよう)あなたはそれを逃れるために覚えているのデータ・プロトタイプの属性にそれを配置する場合:

<div data-prototype="{{ form_row(roles.vars.prototype) | escape }}"> 
    {% for role in roles %} 
    <li> {{ role }} {{ form_row(role) }} </li> 
    {% endfor %} 
</div> 
0

docsに推奨される方法は、あなたが簡単に独立して内部の各コレクションをカスタマイズすることができますあなたのアプリは、すべて同じファイル内にあります。

  • ファイルprototype_layout.html.twig作成します。

    {% block _myform_mycollection_entry_row %} 
        <div class="row"> 
         <div class="col-sm-6">{{ form_row(form.title) }}</div> 
         <div class="col-sm-6">{{ form_row(form.author) }}</div> 
        </div> 
    {% endblock %} 
    

ブロックの名前は重要であるが。親フォームがMyformTypeと呼び出された場合、最初の部分は_myformになり、コレクションを所有するフォームフィールドが呼び出された場合は2番目の部分_mycollectionとなります。これが機能するには、3番目の部分は常に_entry_rowでなければなりません。あなたが'books'のコレクションとUserTypeフォームを持っている場合

例えば、ブロック名は_user_books_entry_row

は、あなたが名前の権利を得たことを確認してサブフォームを追加し、追加ボタンをクリックすることにより、(サブフォームを追加するかもしれませんjavascript)、ブラウザのインス​​ペクタツールを使用して、対応するselect html要素のIDを調べます。

それはuser_books_0_titleのように見える場合、ブロック名が_user_books_entry_row

  • config.ymlの小枝セクションのグローバル形式のテーマとしてこのファイルを宣言されます:

    twig: 
        form_themes: 
         - 'AppBundle:Form:prototype_layout.html.twig' #adapt this path if you saved your file elsewhere 
    
  • することができますまた、フォームビューで直接ファイルを使用してください:

{% use "AppBundle:Form:prototype_layout.html.twig" %}

+0

この質問は5歳です... – loostro

関連する問題