会員グループ管理::会員ランク管理アドオンで購入完了時に会員ランクを決定するようカスタマイズする方法

会員グループ管理::会員ランク管理アドオン はログイン時に会員ランクを決定していますが購入完了時に会員ランクを決定するようカスタマイズすることも可能です。

購入完了時に会員ランクを決定する処理

app/Customize/EventSubscriber/ShoppingCompleteSubscriber.php を作成して以下のコードを追記してください。

<?php

namespace Customize\EventSubscriber;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Plugin\CustomerGroupRank\Service\Rank\Context;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ShoppingCompleteSubscriber implements EventSubscriberInterface
{
    /**
     * @var Context
     */
    private $context;

    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    public function __construct(Context $context, EntityManagerInterface $entityManager)
    {
        $this->context = $context;
        $this->entityManager = $entityManager;
    }


    public static function getSubscribedEvents()
    {
        return [
            EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => 'onFrontShoppingCompleteInitialize'
        ];
    }

    public function onFrontShoppingCompleteInitialize(EventArgs $eventArgs)
    {
        /** @var Order $order */
        $order = $eventArgs->getArgument('Order');

        $customer = $order->getCustomer();
        if ($customer instanceof Customer) {
            $this->context->decide($customer);
            $this->entityManager->flush();
        }
    }
}

ログイン時にランク決定するイベントを無効化

会員グループ管理::会員ランク管理アドオンに設定されているログイン時にランク決定するイベントを無効化します。

app/Customize/Resource/config/services.yaml を作成して以下を追記してください。

services:
  Plugin\CustomerGroupRank\Security\EventListener\LoginListener: # ログイン時にランクを決定するイベントを無効化

以上で完成です。

お気軽にコメントをどうぞ