はじめに
OneToMany な関係の CollectionType のフォームを作るとき、 form_widget(form.productItems.vars.prototype)
としたときの内容を変更する方法になります。
※ EC-CUBE 特有の機能ではなく、Symfony の機能です。
方法
{% form_theme form _self %}
が重要です。
これがなければ、次に紹介するブロックを定義しても反映されません。
※ すでに form_theme
が設定済みの場合は、後ろに追加します。
管理画面:{% form_theme form '@admin/Form/bootstrap_4_horizontal_layout.html.twig' _self %}
フロント:{% form_theme form 'Form/form_div_layout.twig' _self %}
通常
次に、_formname_fieldname_widget
ブロックを用意します。
ブロック名は、ルールがあります。
EntryType
という名前のフォームに、 sex
というフィールドがある場合は _entry_sex_widget
というブロック名になります。
{% form_theme form _self %}
{% block _formname_fieldname_widget %}
{%- for choice in choices -%}
<label>
<input type="radio" name="{{ full_name }}" id="{{ id }}_{{ loop.index }}" value="{{ choice.value }}" {% if data and data.id == choice.value %}checked="checked"{% endif %}>
{{- choice.label -}}
</label>
{%- endfor -%}
{% endblock %}
※ フォーム部品の name
属性を確認して、 entry[sex]
のようになっていれば上記の方法でカスタマイズできますが
sex
となっている場合は、フォーム名が出ていない状態なので、 _fieldname_widget
というブロック名になります。
コレクションフィールドの場合
次に、_formname_fieldname_entry_widget
ブロックを用意します。
ブロック名は、ルールがあります。
ProductType
という名前のフォームに、 productItems
という CollectionType のフィールドがある場合は _product_product_items_entry_widget
というブロック名になります。
{% form_theme form _self %}
{% block _formname_fieldname_entry_widget %}
<div>
<div>
{{ form_widget(form.name) }}
{{ form_widget(form.content) }}
</div>
<div>
<button type="button" data-index="{{ name }}">削除</button>
</div>
</div>
{% endblock %}
ほかにも色々あるので、公式ドキュメントを参照ください。