EC-CUBE4の送料計算は、都道府県ごとの計算になっています。
そのため、1個ごとに送料計算やサイズ・重量で送料計算するためにはカスタマイズが必要です。
サイズ・重量での送料計算は、運送会社の料金計算の基準となっているので、必要になることが多いです。
この記事では、EC-CUBE4の送料設定の機能と条件に応じたカスタマイズの方法を説明します。
カスタマイズの方法だけ知りたい方は、目次で対象の見出しをクリックしてください。
環境
EC-CUBE ver4.1.2
送料設定の機能について
EC-CUBE4の送料は、以下の3つの項目を基準に計算されています。
- 配送方法に設定された各都道府県の送料
- 送料無料条件
- 商品ごとの送料
それぞれの項目を簡単に説明します。
1.配送方法に設定された各都道府県の送料
送料の計算の基準は、配送方法設定から設定された各都道府県の送料です。
配送業者と配送方法ごとに送料を設定できます。
例えば、A業者のA配送方法の送料、A業者のB配送方法の送料といった感じです。
2.送料無料条件
金額や数量に応じて、送料無料の条件設定ができます。
そのため、◯◯円以上は無料のパターンや、◯個以上は無料のパターンにも対応することができます。
送料無料条件は、「1.配送方法に設定された各都道府県の送料」や「3.商品ごとの送料」で設定された値よりも優先されます。
3.商品ごとの送料
通常の送料に加えて、商品に対して送料を設定することができます。
例えば、送料が1000円、A商品の送料が500円とした場合、A商品を2つ購入すると、1000円+500円*2 = 2000円の送料となります。
EC-CUBE4の送料計算は、シンプルで機能があってわかりやすいため、多くの送料パターンに対応することができます。
しかし、運送会社の基準になっているサイズ・送料での送料計算や、その他の複雑な送料計算をするためにはカスタマイズが必要です。
そこで、送料計算をカスタマイズする方法を説明します。
送料計算のカスタマイズ
送料計算をカスタマイズするためには、購入フローについてどのような処理をされているかを理解しておくと役立ちます。
購入フローについては公式サイトを確認してください。
実際のソースコードを見ると、クラスやメソッドの名前が少し違っていますが、大きくは変わっていません。
簡単にまとめると、Processorを利用すれば、送料を計算したり、値引きをしたりといったことが、カスタマイズしやすくなっています。
Processorは、やりたいことによって対象のクラスやインターフェースが用意されています。
送料計算の場合、ItemHolderPreprocessorを利用します。
ItemHolderPreprocessorを利用して、1個ごとでの送料計算と、サイズ・重量での送料計算の2パターンの送料計算を行ってみます。
1個ごとでの送料計算
Customizeディレクトリの下に、
Service/PurchaseFlow/Processor/DeliveryFeePreprocessor.phpファイルを作成します。
今回はDeliveryFeePreprocessorにしていますが、好きなファイル名に変更しても問題なく動作します。
DeliveryFeePreprocessor.phpファイルに以下のコードを追加します。
<?php
namespace Customize\Service\PurchaseFlow\Processor;
use Eccube\Entity\ItemHolderInterface;
use Eccube\Repository\DeliveryFeeRepository;
use Eccube\Repository\DeliveryRepository;
use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Annotation\ShoppingFlow;
/**
* サイズ・重量で送料追加
*
* @ShoppingFlow
*/
class DeliveryFeePreprocessor implements ItemHolderPreprocessor
{
/**
* @var DeliveryFeeRepository
*/
protected $deliveryFeeRepository;
/**
* @var DeliveryRepository
*/
protected $deliveryRepository;
/**
*
* @param DeliveryFeeRepository $deliveryFeeRepository
* @param DeliveryRepository $deliveryRepository
*/
public function __construct(
DeliveryFeeRepository $deliveryFeeRepository,
DeliveryRepository $deliveryRepository
) {
$this->deliveryFeeRepository = $deliveryFeeRepository;
$this->deliveryRepository = $deliveryRepository;
}
/**
* @param ItemHolderInterface $itemHolder
* @param PurchaseContext $context
*
* @throws \Doctrine\ORM\NoResultException
*/
public function process(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
$this->updateDeliveryFeeItem($itemHolder);
}
/**
* @param ItemHolderInterface $itemHolder
*
* @throws \Doctrine\ORM\NoResultException
*/
private function updateDeliveryFeeItem(ItemHolderInterface $itemHolder)
{
/** @var Order $Order */
$Order = $itemHolder;
/* @var Shipping $Shipping */
foreach ($Order->getShippings() as $Shipping) {
$quantity = 0;
// 送料を計算
// 都道府県送料 * 個数(1商品で1個口)
foreach ($Shipping->getOrderItems() as $item) {
// 送料以外は商品の数をカウント
if (!$item->isDeliveryFee()) {
$quantity += $item->getQuantity();
continue;
}
// 送料の金額に商品の数量分かけて計算
$fee = $item->getPrice() * $quantity;
$item->setPrice($fee);
}
}
}
}
最初の@ShoppingFlowを指定することで、購入フローにProcessorを追加することができます。
サイズ・重量での送料計算
サイズ・重量での送料計算は、サイズ・重量で送料計算できるように以下のことを行います。
- 商品にサイズ、重量を設定する項目を追加する
- 配送方法にサイズ・重量を判定するための条件を設定する項目を追加する
- 商品購入時の配送方法の制御
今回、上の3つの詳細な手順とコードは省略します。
要望があれば追加しようと思います。
もともと、各都道府県で配送方法ごとに送料の設定ができるため、例えば、「A配送方法 Sサイズ」、「A配送方法 Mサイズ」のように設定します。
こうすることで、各サイズ・重量に応じた送料の設定が可能です。
残る問題は、カートに入れて商品を購入する際に、どうやって条件に応じた配送方法で購入されるかということです。
これは、ご注文手続き画面の配送方法の箇所に、条件に応じた配送方法を表示すれば解決します。
ということで、カスタマイズするのはFormです。
配送業者のプルダウンが生成されているShippingTypeを拡張します。
購入しようとしている商品のサイズと重量に個数を掛けて、合計サイズ、合計重量を計算します。
deliveryRepositoryのgetDeliveriesメソッドで配送業者を取得しているので、このメソッドをカスタマイズするか、新しくメソッドを作成します。
これで、サイズ・重量に応じて送料を設定することができます。
仕組みさえ理解しておけば、ロジックを書き換えるだけで、様々なパターンに対応できると思います。
まとめ
Processorを利用すれば、送料計算のカスタマイズができるということを説明しました。
また、サイズ・重量での送料計算についても説明しました。
デフォルトである程度自由なことはできますが、やはり、様々な条件での配送方法の実装が求められることがあります。
そんな時に、この記事が参考になれば幸いです。
「EC-CUBEについて、どうしたらいいのかよくわからない」
とお困りの方へ。
そんな時は、サイバースペースにご相談ください。
相談無料ですので、お気軽にお問い合わせください。