EC-CUBE4で商品ごとに送料無料設定して購入手続き中に送料無料商品が含まれていたら送料無料にする方法です。
dtb_productテーブルに送料無料フラグカラムを追加
送料無料商品があるか判定するために、dtb_productテーブルに送料無料フラグカラムを追加します。
サンプルコードは以下のとおりです。
<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
use Eccube\Annotation\FormAppend;
/**
* @EntityExtension("Eccube\Entity\Product")
*/
trait ProductTrait
{
/**
* @ORM\Column(type="boolean", nullable=true)
* @FormAppend(
* auto_render=true,
* type="\Eccube\Form\Type\ToggleSwitchType",
* options={
* "label": "送料無料設定"
* }
* )
*/
private $delivery_free;
public function isDeliveryFree(): ?bool
{
return $this->delivery_free;
}
public function setDeliveryFree(?bool $delivery_free): self
{
$this->delivery_free = $delivery_free;
return $this;
}
}
以下のように表示されます。
送料無料設定を有効化したらその商品は送料無料商品となります。
購入手続き中に送料無料設定商品があったら送料無料にする
EC-CUBE4で実装されたPurchaseFlowを使って購入手続き中に送料無料設定商品があったら送料無料にします。
サンプルコードは以下のとおりです。
<?php
namespace Customize\Service\PurchaceFlow\Validator;
use Eccube\Annotation\ShoppingFlow;
use Eccube\Entity\ItemHolderInterface;
use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor;
use Eccube\Service\PurchaseFlow\PurchaseContext;
/**
* 送料無料設定商品があったら送料無料にする
*
* Class DeliveryFreeValidator
* @package Customize\Service\PurchaceFlow\Validator
*
* @ShoppingFlow()
*/
class DeliveryFreeValidator implements ItemHolderPreprocessor
{
/**
* @inheritDoc
*/
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
// 送料無料設定商品がないか探す
$isDeliveryFree = false;
foreach($itemHolder->getItems() as $item) {
if($item->isProduct()) {
if($item->getProductClass()->getProduct()->isDeliveryFree()) {
$isDeliveryFree = true;
break;
}
}
}
// 送料無料設定商品があったら送料明細の数量を0にする
if($isDeliveryFree) {
foreach($itemHolder->getItems() as $item) {
if($item->isDeliveryFee()) {
$item->setQuantity(0);
}
}
}
}
}
注文明細一覧から送料無料商品を探して、送料無料商品が見つかったら送料明細の数量を0としています。
送料明細を0とすることで送料無料となります。
以上で完成です。

