EC-CUBE 4系で会員ランクや条件によってポイント付与数を変更したい場合があります。この記事では、コアファイルを修正せずにAddPointProcessorを上書きして、独自のポイント計算ロジックを実装する方法を解説します。

AddPointProcessorとは

EC-CUBEでは、受注に対するポイント付与数の計算をEccube\Service\PurchaseFlow\Processor\AddPointProcessorが行っています。このクラスはPurchaseFlowの中で呼び出され、商品ごとのポイント付与率から付与ポイントを計算します。

カスタマイズ方針

src/Eccube配下のファイルは直接修正せず、app/Customize配下でサービスを上書きする方法を取ります。これにより、EC-CUBEのアップデート時にカスタマイズが上書きされるリスクを回避できます。

実装手順

1. カスタムAddPointProcessorを作成

app/Customize/Service/PurchaseFlow/Processor/AddPointProcessor.phpを作成します。

<?php

namespace Customize\Service\PurchaseFlow\Processor;

use Eccube\Entity\ItemHolderInterface;
use Eccube\Entity\Order;
use Eccube\Service\PurchaseFlow\ItemHolderPostValidator;
use Eccube\Service\PurchaseFlow\PurchaseContext;

class AddPointProcessor extends ItemHolderPostValidator
{
    protected function validate(ItemHolderInterface $itemHolder, PurchaseContext $context)
    {
        if (!$itemHolder instanceof Order) {
            return;
        }

        $Customer = $itemHolder->getCustomer();
        if (!$Customer) {
            return;
        }

        // 通常のポイント計算
        $addPoint = $this->calculateAddPoint($itemHolder);

        // 会員ランクに応じてポイント倍率を変更(例)
        // $CustomerRank = $Customer->getCustomerRank();
        // if ($CustomerRank && $CustomerRank->getPointRate()) {
        //     $addPoint = (int)($addPoint * $CustomerRank->getPointRate());
        // }

        $itemHolder->setAddPoint($addPoint);
    }

    private function calculateAddPoint(Order $Order): int
    {
        $addPoint = 0;
        foreach ($Order->getOrderItems() as $orderItem) {
            if (!$orderItem->isProduct()) {
                continue;
            }
            $addPoint += (int)($orderItem->getPrice() * $orderItem->getPointRate() / 100) * $orderItem->getQuantity();
        }
        return $addPoint;
    }
}

2. サービス定義を上書き

app/Customize/Resource/config/services.yamlを作成し、サービス定義を上書きします。

services:
    eccube.purchase.flow.item.holder.post.validator.add.point.validator:
        class: Customize\Service\PurchaseFlow\Processor\AddPointProcessor
        autowire: true
        tags:
            - { name: eccube.item.holder.post.validator, flow_type: shopping, priority: 900 }
            - { name: eccube.item.holder.post.validator, flow_type: order, priority: 1000 }

3. キャッシュクリア

bin/console cache:clear --no-warmup
bin/console cache:warmup

仕組みの解説

EC-CUBEのサービス定義はapp/config/eccube配下のYAMLファイルで管理されています。app/Customize/Resource/config/services.yamlで同じサービス名を定義すると、元の定義を上書きできます。

これにより、Eccube\Service\PurchaseFlow\Processor\AddPointProcessorの代わりにCustomize\Service\PurchaseFlow\Processor\AddPointProcessorが実行されるようになります。

活用例

  • 会員ランクに応じたポイント倍率の設定
  • 特定商品のポイント付与率変更
  • キャンペーン期間中のポイントアップ
  • 初回購入時のボーナスポイント

まとめ

EC-CUBEでポイント付与ロジックをカスタマイズするには、services.yamlでAddPointProcessorを上書きするのが最も安全な方法です。コアファイルを修正しないため、アップデート時の影響を最小限に抑えられます。

日本発!ECオープンプラットフォーム「EC-CUBE」 EC-CUBEゴールドパートナー EC-CUBEは株式会社イーシーキューブの商標です

EC-CUBEに関するお問い合わせ


    [重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。

    EC-CUBEバージョンアップ