LoginSignup
0
0

More than 1 year has passed since last update.

EC-CUBE4 form_widget の内容を特定の項目だけ変更する方法

Last updated at Posted at 2022-01-28

はじめに

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 %}

ほかにも色々あるので、公式ドキュメントを参照ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0