ECCube4で予約商品を扱う

ECCube4で予約商品を扱う

通常商品と予約商品を同じカートで決済できるようにしたくて、表示調整した時の話。

実現したいこと

ECCubeでは販売種別という項目があり、「通年商品」と「予約商品」の販売種別を登録し、それぞれ商品登録を行うと、まとめて購入できないような制御がされる。これは、やりたいことではなかった。

通常商品と予約商品をまとめて購入できるようにして、予約商品の準備ができたら、まとめて発送する運用がしたかった。

やったこと

  1. 予約商品カテゴリを追加
  2. 商品一覧、商品詳細で予約商品アイコンを表示
  3. 購入画面で予約商品と通常商品を一緒に買う場合は、まとめて発送する旨のメッセージを表示する
1. 予約商品カテゴリ追加対応について

予約商品カテゴリは、管理画面から登録した。
商品一覧には、予約商品カテゴリを表示したくなかったので、予約商品アイコン表示対応の処理を参考に表示制御を行う。

2. 予約商品アイコン表示対応について

予約商品かどうかを一覧や商品画面でわかりやすくするために、予約商品アイコンをメイン画像上部に表示させるようにした。
表示制御は、以下の処理で対応

{% set isReserveProduct = false %}
{% for ProductCategory in Product.ProductCategories %}
    {% if ProductCategory.Category.id == 2 %}
        {% set isReserveProduct = true %}
    {% endif %}
{% endfor %}
{% if isReserveProduct %}
<div class="ec-productRole__icon-reserve">予約商品</div>
{% endif %}
3. まとめて発送する旨のメッセージ表示対応について

同じ販売種別で商品を登録すれば、お届け日指定は複数商品の最長設定が利用されるので、予約商品を「指定なし」に設定し、通常商品と同じ販売種別で登録した。

そうすることで、通常商品と予約商品をまとめて購入しようとすると、
一つのカートで支払いができて、お届け日指定は「指定なし」になる。

→「指定なし」を設定すると、うまく動作していなかった。

./src/Eccube/Form/Type/Shopping/ShippingType.php の133行目

foreach ($Shipping->getOrderItems() as $detail) {

の下に以下を追加した。

  // 予約商品が含まれる場合は、「指定なし」のみにする
  if ($detail->isProduct()) {
      $reserveProduct = false;
      $ProductCategories = $detail->getProduct()->getProductCategories();
      foreach ($ProductCategories as $ProductCategory) {
          if ($ProductCategory->getCategoryId() == 2) {
              $reserveProduct = true;
              break;
          }
      }
      if ($reserveProduct) break;
  }


この制御だけだと、お届け日指定したいという問い合わせがありそうなので、
注文画面で、予約商品と通常商品が含まれる場合に、以下の警告メッセージを表示するようにした。

このご注文は、予約商品の準備が出来次第、まとめて配送させていただきます。
尚、予約商品が含まれる場合は、配達指定日のご希望はできかねますが、配達時間指定はお承りいたします。
予約商品以外を別で発送をご希望の場合は、予約商品とは別でご注文手続きをお願いいたします。

注文受付メールにも、以下のメッセージを追加した。

このご注文は、予約商品の準備が出来次第、まとめて配送させていただきます。

最後に

共通関数を作って、処理を共通化したいところだが、急ぎで対応したく、ひとまずこれで進めることになった。

落ち着いたら、共通化を検討したい。

Web技術カテゴリの最新記事