EC-CUBE4で会員登録時に会員登録ポイントを付与させる方法

EC-CUBE4ではポイント機能は標準で対応されるようになりましたが、商品購入時にしかポイントが付与されません。

EC-CUBE2系をお使いの方であれば、会員登録ポイントは付与できますので同じような機能をEC-CUBE4でも実現させてみます。

変更させる箇所は以下の通りです。

今回はDBで会員登録ポイントを管理するのではなく、設定ファイルで管理させてます。

  • app/config/eccube/packages/eccube.yaml
  eccube_point_entry_point: 200 # ポイント機能;会員登録で獲得するポイント数

記述する箇所は最下行で構いません。この例だと200ポイントを付与させるようにしています。

  • src/Eccube/Controller/EntryController.php
use Eccube\Service\PointHelper;

・
・
・
         
/**
 * @var PointHelper
 */
protected $pointHelper;

・
・
・

/**
 * EntryController constructor.
 *
 * @param CartService $cartService
 * @param CustomerStatusRepository $customerStatusRepository
 * @param MailService $mailService
 * @param BaseInfoRepository $baseInfoRepository
 * @param CustomerRepository $customerRepository
 * @param EncoderFactoryInterface $encoderFactory
 * @param ValidatorInterface $validatorInterface
 * @param TokenStorageInterface $tokenStorage
 * @param PointHelper $pointHelper
 */
public function __construct(
    CartService $cartService,
    CustomerStatusRepository $customerStatusRepository,
    MailService $mailService,
    BaseInfoRepository $baseInfoRepository,
    CustomerRepository $customerRepository,
    EncoderFactoryInterface $encoderFactory,
    ValidatorInterface $validatorInterface,
    TokenStorageInterface $tokenStorage,
    PointHelper $pointHelper
)
{
    $this->customerStatusRepository = $customerStatusRepository;
    $this->mailService = $mailService;
    $this->BaseInfo = $baseInfoRepository->get();
    $this->customerRepository = $customerRepository;
    $this->encoderFactory = $encoderFactory;
    $this->recursiveValidator = $validatorInterface;
    $this->tokenStorage = $tokenStorage;
    $this->cartService = $cartService;
    $this->pointHelper = $pointHelper;
}

・
・
・

// 会員登録ポイントの付与
case 'complete':
    log_info('会員登録開始');

    $encoder = $this->encoderFactory->getEncoder($Customer);
    $salt = $encoder->createSalt();
    $password = $encoder->encodePassword($Customer->getPassword(), $salt);
    $secretKey = $this->customerRepository->getUniqueSecretKey();

    $Customer
        ->setSalt($salt)
        ->setPassword($password)
        ->setSecretKey($secretKey)
        ->setPoint(0);

    $this->entityManager->persist($Customer);
    $this->entityManager->flush();

    // 会員登録ポイントの付与
    // 所有ポイントが更新されるので再度flushする必要あり
    $this->pointHelper->addEntryPoint($Customer);
    $this->entityManager->persist($Customer);
    $this->entityManager->flush();

PointHelperを利用して会員登録ポイントを付与させる処理を追加します。

  • src/Eccube/Service/PointHelper.php
・
・
・

/**
 * @var EccubeConfig
 */
private $eccubeConfig;

・
・
・

/**
 * PointHelper constructor.
 *
 * @param BaseInfoRepository $baseInfoRepository
 * @param EntityManagerInterface $entityManager
 */
public function __construct(BaseInfoRepository $baseInfoRepository, EntityManagerInterface $entityManager, EccubeConfig $eccubeConfig)
{
    $this->baseInfoRepository = $baseInfoRepository;
    $this->entityManager = $entityManager;
    $this->eccubeConfig = $eccubeConfig;
}

・
・
・


// 会員登録時ポイントを付与する
public function addEntryPoint(Customer $Customer)
{
    $point = $this->eccubeConfig['eccube_point_entry_point'];

    $pointHistory = new PointHistory();
    $pointHistory->setRecordType(PointHistory::TYPE_ADD);
    $pointHistory->setRecordEvent(PointHistory::EVENT_ENTRY);
    $pointHistory->setPoint($point);
    $pointHistory->setCustomer($Customer);
    $em = $this->entityManager;
    $em->persist($pointHistory);
    $em->flush($pointHistory);

    // ポイントの付与
    $Customer->setPoint($Customer->getPoint() + $point);
}

PointHelper.phpに会員登録時にポイントを付与する関数を追加します。

今回はかなり省略して変更点を記述していますので、もう少し詳しく書いて欲しければコメントしてください。