通常商品と予約商品を同じカートで決済できるようにしたくて、表示調整した時の話。
実現したいこと
ECCubeでは販売種別という項目があり、「通年商品」と「予約商品」の販売種別を登録し、それぞれ商品登録を行うと、まとめて購入できないような制御がされる。これは、やりたいことではなかった。
通常商品と予約商品をまとめて購入できるようにして、予約商品の準備ができたら、まとめて発送する運用がしたかった。
やったこと
- 予約商品カテゴリを追加
- 商品一覧、商品詳細で予約商品アイコンを表示
- 購入画面で予約商品と通常商品を一緒に買う場合は、まとめて発送する旨のメッセージを表示する
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;
}
この制御だけだと、お届け日指定したいという問い合わせがありそうなので、
注文画面で、予約商品と通常商品が含まれる場合に、以下の警告メッセージを表示するようにした。
このご注文は、予約商品の準備が出来次第、まとめて配送させていただきます。
尚、予約商品が含まれる場合は、配達指定日のご希望はできかねますが、配達時間指定はお承りいたします。
予約商品以外を別で発送をご希望の場合は、予約商品とは別でご注文手続きをお願いいたします。
注文受付メールにも、以下のメッセージを追加した。
このご注文は、予約商品の準備が出来次第、まとめて配送させていただきます。
最後に
共通関数を作って、処理を共通化したいところだが、急ぎで対応したく、ひとまずこれで進めることになった。
落ち着いたら、共通化を検討したい。