要望や症状
EC-CUBEのデフォルト設定では、購入金額に対してポイント付与率(パーセンテージ)によってポイントが付与されます。しかし、この方式では「送料を除く購入金額(税抜)1,000円ごとに1ポイントを付与したい」といった固定ポイント付与方式を実現することができません。
デフォルトのポイント付与率設定画面では、あくまでも購入金額に対する割合でしかポイント計算ができず、また専用プラグインも見つからない状況です。このため、1,000円購入で1ポイント、2,000円購入で2ポイントといった金額区切りでの固定ポイント付与を行うには、カスタマイズが必要となります。
理由や原因
EC-CUBEのデフォルトポイント機能は、購入金額に対してパーセンテージベースでポイントを計算する仕組みになっているためです。金額区切りでの固定ポイント付与は標準機能に含まれていないため、PurchaseFlowのカスタマイズが必要となります。
ポイント付与処理は購入確定時のPurchaseFlowで実行されており、この部分をカスタマイズすることで任意の計算ロジックに変更することができます。
解決策
PurchaseFlowのポイント付与処理をカスタマイズして、1,000円ごとの固定ポイント付与方式に変更します。
カスタムポイント付与プロセッサーの作成
まず、独自のポイント付与ロジックを実装するプロセッサーを作成します。
// app/Customize/Service/PurchaseFlow/Processor/CustomPointProcessor.php
<?php
namespace Customize\Service\PurchaseFlow\Processor;
use Eccube\Annotation\CartFlow;
use Eccube\Annotation\ShoppingFlow;
use Eccube\Entity\ItemHolderInterface;
use Eccube\Entity\Order;
use Eccube\Service\PurchaseFlow\InvalidItemException;
use Eccube\Service\PurchaseFlow\ItemHolderPostValidator;
use Eccube\Service\PurchaseFlow\PurchaseContext;
/**
* @CartFlow
* @ShoppingFlow
*/
class CustomPointProcessor extends ItemHolderPostValidator
{
public function validate(ItemHolderInterface $itemHolder, PurchaseContext $context)
{
if (!$itemHolder instanceof Order) {
return;
}
// 送料を除く税抜き金額を計算
$subtotalWithoutTax = $itemHolder->getSubtotal() - $itemHolder->getTax();
// 1,000円ごとに1ポイント計算
$points = intval($subtotalWithoutTax / 1000);
// ポイント設定
$itemHolder->setAddPoint($points);
}
}
既存ポイントプロセッサーの無効化
デフォルトのポイント付与処理を無効化するため、サービス定義をオーバーライドします。
# app/Customize/Resource/config/services.yaml
services:
# デフォルトポイントプロセッサーを無効化
Eccube\Service\PurchaseFlow\Processor\PointProcessor:
class: Customize\Service\PurchaseFlow\Processor\CustomPointProcessor
tags:
- { name: eccube.purchase_flow.cart }
- { name: eccube.purchase_flow.shopping }
キャッシュクリア
設定を反映するために、キャッシュをクリアします。
bin/console cache:clear
動作確認
カスタマイズが正しく動作することを確認します。商品を1,000円分カートに追加して購入手続きを進め、確認画面で付与ポイントが「1ポイント」と表示されることを確認してください。同様に、2,500円の場合は「2ポイント」となることも確認できます。
より柔軟な設定について
さらに柔軟な設定を行いたい場合は、管理画面でポイント付与の基準金額や付与ポイント数を設定できるよう、設定エンティティとフォームを追加することも可能です。この場合は、管理画面でのカスタマイズも併せて行う必要があります。