テーマ仕様書 更新履歴
2022年
2022/02/07更新

2022/02/07更新

+ 追加した行
- 削除した行

マイページで定期をキャンセル/停止した際に、キャンセル理由/停止理由が選べるようにする

mypage > 定期注文詳細画面

テーマ管理のファイルパス
ec_force/shop/customer/subs_orders/show.html.liquid
ec_force/shop/customer/subs_orders/show.html+smartphone.liquid

 <!-- 定期購入停止リンク -->
 {% if base_info.subs_order_cancelable? and subs_order.human_state_name == "有効" and subs_order.remaining_block_times == 0 %}
-  <a href="/shop/customer/subs_orders/{{ subs_order.number }}" data-method="delete" data-confirm="本当に停止しますか?">停止</a>
+  {% if base_info.subs_order_cancelable_reason? and reasons.size != 0 %}
+    <a href="/shop/customer/subs_orders/{{ subs_order.number }}/cancel">停止</a>
+  {% else %}
+    <a href="/shop/customer/subs_orders/{{ subs_order.number }}" data-method="delete" data-confirm="本当に停止しますか?">停止</a>
+  {% endif %}
 {% endif %}

mypage > 定期注文詳細画面 停止・キャンセル理由選択

テーマ管理のファイルパス(新規ファイル)
ec_force/shop/customer/subs_orders/cancel.html.liquid
ec_force/shop/customer/subs_orders/cancel.html+smartphone.liquid

購入フォームで指定できる「ラッピング」の設定値を、表示/非表示できるようにする

cart > ラッピング(部分テンプレート)

テーマ管理のファイルパス
ec_force/shop/orders/_view_wrapping_information.html.liquid
ec_force/shop/orders/_view_wrapping_information.html+smartphone.liquid

     <select id='wrapping-id' name='order[wrapping_id]'>
       <option value=''>無し</option>
       {% for wrapping in wrappings %}
-        <option value="{{ wrapping.id }}" {% if order.wrapping_id == wrapping.id %}selected{% endif %} data-thumbnail-url="{{ wrapping.thumbnail.url }}">{{ wrapping.name }} {{ wrapping.price | number_to_currency : format: '%n %u' }}</option>
+        {% if wrapping.active %}
+          <option value="{{ wrapping.id }}" {% if order.wrapping_id == wrapping.id %}selected{% endif %} data-thumbnail-url="{{ wrapping.thumbnail.url }}">{{ wrapping.name }} {{ wrapping.price | number_to_currency : format: '%n %u' }}</option>
+        {% endif %}
       {% endfor %}
     </select>

マイページの定期管理にて、次回定期受注の商品追加、削除を行えるようにする

2021/11 リリース からの更新となります。

mypage > 定期注文詳細画面 商品情報

テーマ管理のファイルパス
ec_force/shop/customer/subs_orders/order_items/index.html.liquid
ec_force/shop/customer/subs_orders/order_items/index.html+smartphone.liquid

 <!-- 商品の追加(任意) -->
-{% assign order_item_ids = subs_order.order_items | map: 'variant_id' | join: ',' | split: ',' %}
 {% if base_info.variant_addable_on_mypage? and products_addable_on_mypage_in_all_variants%}
-  {% for product in products %}
-    {% assign flag = true %}
-    {% for oi in order_item_ids %}
-      {% assign id =  oi | plus: 0 %}
-      {% if product.master.id == id %}
-        {% assign flag = false %}
+  {% for product in addable_products %}
+    <a href="/shop/customer/subs_orders/{{ subs_order.number }}/order_items/add?product_number={{ product.number }}">
+      {% if product.thumbnail.url %}
+        {% assign src = product.thumbnail.url %}
+      {% else %}
+        {% assign src = 'missing' | image_url %}
       {% endif %}
-    {% endfor %}
-    {% if flag == true and product.master.products_addable_on_mypage == true and product.master.visible_in_cart %}
-      <a href="/shop/customer/subs_orders/{{ subs_order.number }}/order_items/add?product_number={{ product.number }}">
-        {% if product.thumbnail.url %}
-          {% assign src = product.thumbnail.url %}
-        {% else %}
-          {% assign src = 'missing' | image_url %}
-        {% endif %}
-        <img src="{{ src }}">
-      </a>
-      <p>{{ product.name | truncate: 35 }}</p>
-      <p>販売価格:<span>{{ product.first_price | number_to_currency: format: '%n %u' }}</span></p>
-      <a href="/shop/customer/subs_orders/{{ subs_order.number }}/order_items/add?product_number={{ product.number }}">
-        <button>追加する</button>
-      </a>
-    {% endif %}
+      <img src="{{ src }}">
+    </a>
+    <p>{{ product.name | truncate: 35 }}</p>
+    {% assign options = "" %}
+    {% assign options = options | append: product.id | append: "," | append: subs_order.times %}
+    {% assign options_array = options | split: "," %}
+    <p>販売価格:<span>{{ options_array | liquid_recurring_time_price | number_to_currency: format: '%n %u' }}</span></p>
+    <a href="/shop/customer/subs_orders/{{ subs_order.number }}/order_items/add?product_number={{ product.number }}">
+      <button>追加する</button>
+    </a>
   {% endfor %}
 {% endif %}

mypage > 定期注文詳細画面 商品の追加

テーマ管理のファイルパス
ec_force/shop/customer/subs_orders/variants/show.html.liquid
ec_force/shop/customer/subs_orders/variants/show.html+smartphone.liquid

 {% assign template = 'shop/customer/subs_orders/variants' %}
 
 <div id="product-show-view">
-
-
+  <input id="subs-order-number" type="hidden" value="{{ params[:id] }}">
+  <input id="variant-sku" type="hidden" value="{{ product.master.sku }}">
 
   <!-- 商品画像 -->
   {% if product.thumbnail.url %}
   <!-- 通常価格(税込み) -->
   <span id="list-price-include-tax">{{ product.master.list_price_include_tax | number_to_currency: format: '%n %u' }}</span>
 
+  {% assign options = "" %}
+  {% assign options = options | append: product.id | append: "," | append: subs_order.times %}
+  {% assign options_array = options | split: "," %}
   <!-- 販売価格 -->
-  <span id="sales-price">{{ product.first_price | number_to_currency: format: '%n %u' }}</span>
+  <span id="sales-price">{{ options_array | liquid_recurring_time_price | number_to_currency: format: '%n %u' }}</span>
   <!-- 販売価格(税込み) -->
-  <span id="sales-price-include-tax">{{ product.first_price_include_tax | number_to_currency: format: '%n %u' }}</span>
+  <span id="sales-price-include-tax">{{ options_array | liquid_recurring_time_price_include_tax | number_to_currency: format: '%n %u' }}</span>
 
   <!-- メーカー(任意) -->
   {{ product.maker.name }}

ecforce payments の実装

  • 該当の決済方法(ecforce-payments)をご利用されないショップ様はコード修正の必要はありません。
  • 2021/10 リリースの更新履歴もご確認ください

mypage > クレジットカード情報一覧/登録画面

テーマ管理のファイルパス
ec_force/shop/customer/cards/index.html.liquid
ec_force/shop/customer/cards/index.html+smartphone.liquid

       <!-- カード番号 -->
       <label for="number">カード番号</label>
-      <input class="validate[required,custom[integer],maxSize[16]]" id="number" name="card[number]">
+      {% if ecforce_payment_available %}
+        <div id="ecforce-payment-card-number-error"></div>
+        <div id="ecforce-view-input-card-number">
+          <div class="ecforce-payment-card-number">
+            <div id="card-number"></div>
+          </div>
+          <input id="number" style="display: none;" class="validate[required]" name="card[number]" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-number-error">
+        </div>
+      {% else %}
+        <input class="validate[required,custom[integer],maxSize[16]]" id="number" name="card[number]">
+      {% endif %}
 
       <!-- カード有効期限 -->
       <label for="month">カード有効期限</label>
-      <select class="validate[required]" id="month" name="card[month]">
-        <option value="">--</option>
-        {% for m in (1..12) %}
-          <option value='{{ m }}'>{{ m }}</option>
-        {% endfor %}
-      </select>
-      月
-      <select class="validate[required]" id="year" name="card[year]">
-        <option value="">--</option>
-        {% assign now_year = "now" | date: "%Y" | minus: 2000 %}
-        {% assign later_15_years = "now" | date: "%Y" | plus: 15 | minus: 2000 %}
-        {% for y in (now_year..later_15_years) %}
-          <option value='{{ y }}'>{{ y }}</option>
-        {% endfor %}
-      </select>
-      年
+      {% if ecforce_payment_available %}
+        <div id="expire-validation" class="ecforce-input-card-info">
+          <div id="ecforce-payment-card-expiry-error"></div>
+          <div class="ecforce-payment-card-expiry">
+            <div id="card-expiry"></div>
+          </div>
+          <input type="hidden" id ="ecforce-payment-expiry" class="validate_req validate[required]" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-expiry-error" disabled>
+          <input type="hidden" id="month" name="card[month]">
+          <input type="hidden" id="year" name="card[year]">
+        </div>
+      {% else %}
+        <select class="validate[required]" id="month" name="card[month]">
+          <option value="">--</option>
+          {% for m in (1..12) %}
+            <option value='{{ m }}'>{{ m }}</option>
+          {% endfor %}
+        </select>
+        月
+        <select class="validate[required]" id="year" name="card[year]">
+          <option value="">--</option>
+          {% assign now_year = "now" | date: "%Y" | minus: 2000 %}
+          {% assign later_15_years = "now" | date: "%Y" | plus: 15 | minus: 2000 %}
+          {% for y in (now_year..later_15_years) %}
+            <option value='{{ y }}'>{{ y }}</option>
+          {% endfor %}
+        </select>
+        年
+      {% endif %}
 
       <!-- カード名義 -->
       <label for="name">カード名義</label>
-      <input class="validate[required,custom[onlyLetterSp]]" id="name" name="card[name]">
+      {% if ecforce_payment_available %}
+        <div id="ecforce-payment-card-name-error"></div>
+        <input class="validate[required,custom[onlyLetterSp]]" id="name" name="card[name]" placeholder="例)HANAKO YAMADA" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-name-error">
+      {% else %}
+        <input class="validate[required,custom[onlyLetterSp]]" id="name" name="card[name]">
+      {% endif %}
 
       <!-- セキュリティコード -->
       <div id="view-input-card-cvv" style="display: none;">
         <label for="name">セキュリティコード</label>
-        <input class="validate[required]" id="cvv" name="cvv">
+        {% if ecforce_payment_available %}
+          {% if use_cvc == 'true' %}
+            <div id="cvv-validation" class="ecforce-input-card-info">
+              <div id="ecforce-payment-card-cvv-error"></div>
+              <div class="ecforce-payment-card-cvv">
+                <div id="card-cvv"></div>
+              </div>
+              <input type="hidden" id="cvv" class="validate_req validate[required]" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-cvv-error" disabled>
+            </div>
+          {% endif %}
+        {% else %}
+          <input class="validate[required]" id="cvv" name="cvv">
+        {% endif %}
       </div>
 
       <!-- デフォルト -->

cart > 支払い方法(部分テンプレート)

テーマ管理のファイルパス
ec_force/shop/orders/_view_payment_information.html.liquid
ec_force/shop/orders/_view_payment_information.html+smartphone.liquid

     <div id="view-input-card-number" style="{% if current_customer_has_card %}display:none;{% endif %}">
       <label>クレジットカード番号</label>
       {% if ecforce_payment_available %}
-        <div class="ecforce-payment-card-number">
-          <div id="card-number"></div>
-          <input type="hidden" name="order[payment_attributes][source_attributes][last_digits]" id="ecforce-payment-last-digits" class="validate[required]">
+        <div id="ecforce-payment-card-number-error"></div>
+        <div id="ecforce-view-input-card-number">
+          <div class="ecforce-payment-card-number">
+            <div id="card-number"></div>
+          </div>
+          <input id="ecforce-payment-last-digits" style="display: none;" class="validate[required]" name="order[payment_attributes][source_attributes][last_digits]" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-number-error">
         </div>
       {% else %}
         <input type="hidden" name="order[payment_attributes][source_attributes][default]" id="input-cc-default" {% if current_customer_has_card %}disabled{% endif %} value="1">
     <div id="view-input-card-expire" style={% if current_customer_has_card %}"display:none;"{% endif %}>
       <label>カードの有効期限</label>
       {% if ecforce_payment_available %}
-        <div class="ecforce-payment-card-expiry">
-          <div id="card-expiry"></div>
+        <div id="expire-validation" class="ecforce-input-card-info">
+          <div id="ecforce-payment-card-expiry-error"></div>
+          <div class="ecforce-payment-card-expiry">
+            <div id="card-expiry"></div>
+          </div>
+          <input type="hidden" id ="ecforce-payment-expiry" class="validate_req validate[required]" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-expiry-error" disabled>
           <input type="hidden" id="ecforce-payment-month" name="order[payment_attributes][source_attributes][month]">
           <input type="hidden" id="ecforce-payment-year" name="order[payment_attributes][source_attributes][year]">
         </div>
     <!-- クレジットカード名義人の入力 -->
     <div id="view-input-card-name" style={% if current_customer_has_card %}"display:none;"{% endif %}>
       <label>カードの名義人</label>
-      <input type="text" name="order[payment_attributes][source_attributes][name]" id="input-cc-name" class="validate[required,custom[onlyLetterSp]]" value='{{ order.payment.source.name }}' {% if current_customer_has_card %}disabled{% endif %}>
+      {% if ecforce_payment_available %}
+        <div id="ecforce-payment-card-name-error"></div>
+        <input type="text" name="order[payment_attributes][source_attributes][name]" id="input-cc-name" class="validate[required,custom[onlyLetterSp]]" value='{{ order.payment.source.name }}' {% if current_customer_has_card %}disabled{% endif %} placeholder="例)HANAKO YAMADA" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-name-error">
+      {% else %}
+        <input type="text" name="order[payment_attributes][source_attributes][name]" id="input-cc-name" class="validate[required,custom[onlyLetterSp]]" value='{{ order.payment.source.name }}' {% if current_customer_has_card %}disabled{% endif %}>
+      {% endif %}
     </div>
 
     <!-- セキュリティコードの入力 -->
     <div id="view-input-card-cvv" {% if current_customer_has_card %}style="display:none;"{% endif %}>
       <label>セキュリティコード</label>
       {% if ecforce_payment_available %}
-        <div class="ecforce-payment-card-cvc">
-          <div id="card-cvc"></div>
-        </div>
+        {% if use_cvc == 'true' %}
+          <div id="cvv-validation" class="ecforce-input-card-info">
+            <div id="ecforce-payment-card-cvv-error"></div>
+            <div class="ecforce-payment-card-cvv">
+              <div id="card-cvv"></div>
+            </div>
+            <input type="hidden" id="cvv" class="validate_req validate[required]" data-prompt-position="inline" data-prompt-target="ecforce-payment-card-cvv-error" disabled>
+          </div>
+        {% endif %}
       {% else %}
         <input type="text" name="cvv" id="input-cc-cvv" class="validate[required]" {% if current_customer_has_card %}disabled{% endif %}>
       {% endif %}

頒布会機能の実装

mypage > 定期注文画面 頒布会情報の編集

テーマ管理のファイルパス
ec_force/shop/customer/subs_orders/distribution_clubs/edit.html.liquid
ec_force/shop/customer/subs_orders/distribution_clubs/edit.html+smartphone.liquid

       <!-- 価格(税抜) -->
-      0円
+      {% if distribution_club.fixed_price? %}
+        0円
+      {% else %}
+        {{ order_item.recurring_next_current_price | number_to_currency: format: '%n %u' }}
+      {% endif %}
     {% endfor %}
   {% endfor %}

その他軽微な修正

mypage > お気に入り一覧画面

テーマ管理のファイルパス
ec_force/shop/customer/favorites/index.html.liquid
ec_force/shop/customer/favorites/index.html+smartphone.liquid

     <!-- 操作 -->
-    <a data-confirm="商品名:{{ favorite.product.name }} をお気に入りから削除しますか?" rel="nofollow" data-method="delete" href="/shop/customer/favorites/{{ favorite.product.id }}">削除</a>
+    <a data-confirm="商品名:{{ favorite.product.name }} をお気に入りから削除しますか?" rel="nofollow" data-method="delete" href="/shop/customer/favorites/{{ favorite.id }}">削除</a>

mypage > 定期注文詳細画面 商品の編集

テーマ管理のファイルパス
ec_force/shop/customer/subs_orders/order_items/edit.html.liquid
ec_force/shop/customer/subs_orders/order_items/edit.html+smartphone.liquid

   <!-- ポイント交換予約キャンセル -->
   {% if base_info.use_point? and order_item.point_exchange_reserved? %}
     <a data-confirm="本当に予約キャンセルしますか?" rel="nofollow" data-method="delete" href="/shop/customer/subs_orders/{{ subs_order.number }}/point_exchange_reservations/{{ order_item.id }}">予約キャンセル</a>
-  {% elsif order_item.point_exchange_reserved? == false %}
-  <!-- 削除ボタン -->
+  {% elsif base_info.variant_deletable_on_mypage? and order_item.point_exchange_reserved? == false %}
+    <!-- 削除ボタン -->
     <a data-confirm="本当に削除しますか?" data-method="delete" href="/shop/customer/subs_orders/{{ subs_order.number }}/order_items/{{ order_item.id }}">削除</a>
   {% endif %}
 </div>

set > セット一覧画面

テーマ管理のファイルパス
ec_force/shop/sets/index.html.liquid
ec_force/shop/sets/index.html+smartphone.liquid

-  <!-- セット詳細 -->
+  <!-- (PCの場合)セット詳細 -->
  {{ set.description }}
+  <!-- (SPの場合)セット詳細 -->
+  {{ set.description_mobile }}

set > セット選択画面

テーマ管理のファイルパス
ec_force/shop/sets/show.html.liquid
ec_force/shop/sets/show.html+smartphone.liquid

         <!-- 保存ボタン -->
-        <input id="save-btn" class='submit' data-disable-with='保存中...' type='submit' value='保存'>
+        <input id="save-btn" class='submit' data-disable-with='保存中...' type='submit' value='保存' disabled>