今回もコアファイルの直接編集案件です。
お客様から相談を受けたのですが受注できなかった案件の一部です。
まぁ、折角なのでブログの記事にさせて頂こうと思います(笑)
内容は「送料無料条件(金額)を超えても特定の都道府県は送料無料にしない」です。
それでは試してみましょう。
■送料無料条件(金額)を超えても特定の都道府県は送料無料にしない方法
●ファイル
<インストールフォルダ>/src/Eccube/Service/ShoppingService.php
●モジュール
setDeliveryFreeAmount
●参考行目
687行目ぐらいから
※
既存のカスタマイズ内容は顧慮してません。
該当ファイルは初期の状態からカスタマイズをしています。
●変更内容
/** * 配送料無料条件(合計金額)の条件を満たしていれば配送料金を0に設定 * * @param Order $Order */ public function setDeliveryFreeAmount(Order $Order) { // 配送料無料条件(合計金額) $deliveryFreeAmount = $this->BaseInfo->getDeliveryFreeAmount(); if (!is_null($deliveryFreeAmount)) { // 合計金額が設定金額以上であれば送料無料 if ($Order->getSubTotal() >= $deliveryFreeAmount) { $Order->setDeliveryFeeTotal(0); // お届け先情報の配送料も0にセット $shippings = $Order->getShippings(); foreach ($shippings as $Shipping) { $Shipping->setShippingDeliveryFee(0); } } } }
↓
/** * 配送料無料条件(合計金額)の条件を満たしていれば配送料金を0に設定 * * @param Order $Order */ public function setDeliveryFreeAmount(Order $Order) { // 配送先都道府県情報を取得。 $objShippingsPref = $Order->getShippings(); $targetPref = $objShippingsPref[0]->getPref(); // 配送先都道府県が対象都道府県の場合は処理を抜ける。 switch ( $targetPref->getID() ) { case 1; case 47; return true; break; default; break; } // 配送料無料条件(合計金額) $deliveryFreeAmount = $this->BaseInfo->getDeliveryFreeAmount(); if (!is_null($deliveryFreeAmount)) { // 合計金額が設定金額以上であれば送料無料 if ($Order->getSubTotal() >= $deliveryFreeAmount) { $Order->setDeliveryFeeTotal(0); // お届け先情報の配送料も0にセット $shippings = $Order->getShippings(); foreach ($shippings as $Shipping) { $Shipping->setShippingDeliveryFee(0); } } } }
●概要説明
該当のモジュールは送料無料条件(金額)を超えたときに送料を無料にするためのモジュールです。
本来は配送無料条件を確認して、購入した商品小計が設定金額を超えている場合に送料を無料にします。
ただし、今回は特定の配送先が特定の都道府県の場合にその処理をバイパスさせます。
「$Order->getShippings();」にて配送先の都道府県を取得します。
複数配送先は確認していませんが、1件のみの場合は1件目の情報を対象としています。
「$objShippingsPref[0]->getPref();」で1件目の都道府県情報が取得できます。
最終的に「$targetPref->getID()」で取得した都道府県IDを設定したい都道府県IDと比較します。
対象都道府県の場合は送料無料判断を行いません。
まぁ、上記の様に簡易的に作成する場合の内容は簡単なものです。
実際には本番で使用する場合は「複数配送先の対応」や「送料無料条件(数量)」を考慮する必要があります。
「送料無料条件(数量)」は同一ファイルの「setDeliveryFreeQuantity」モジュールに同様の変更で出来そうな気もします。
とはいえ今回はブログ用の簡易版のため、こんな感じで良いかと思います(笑)
と云うことで今回は終了とさせて頂きます。