symfony2フォームコレクションでデータプロトタイプをカスタマイズする方法は?

私は自分のフォームに隠れたフィールドのコレクションを持っています。

  • (...)

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

問題は次のようなものをレンダリングすることです:

  • role1
  • role2
  • (...)

最初のレンダリングに問題はありません。次のように入力します:

{% for role in roles %}
 
  • {{ role }} {{ form_row(role) }}
  • {% endfor %}

    しかし、デフォルトのデータプロトタイプは{{form_row(role)}}(隠しフィールド)のみをレンダリングします。

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

    私がカスタマイズできるform_div_layout.htmlには{%block prototype%}はありません....

    2

    3 答え

    コレクションウィジェットは次のように定義されています。

    {% 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
    追加された

    また、roles.vars.prototypeを呼び出してJS内のプロトタイプにアクセスすることもできます。 divのdata-prototype属性(通常はレンダリングされるような)に入れたい場合は、それをエスケープする必要があります。

    <div data-prototype="{{ form_row(roles.vars.prototype) | escape }}">
      {% for role in roles %}
        
  • {{ role }} {{ form_row(role) }}
  • {% endfor %} </div>
    1
    追加された

    ドキュメントで推奨されている方法は、 a>を使用すると、アプリ内で個々のコレクションを個別にカスタマイズすることができます。すべて同じファイル内にあります。

    • Create a file 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 で、コレクションを所有するフォームフィールドがそう呼ばれる場合は _mycollection です。これを行うには、3番目の部分は常に _entry_row でなければなりません。

    For example, if you have a UserType form with a collection of 'books' the block name might be _user_books_entry_row

    名前が正しいことを確認するには、サブフォームを追加し(追加ボタンをクリックしてサブフォームにjavascriptを追加します)、ブラウザのインス​​ペクタツールを使用して対応するselect html要素のIDを調べます。

    If it looks like user_books_0_title, then the block name will be _user_books_entry_row

    • Declare this file as a global form theme in the twig section of config.yml:

      twig:
          form_themes:
              - 'AppBundle:Form:prototype_layout.html.twig' #adapt this path if you saved your file elsewhere
      
    • You can also use the file directly in your form view:

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

    0
    追加された
    この質問は5歳です...
    追加された 著者 loostro,