テーマ仕様書 更新履歴
2026年
2026/01/22更新

2026/01/22更新

+ 更新した行
- 削除した行

複数お届け先ごとのギフト設定機能の拡張

同一商品を複数購入した場合でも、お届け先ごとに異なるギフト設定ができるようになりました。

cart > カート画面

ec_force/shop/carts/show.html.liquid
ec_force/shop/carts/show.html+smartphone.liquid

     <!-- カート内ギフト商品一覧 -->
     {% if gift_order_items.size > 0 %}
       {% for gift_oi in gift_order_items %}
-        {% for gift_relation in gift_oi.gift_target_relations %}
+        {% for gift_relation in gift_oi.aggregated_gift_target_relations_for_cart %}
           {% if forloop.index0 == 0 %}
             <!-- ギフト商品画像 -->
             {% if gift_oi.available_thumbnail %}
           <!-- ギフト対象商品 -->
           {{ gift_relation.variant.name }}
 
-          {% if gift_oi.variant.gift.noshi? == true %}
+          {% if gift_oi.gift.noshi? == true %}
             <!-- 表書き -->

cart > 注文情報確認画面

ec_force/shop/orders/confirm.html.liquid
ec_force/shop/orders/confirm.html+smartphone.liquid

   <!-- ギフト設定情報 -->
   {% if gift_order_items.size > 0 %}
     {% for gift_oi in gift_order_items %}
-      {% for gift_relation in gift_oi.gift_target_relations %}
-        {% if forloop.index0 == 0 %}
-          <!-- ギフト商品名 -->
-          {{ gift_oi.name_with_tax_and_option_values_presentation }}
-        {% endif %}
-
-        <!-- ギフト対象商品名 -->
-        {{ gift_relation.variant.name_with_option_values_presentation }}
-
-        {% if gift_oi.gift.noshi? %}
-          <!-- 表書き -->
-          {% if gift_relation.description_part_of_noshi != blank %}
-            {{ gift_relation.description_part_of_noshi }}
+      {% assign has_displayed_header = false %}
+      {% for rel in gift_oi.gift_target_relations %}
+        {% if rel.gift_quantity > 0 %}
+          {% unless has_displayed_header %}
+            <!-- ギフト商品名 -->
+            {{ gift_oi.name_with_tax_and_option_values_presentation }}
+            {% assign has_displayed_header = true %}
+          {% endunless %}
+
+          <!-- ギフト対象商品名 -->
+          {{ rel.order_item.variant.name_with_option_values_presentation }}
+
+          {% if gift_oi.gift.noshi? %}
+            <!-- 表書き -->
+            {% if rel.description_part_of_noshi != blank %}
+              表書き:{{ rel.description_part_of_noshi }}
+            {% endif %}
+
+            <!-- 名入れ -->
+            {% if rel.name_part_of_noshi != blank %}
+              名入れ:{{ rel.name_part_of_noshi | escape }}
+            {% endif %}
           {% endif %}
 
-          <!-- 名入れ -->
-          {% if gift_relation.name_part_of_noshi != blank %}
-            {{ gift_relation.name_part_of_noshi | escape }}
-          {% endif %}
+          <!-- ギフト商品個数 -->
+          {{ rel.gift_quantity }} 個
         {% endif %}
-
-        <!-- ギフト商品個数 -->
-        {{ gift_relation.gift_quantity }}
       {% endfor %}
     {% endfor %}
   {% endif %}
         <!-- 商品情報 -->
         {% for order_item in shipping_address.order_items_and_gift_order_items %}
-
-          <!-- 商品名 -->
-          {{ order_item.variant.name_with_option_values_presentation }}
-
-          <!-- 商品個数 -->
-          {{ order_item.id | quantity_of: shipping_address.id }} 個
-
+          {% assign is_gift_product = order_item.variant.gift? %}
+          {% assign matching_count = 0 %}
+          {% assign non_multiple_address_count = 0 %}
+          {% if order_item.gift_relations %}
+            {% for gr in order_item.gift_relations %}
+              {% assign match_by_address_id = false %}
+              {% if gr.address_id == shipping_address.id %}
+                {% assign match_by_address_id = true %}
+              {% endif %}
+              {% assign match_by_non_multiple = false %}
+              {% if gr.address_id == blank and gr.multiple_address? == false %}
+                {% assign match_by_non_multiple = true %}
+              {% endif %}
+              {% if match_by_address_id or match_by_non_multiple %}
+                {% assign matching_count = matching_count | plus: 1 %}
+                {% if match_by_non_multiple %}
+                  {% assign non_multiple_address_count = non_multiple_address_count | plus: 1 %}
+                {% endif %}
+              {% endif %}
+            {% endfor %}
+          {% endif %}
+          {% assign is_non_multiple_address_gift = false %}
+          {% if matching_count > 0 and matching_count == non_multiple_address_count %}
+            {% assign is_non_multiple_address_gift = true %}
+          {% endif %}
+          {% unless is_gift_product %}
+            <!-- 商品名 -->
+            {{ order_item.variant.name_with_option_values_presentation }}
+            <!-- 商品個数 -->
+            ({{ order_item.id | quantity_of: shipping_address.id }} 個)
+
+            {% if matching_count > 0 %}
+              {% assign has_noshi_info = false %}
+              {% for gr in order_item.gift_relations %}
+                {% assign match_by_address_id = false %}
+                {% if gr.address_id == shipping_address.id %}
+                  {% assign match_by_address_id = true %}
+                {% endif %}
+                {% assign match_by_non_multiple = false %}
+                {% if gr.address_id == blank and gr.multiple_address? == false %}
+                  {% assign match_by_non_multiple = true %}
+                {% endif %}
+                {% if match_by_address_id or match_by_non_multiple %}
+                  {% if gr.description_part_of_noshi != blank or gr.name_part_of_noshi != blank %}
+                    {% assign has_noshi_info = true %}
+                  {% endif %}
+                {% endif %}
+              {% endfor %}
+              {% if has_noshi_info %}
+                {% for gift_relation in order_item.gift_relations %}
+                  {% assign match_by_address_id = false %}
+                  {% if gift_relation.address_id == shipping_address.id %}
+                    {% assign match_by_address_id = true %}
+                  {% endif %}
+                  {% assign match_by_non_multiple = false %}
+                  {% if gift_relation.address_id == blank and gift_relation.multiple_address? == false %}
+                    {% assign match_by_non_multiple = true %}
+                  {% endif %}
+                  {% if match_by_address_id or match_by_non_multiple %}
+                    {% if is_non_multiple_address_gift %}
+                      {% assign display_quantity = order_item.id | quantity_of: shipping_address.id %}
+                    {% else %}
+                      {% assign display_quantity = gift_relation.gift_quantity %}
+                    {% endif %}
+                    ギフト: {{ gift_relation.gift_order_item.variant.name_with_option_values_presentation }}({{ display_quantity }} 個)
+                    {% if gift_relation.description_part_of_noshi != blank %}
+                      表書き:{{ gift_relation.description_part_of_noshi }}
+                    {% endif %}
+                    {% if gift_relation.name_part_of_noshi != blank %}
+                      名入れ:{{ gift_relation.name_part_of_noshi }}
+                    {% endif %}
+                  {% endif %}
+                {% endfor %}
+              {% else %}
+                {% assign first_gift_relation = nil %}
+                {% assign total_gift_quantity = 0 %}
+                {% for gr in order_item.gift_relations %}
+                  {% assign match_by_address_id = false %}
+                  {% if gr.address_id == shipping_address.id %}
+                    {% assign match_by_address_id = true %}
+                  {% endif %}
+                  {% assign match_by_non_multiple = false %}
+                  {% if gr.address_id == blank and gr.multiple_address? == false %}
+                    {% assign match_by_non_multiple = true %}
+                  {% endif %}
+                  {% if match_by_address_id or match_by_non_multiple %}
+                    {% if first_gift_relation == nil %}
+                      {% assign first_gift_relation = gr %}
+                    {% endif %}
+                    {% assign total_gift_quantity = total_gift_quantity | plus: gr.gift_quantity %}
+                  {% endif %}
+                {% endfor %}
+                {% if is_non_multiple_address_gift %}
+                  {% assign total_gift_quantity = order_item.id | quantity_of: shipping_address.id %}
+                {% endif %}
+                ギフト: {{ first_gift_relation.gift_order_item.variant.name_with_option_values_presentation }}({{ total_gift_quantity }} 個)
+              {% endif %}
+            {% endif %}
+          {% endunless %}
         {% endfor %}
 
         <!-- 配送業者 -->

cart > ギフト商品一覧(部分テンプレート)

ec_force/shop/carts/_view_gift.html.liquid
ec_force/shop/carts/_view_gift.html+smartphone.liquid

         <!-- ギフト商品名 -->
         {{ gift.name | truncate: 35 }}
 
+        <!-- 複数お届け先対応 -->
+        {% if gift.multiple_address %}
+          {{ 'gift.multiple_address.available' | t }}
+        {% endif %}
+
         <!-- ギフト商品販売価格 -->
         <span class="sales-price">{{ gift.first_price | number_to_currency }}</span>
 
         <form action="/shop/cart/add" method="post" class="gift-form">
           <input type="hidden" name="variant_id" value="{{ gift.master_id }}" class="variant-id">
           <input type="hidden" name="gift_id" value="{{ gift.id }}" class="gift-id">
           <input type="hidden" class="order-item-id-for-gift" name="gift[order_item_id_for_gift]" value="">
+          <input type="hidden" class="multiple-address" value="{{ gift.multiple_address }}">
 
           <!-- ギフト商品(熨斗)の場合 -->
           {% if gift.noshi? %}

cart > 複数のお届け先入力フォーム(部分テンプレート)

ec_force/shop/orders/_view_multiple_shipping_information_form_data.html.liquid
ec_force/shop/orders/_view_multiple_shipping_information_form_data.html+smartphone.liquid

 {% if multiple_shipping_is_available %}
 
   <!-- 複数のお届け先フォームデータ -->
   <div id="multiple-shipping-raw-form">
     {% for shipping_address in order.shipping_addresses_without_deleted %}
       <!-- お届け先ごとのフォームデータ枠(必須タグ) -->
-      <div>
+      <div data-shipping-address-id="{{ shipping_address.id }}" data-form-index="{{ forloop.index0 }}">
 
         {% assign index = forloop.index0 %}
         <!-- お届け先商品情報 -->
-        {% for order_item in order_items_without_bundled_and_gift %}
-          {% assign order_items_info = "" %}
-          {% for oiil in shipping_address.order_items_info_list %}
-            {% if oiil.order_item.id == order_item.id %}
-              {% assign order_items_info = oiil %}
+        {% assign gift_sets = order.multiple_address_gift_relations_grouped %}
+        {% if order.gift_sets_for_view_by_index[index] %}
+          {% assign gift_sets = order.gift_sets_for_view_by_index[index] %}
+        {% endif %}
+        {% assign gift_target_order_item_ids = gift_sets | map: 'order_item_id' | uniq %}
+        <!-- ギフト対象商品ごとのギフト合計数量を計算 -->
+        {% assign gift_total_by_order_item = "" %}
+        {% for order_item_id in gift_target_order_item_ids %}
+          {% assign gift_total = 0 %}
+          {% for gs in gift_sets %}
+            {% if gs.order_item_id == order_item_id %}
+              {% assign gift_total = gift_total | plus: gs.gift_quantity %}
             {% endif %}
           {% endfor %}
-
-          <label>{{ order_item.variant.name_with_option_values_presentation }}</label>
-          <div class="order_items_info">
-
-            <!-- お届け先商品数量の選択 -->
-            <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
-            <select class="order_items_info__quantity" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]">
-              {% for i in (0..order_item.quantity) %}
-                <option value="{{ i }}" {% if order_items_info.quantity == i %}selected{% endif %}>{{ i }}</option>
-              {% endfor %}
-            </select>
-
-          </div>
+          {% capture gift_total_by_order_item %}{{ gift_total_by_order_item }}{{ order_item_id }}:{{ gift_total }};{% endcapture %}
         {% endfor %}
+        {% assign gift_relation_idx = 0 %}
+        <table class="product-gift-set-table" data-index="{{ index }}">
+          <tbody>
+          {% for order_item in order_items_without_bundled_and_gift %}
+            {% assign order_items_info = "" %}
+            {% for oiil in shipping_address.order_items_info_list %}
+              {% if oiil.order_item.id == order_item.id %}
+                {% assign order_items_info = oiil %}
+              {% endif %}
+            {% endfor %}
+            {% assign is_gift_target = false %}
+            {% for gid in gift_target_order_item_ids %}
+              {% if gid == order_item.id %}
+                {% assign is_gift_target = true %}
+              {% endif %}
+            {% endfor %}
+            <!-- ギフト対象商品の場合 -->
+            {% if is_gift_target %}
+              {% assign gift_total = 0 %}
+              {% for gs in gift_sets %}
+                {% if gs.order_item_id == order_item.id %}
+                  {% assign gift_total = gift_total | plus: gs.gift_quantity %}
+                {% endif %}
+              {% endfor %}
+              {% assign no_gift_max = order_item.quantity | minus: gift_total %}
+              <!-- このお届け先へのギフト付き数量を計算 -->
+              {% assign gift_quantity_for_address = 0 %}
+              {% if shipping_address.gift_relations %}
+                {% for gr in shipping_address.gift_relations %}
+                  {% if gr.order_item_id == order_item.id %}
+                    {% assign gift_quantity_for_address = gift_quantity_for_address | plus: gr.gift_quantity %}
+                  {% endif %}
+                {% endfor %}
+              {% endif %}
+              {% assign total_quantity_for_address = order_items_info.quantity | default: 0 %}
+              {% assign no_gift_quantity_tmp = total_quantity_for_address | minus: gift_quantity_for_address %}
+              {% if no_gift_quantity_tmp < 0 %}
+                {% assign no_gift_quantity = 0 %}
+              {% else %}
+                {% assign no_gift_quantity = no_gift_quantity_tmp %}
+              {% endif %}
+              <!-- 「ギフトなし」行(ギフト数 < 商品数の場合のみ表示) -->
+              {% if no_gift_max > 0 %}
+                <tr class="order-item-row no-gift-row" data-order-item-id="{{ order_item.id }}" data-gift-total="{{ gift_total }}" data-no-gift-max="{{ no_gift_max }}">
+                  <th>
+                    <label>{{ order_item.variant.name_with_option_values_presentation }}(ギフトなし)</label>
+                  </th>
+                  <td class="order_items_info">
+                    <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
+                    <select class="order_items_info__no_gift_quantity" data-order-item-id="{{ order_item.id }}" data-no-gift-max="{{ no_gift_max }}">
+                      {% for i in (0..no_gift_max) %}
+                        <option value="{{ i }}" {% if no_gift_quantity == i %}selected{% endif %}>{{ i }} 個</option>
+                      {% endfor %}
+                    </select>
+                    <input type="hidden" class="order_items_info__quantity_hidden" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]" value="{{ total_quantity_for_address }}" data-order-item-id="{{ order_item.id }}">
+                  </td>
+                </tr>
+              {% else %}
+                <!-- ギフトなしの数量が0の場合(すべてギフト付き)、hidden inputのみ送信 -->
+                <tr class="order-item-row" data-order-item-id="{{ order_item.id }}" style="display:none;">
+                  <th>
+                    <label>{{ order_item.variant.name_with_option_values_presentation }}</label>
+                  </th>
+                  <td class="order_items_info">
+                    <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
+                    <input type="hidden" class="order_items_info__quantity_hidden" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]" value="{{ total_quantity_for_address }}" data-order-item-id="{{ order_item.id }}">
+                  </td>
+                </tr>
+              {% endif %}
+              <!-- 「商品+ギフト」行(同じテーブル内に表示) -->
+              {% for gift_set in gift_sets %}
+                {% if gift_set.order_item_id == order_item.id %}
+                  {% assign max_selectable = gift_set.gift_order_item.quantity | default: gift_set.gift_quantity %}
+                  {% if gift_set.max_gift_quantity %}
+                    {% assign max_selectable = gift_set.max_gift_quantity %}
+                  {% endif %}
+                  <!-- このお届け先に設定されたギフト数量を取得 -->
+                  {% assign selected_gift_qty = 0 %}
+                  {% if shipping_address.gift_relations %}
+                    {% for gr in shipping_address.gift_relations %}
+                      {% assign name_match = false %}
+                      {% if gr.name_part_of_noshi == blank and gift_set.name_part_of_noshi == blank %}
+                        {% assign name_match = true %}
+                      {% elsif gr.name_part_of_noshi == gift_set.name_part_of_noshi %}
+                        {% assign name_match = true %}
+                      {% endif %}
+                      {% assign desc_match = false %}
+                      {% if gr.description_part_of_noshi == blank and gift_set.description_part_of_noshi == blank %}
+                        {% assign desc_match = true %}
+                      {% elsif gr.description_part_of_noshi == gift_set.description_part_of_noshi %}
+                        {% assign desc_match = true %}
+                      {% endif %}
+                      {% if gr.order_item_id == gift_set.order_item_id and gr.gift_order_item_id == gift_set.gift_order_item_id and name_match and desc_match %}
+                        {% assign selected_gift_qty = gr.gift_quantity %}
+                      {% endif %}
+                    {% endfor %}
+                  {% endif %}
+                  <tr class="product-gift-set-row" data-order-item-id="{{ gift_set.order_item_id }}" data-gift-order-item-id="{{ gift_set.gift_order_item_id }}" data-name-part-of-noshi="{{ gift_set.name_part_of_noshi }}" data-description-part-of-noshi="{{ gift_set.description_part_of_noshi }}">
+                    <th>
+                      {{ gift_set.order_item.variant.name_with_option_values_presentation }}
+                      <br>
+                      {{ gift_set.gift_order_item.variant.name_with_option_values_presentation }}
+                      {% if gift_set.description_part_of_noshi != blank %}
+                        <br>
+                        表書き:{{ gift_set.description_part_of_noshi }}
+                      {% endif %}
+                      {% if gift_set.name_part_of_noshi != blank %}
+                        <br>
+                        名入れ:{{ gift_set.name_part_of_noshi }}
+                      {% endif %}
+                    </th>
+                    <td>
+                      <select class="gift-relation-quantity" data-order-item-id="{{ gift_set.order_item_id }}" data-max-quantity="{{ max_selectable }}">
+                        {% for i in (0..max_selectable) %}
+                          <option value="{{ i }}" {% if i == selected_gift_qty %}selected{% endif %}>{{ i }} 個</option>
+                        {% endfor %}
+                      </select>
+                      <input type="hidden" class="gift-relation-quantity-hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][quantity]" value="{{ selected_gift_qty }}">
+                      <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][order_item_id]" value="{{ gift_set.order_item_id }}">
+                      <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][gift_order_item_id]" value="{{ gift_set.gift_order_item_id }}">
+                      <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][name_part_of_noshi]" value="{{ gift_set.name_part_of_noshi }}">
+                      {% if gift_set.description_part_of_noshi != blank %}
+                        <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][description_part_of_noshi]" value="{{ gift_set.description_part_of_noshi }}">
+                      {% endif %}
+                    </td>
+                  </tr>
+                  {% assign gift_relation_idx = gift_relation_idx | plus: 1 %}
+                {% endif %}
+              {% endfor %}
+            {% else %}
+              <!-- 通常商品(ギフト対象外) -->
+              <tr class="order-item-row" data-order-item-id="{{ order_item.id }}">
+                <th>
+                  <label>{{ order_item.variant.name_with_option_values_presentation }}</label>
+                </th>
+                <td class="order_items_info">
+                  <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
+                  <select class="order_items_info__quantity" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]">
+                    {% for i in (0..order_item.quantity) %}
+                      <option value="{{ i }}" {% if order_items_info.quantity == i %}selected{% endif %}>{{ i }}</option>
+                    {% endfor %}
+                  </select>
+                </td>
+              </tr>
+            {% endif %}
+          {% endfor %}
+          </tbody>
+        </table>
 
         <!-- 配送業者情報 -->
         <div style="{% unless display_shipping_carrier_view_flag %}display: none;{% endunless %}">
     <!-- お届け先商品情報 -->
-    {% for order_item in order_items_without_bundled_and_gift %}
-      {% assign order_items_info = "" %}
-      {% for oiil in shipping_address.order_items_info_list %}
-        {% if oiil.order_item.id == order_item.id %}
-          {% assign order_items_info = oiil %}
+    {% assign gift_sets = order.multiple_address_gift_relations_grouped %}
+    {% if order.gift_sets_for_view_by_index[index] %}
+      {% assign gift_sets = order.gift_sets_for_view_by_index[index] %}
+    {% endif %}
+    {% assign gift_target_order_item_ids = gift_sets | map: 'order_item_id' | uniq %}
+    <!-- ギフト対象商品ごとのギフト合計数量を計算 -->
+    {% assign gift_total_by_order_item = "" %}
+    {% for order_item_id in gift_target_order_item_ids %}
+      {% assign gift_total = 0 %}
+      {% for gs in gift_sets %}
+        {% if gs.order_item_id == order_item_id %}
+          {% assign gift_total = gift_total | plus: gs.gift_quantity %}
         {% endif %}
       {% endfor %}
-
-      <label>{{ order_item.variant.name_with_option_values_presentation }}</label>
-      <div class="order_items_info">
-
-        <!-- お届け先商品数量の選択 -->
-        <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
-        <select class="order_items_info__quantity" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]">
-          {% for i in (0..order_item.quantity) %}
-            <option value="{{ i }}" {% if order_items_info.quantity == i %}selected{% endif %}>{{ i }}</option>
-          {% endfor %}
-        </select>
-
-      </div>
+      {% capture gift_total_by_order_item %}{{ gift_total_by_order_item }}{{ order_item_id }}:{{ gift_total }};{% endcapture %}
     {% endfor %}
+    {% assign gift_relation_idx = 0 %}
+    <table class="product-gift-set-table" data-index="{{ index }}">
+      <tbody>
+      {% for order_item in order_items_without_bundled_and_gift %}
+        {% assign order_items_info = "" %}
+        {% for oiil in shipping_address.order_items_info_list %}
+          {% if oiil.order_item.id == order_item.id %}
+            {% assign order_items_info = oiil %}
+          {% endif %}
+        {% endfor %}
+        {% assign is_gift_target = false %}
+        {% for gid in gift_target_order_item_ids %}
+          {% if gid == order_item.id %}
+            {% assign is_gift_target = true %}
+          {% endif %}
+        {% endfor %}
+        <!-- ギフト対象商品の場合 -->
+        {% if is_gift_target %}
+          {% assign gift_total = 0 %}
+          {% for gs in gift_sets %}
+            {% if gs.order_item_id == order_item.id %}
+              {% assign gift_total = gift_total | plus: gs.gift_quantity %}
+            {% endif %}
+          {% endfor %}
+          {% assign no_gift_max = order_item.quantity | minus: gift_total %}
+          <!-- このお届け先へのギフト付き数量を計算 -->
+          {% assign gift_quantity_for_address = 0 %}
+          {% if shipping_address.gift_relations %}
+            {% for gr in shipping_address.gift_relations %}
+              {% if gr.order_item_id == order_item.id %}
+                {% assign gift_quantity_for_address = gift_quantity_for_address | plus: gr.gift_quantity %}
+              {% endif %}
+            {% endfor %}
+          {% endif %}
+          {% assign total_quantity_for_address = order_items_info.quantity | default: 0 %}
+          {% assign no_gift_quantity_tmp = total_quantity_for_address | minus: gift_quantity_for_address %}
+          {% if no_gift_quantity_tmp < 0 %}
+            {% assign no_gift_quantity = 0 %}
+          {% else %}
+            {% assign no_gift_quantity = no_gift_quantity_tmp %}
+          {% endif %}
+          <!-- 「ギフトなし」行(ギフト数 < 商品数の場合のみ表示) -->
+          {% if no_gift_max > 0 %}
+            <tr class="order-item-row no-gift-row" data-order-item-id="{{ order_item.id }}" data-gift-total="{{ gift_total }}" data-no-gift-max="{{ no_gift_max }}">
+              <th>
+                <label>{{ order_item.variant.name_with_option_values_presentation }}(ギフトなし)</label>
+              </th>
+              <td class="order_items_info">
+                <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
+                <select class="order_items_info__no_gift_quantity" data-order-item-id="{{ order_item.id }}" data-no-gift-max="{{ no_gift_max }}">
+                  {% for i in (0..no_gift_max) %}
+                    <option value="{{ i }}" {% if no_gift_quantity == i %}selected{% endif %}>{{ i }} 個</option>
+                  {% endfor %}
+                </select>
+                <input type="hidden" class="order_items_info__quantity_hidden" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]" value="{{ total_quantity_for_address }}" data-order-item-id="{{ order_item.id }}">
+              </td>
+            </tr>
+          {% else %}
+            <!--ギフトなしの数量が0の場合(すべてギフト付き)、hidden inputのみ送信 -->
+            <tr class="order-item-row" data-order-item-id="{{ order_item.id }}" style="display:none;">
+              <th>
+                <label>{{ order_item.variant.name_with_option_values_presentation }}</label>
+              </th>
+              <td class="order_items_info">
+                <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
+                <input type="hidden" class="order_items_info__quantity_hidden" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]" value="{{ total_quantity_for_address }}" data-order-item-id="{{ order_item.id }}">
+              </td>
+            </tr>
+          {% endif %}
+          <!-- 「商品+ギフト」行(同じテーブル内に表示) -->
+          {% for gift_set in gift_sets %}
+            {% if gift_set.order_item_id == order_item.id %}
+              {% assign max_selectable = gift_set.gift_order_item.quantity | default: gift_set.gift_quantity %}
+              {% if gift_set.max_gift_quantity %}
+                {% assign max_selectable = gift_set.max_gift_quantity %}
+              {% endif %}
+              <!-- このお届け先に設定されたギフト数量を取得 -->
+              {% assign selected_gift_qty = 0 %}
+              {% if shipping_address.gift_relations %}
+                {% for gr in shipping_address.gift_relations %}
+                  {% assign name_match = false %}
+                  {% if gr.name_part_of_noshi == blank and gift_set.name_part_of_noshi == blank %}
+                    {% assign name_match = true %}
+                  {% elsif gr.name_part_of_noshi == gift_set.name_part_of_noshi %}
+                    {% assign name_match = true %}
+                  {% endif %}
+                  {% assign desc_match = false %}
+                  {% if gr.description_part_of_noshi == blank and gift_set.description_part_of_noshi == blank %}
+                    {% assign desc_match = true %}
+                  {% elsif gr.description_part_of_noshi == gift_set.description_part_of_noshi %}
+                    {% assign desc_match = true %}
+                  {% endif %}
+                  {% if gr.order_item_id == gift_set.order_item_id and gr.gift_order_item_id == gift_set.gift_order_item_id and name_match and desc_match %}
+                    {% assign selected_gift_qty = gr.gift_quantity %}
+                  {% endif %}
+                {% endfor %}
+              {% endif %}
+              <tr class="product-gift-set-row" data-order-item-id="{{ gift_set.order_item_id }}" data-gift-order-item-id="{{ gift_set.gift_order_item_id }}" data-name-part-of-noshi="{{ gift_set.name_part_of_noshi }}" data-description-part-of-noshi="{{ gift_set.description_part_of_noshi }}">
+                <th>
+                  {{ gift_set.order_item.variant.name_with_option_values_presentation }}
+                  <br>
+                  {{ gift_set.gift_order_item.variant.name_with_option_values_presentation }}
+                  {% if gift_set.description_part_of_noshi != blank %}
+                    <br>
+                    表書き:{{ gift_set.description_part_of_noshi }}
+                  {% endif %}
+                  {% if gift_set.name_part_of_noshi != blank %}
+                    <br>
+                    名入れ:{{ gift_set.name_part_of_noshi }}
+                  {% endif %}
+                </th>
+                <td>
+                  <select class="gift-relation-quantity" data-order-item-id="{{ gift_set.order_item_id }}" data-max-quantity="{{ max_selectable }}">
+                    {% for i in (0..max_selectable) %}
+                      <option value="{{ i }}" {% if i == selected_gift_qty %}selected{% endif %}>{{ i }} 個</option>
+                    {% endfor %}
+                  </select>
+                  <input type="hidden" class="gift-relation-quantity-hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][quantity]" value="{{ selected_gift_qty }}">
+                  <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][order_item_id]" value="{{ gift_set.order_item_id }}">
+                  <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][gift_order_item_id]" value="{{ gift_set.gift_order_item_id }}">
+                  <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][name_part_of_noshi]" value="{{ gift_set.name_part_of_noshi }}">
+                  {% if gift_set.description_part_of_noshi != blank %}
+                    <input type="hidden" name="order[shipping_addresses_attributes][{{ index }}][gift_relations_attributes][{{ gift_relation_idx }}][description_part_of_noshi]" value="{{ gift_set.description_part_of_noshi }}">
+                  {% endif %}
+                </td>
+              </tr>
+              {% assign gift_relation_idx = gift_relation_idx | plus: 1 %}
+            {% endif %}
+          {% endfor %}
+        {% else %}
+          <!-- 通常商品(ギフト対象外) -->
+          <tr class="order-item-row" data-order-item-id="{{ order_item.id }}">
+            <th>
+              <label>{{ order_item.variant.name_with_option_values_presentation }}</label>
+            </th>
+            <td class="order_items_info">
+              <input type="hidden" class="order_items_info__order_item_id" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][order_item_id]" value="{{ order_item.id }}">
+              <select class="order_items_info__quantity" name="order[shipping_addresses_attributes][{{ index }}][order_items_info_list_attributes][{{ forloop.index0 }}][quantity]">
+                {% for i in (0..order_item.quantity) %}
+                  <option value="{{ i }}" {% if order_items_info.quantity == i %}selected{% endif %}>{{ i }}</option>
+                {% endfor %}
+              </select>
+            </td>
+          </tr>
+        {% endif %}
+      {% endfor %}
+      </tbody>
+    </table>
 
     <!-- 配送業者情報 -->

mypage > 購入履歴詳細画面 お届け先情報

ec_force/shop/customer/orders/shipping_addresses/show.html.liquid
ec_force/shop/customer/orders/shipping_addresses/show.html+smartphone.liquid

 
       <!-- 商品情報 -->
       {% for order_item in shipping_address.order_items_and_gift_order_items %}
-        <!-- 商品名 -->
-        {{ order_item.variant.name_with_option_values_presentation }}
-          (
-          <!-- 商品個数 -->
-          {{ order_item.id | quantity_of: shipping_address.id }} 個
-          )
+        {% unless order_item.product.gift? %}
+          <!-- 商品名 -->
+          {{ order_item.variant.name_with_option_values_presentation }}
+          ({{ order_item.id | quantity_of: shipping_address.id }} 個)
+
+          {% assign matching_count = 0 %}
+          {% assign non_multiple_address_count = 0 %}
+          {% for gift_relation in order_item.gift_relations %}
+            {% assign match_by_address_id = false %}
+            {% if gift_relation.address_id == shipping_address.id %}
+              {% assign match_by_address_id = true %}
+            {% endif %}
+            {% assign match_by_non_multiple = false %}
+            {% if gift_relation.address_id == blank and gift_relation.multiple_address? == false %}
+              {% assign match_by_non_multiple = true %}
+            {% endif %}
+            {% if match_by_address_id or match_by_non_multiple %}
+              {% assign matching_count = matching_count | plus: 1 %}
+              {% if match_by_non_multiple %}
+                {% assign non_multiple_address_count = non_multiple_address_count | plus: 1 %}
+              {% endif %}
+            {% endif %}
+          {% endfor %}
+          {% assign is_non_multiple_address_gift = false %}
+          {% if matching_count > 0 and matching_count == non_multiple_address_count %}
+            {% assign is_non_multiple_address_gift = true %}
+          {% endif %}
+          {% for gift_relation in order_item.gift_relations %}
+            {% assign match_by_address_id = false %}
+            {% if gift_relation.address_id == shipping_address.id %}
+              {% assign match_by_address_id = true %}
+            {% endif %}
+            {% assign match_by_non_multiple = false %}
+            {% if gift_relation.address_id == blank and gift_relation.multiple_address? == false %}
+              {% assign match_by_non_multiple = true %}
+            {% endif %}
+            {% if match_by_address_id or match_by_non_multiple %}
+              {% if is_non_multiple_address_gift %}
+                {% assign display_quantity = order_item.id | quantity_of: shipping_address.id %}
+              {% else %}
+                {% assign display_quantity = gift_relation.gift_quantity %}
+              {% endif %}
+              └ {{ gift_relation.gift_order_item.variant.name_with_option_values_presentation }}
+              ({{ display_quantity }} 個)
+              {% if gift_relation.description_part_of_noshi != blank %}
+                / 表書き:{{ gift_relation.description_part_of_noshi }}
+              {% endif %}
+              {% if gift_relation.name_part_of_noshi != blank %}
+                / 名入れ:{{ gift_relation.name_part_of_noshi }}
+              {% endif %}
+            {% endif %}
+          {% endfor %}
+        {% endunless %}
       {% endfor %}
 
       {% if editable_shipping_address %}

軽微な機能改修

検索後の画面で検索条件を保持・表示する対応をおこないました。

shared_partial > sidebar(部分テンプレート)

ec_force/shop/shared/_sidebar.html.liquid
ec_force/shop/shared/_sidebar.html+smartphone.liquid

       <label>カテゴリ</label>
       <select name="q[products_product_categories_product_category_id_eq]" id="q_products_product_categories_product_category_id_eq">
         <option value="">選択してください</option>
+
+        {% assign selected_category_id = params["q"]["products_product_categories_product_category_id_eq"] | append: "" %}
         {% for category in product_categories %}
           {% if category.product_category_visibility %}
-            <option value="{{ category.id }}">{{ category.name }}</option>
+            {% assign category_id_str = category.id | append: "" %}
+
+            <option value="{{ category.id }}" {% if selected_category_id == category_id_str %}selected{% endif %}>{{ category.name }}</option>
           {% endif %}
         {% endfor %}
       </select>
       <label>メーカー</label>
       <select name="q[maker_id_eq]" id="q_maker_id_eq">
         <option value="">選択してください</option>
+
+        {% assign selected_maker_id = params["q"]["maker_id_eq"] | append: "" %}
         {% for maker in makers %}
-          <option value="{{ maker.id }}">{{ maker.name }}</option>
+          {% assign maker_id_str = maker.id | append: "" %}
+
+          <option value="{{ maker.id }}" {% if selected_maker_id == maker_id_str %}selected{% endif %}>{{ maker.name }}</option>
         {% endfor %}
       </select>
       <!-- ラベル -->
       <label>ラベル</label>
       {% for label in product_labels %}
-        <input type="checkbox" name="q[labels_id_in][]" id="q_labels_id_in_{{ label.id }}" class="product-label" value="{{ label.id }}">
+        {% assign label_id_str = label.id | append: "" %}
+        {% assign is_checked = false %}
+
+        {% if params["q"]["labels_id_in"] %}
+          {% for selected_label_id in params["q"]["labels_id_in"] %}
+            {% assign selected_label_id_str = selected_label_id | append: "" %}
+            {% if label_id_str == selected_label_id_str %}
+              {% assign is_checked = true %}
+            {% endif %}
+          {% endfor %}
+        {% endif %}
+
+        <input type="checkbox" name="q[labels_id_in][]" id="q_labels_id_in_{{ label.id }}" class="product-label" value="{{ label.id }}" {% if is_checked %}checked{% endif %}>
         <label for="q_labels_id_in_{{ label.id }}" class="mt10 mr10 p5"># {{ label.name }}</label>
       {% endfor %}

layout > 購入以外(レイアウト)

layouts/ec_force/shop.html.liquid
layouts/ec_force/shop.html+smartphone.liquid

     {% include 'ec_force/shop/shared/nav.html' %}
 
     <!-- サイドバー: shared_partial(sidebar) の読み込み (任意) -->
+    <!-- PC: sidebar.html / SP: sidebar.html+smartphone -->
     {% include 'ec_force/shop/shared/sidebar.html' %}
 
     <!-- ecforceが提供しているJavascript変数を読み込むための記述 -->
     {{ include_gon }}

layout > 購入

layouts/ec_force/shop/order.html.liquid
layouts/ec_force/shop/order.html+smartphone.liquid

     {% include 'ec_force/shop/shared/nav.html' %}
 
     <!-- サイドバー: shared_partial(sidebar) の読み込み (任意) -->
+    <!-- PC: sidebar.html / SP: sidebar.html+smartphone -->
     {% include 'ec_force/shop/shared/sidebar.html' %}
 
     <!-- ecforceが提供しているJavascript変数を読み込むための記述 -->
     {{ include_gon }}

不具合修正

サンクスオファー機能を利用している際に起こる、軽微な不具合を修正しました。

cart > サンクスオファー画面

ec_force/shop/orders/cv_upsell.liquid
ec_force/shop/orders/cv_upsell.html+smartphone.liquid

 {% assign css_path = '/shop_templates/' | append: template['id'] %}
 {% assign css_full_path = css_path | append: '/css.css' %}
-{{ css_full_path | stylesheet_link_tag }}
+<link rel="stylesheet" media="screen" href="{{ css_full_path }}" />
 
 {% assign javascript_path = '/shop_templates/' | append: template['id'] %}
 {% assign javascript_full_path = javascript_path | append: '/javascript.js' %}
-{{ javascript_full_path | javascript_include_tag }}
+<script src="{{ javascript_full_path }}"></script>