【EC-CUBE4】在庫が切れた商品をメールで通知する方法

EC-CUBE4で在庫が切れた商品をメールで通知する方法です。

サンプルソースは以下のとおりです。

<?php

namespace Customize\EventSubscriber;

use Eccube\Entity\BaseInfo;
use Eccube\Entity\Order;
use Eccube\Event\EventArgs;
use Eccube\Repository\BaseInfoRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * 注文確定後、在庫切れ商品があったらメール通知
 *
 * Class OutOfStockNoticeSubscriber
 * @package Customize\EventSubscriber
 */
class OutOfStockNoticeSubscriber implements EventSubscriberInterface
{
    /**
     * @var \Swift_Mailer
     */
    private $mailer;

    /**
     * @var BaseInfoRepository
     */
    private $baseInfoRepository;

    public function __construct(
        \Swift_Mailer $mailer,
        BaseInfoRepository $baseInfoRepository
    ) {
        $this->mailer = $mailer;
        $this->baseInfoRepository = $baseInfoRepository;
    }

    public function onFrontShoppingCompleteInitialize(EventArgs $event)
    {
        $Order = $event->getArgument("Order");

        if($Order instanceof Order) {
            $productClasses = [];
            foreach($Order->getOrderItems() as $item) {
                // 注文情報から商品明細を探す
                if($item->isProduct()) {
                    // 在庫が切れた商品の商品名を格納
                    if($item->getProductClass()->getStockFind() === false) {
                        $productClasses[] = $item->getProductClass()->formattedProductName();
                    }
                }
            }

            // 在庫なし商品があった場合メール送信
            if($productClasses) {
                $baseInfo = $this->baseInfoRepository->get();
                $subject = '['.$baseInfo->getShopName().']在庫切れ通知';
                $body = "以下の商品の在庫が切れました。".PHP_EOL.PHP_EOL;
                foreach($productClasses as $productClassName) {
                    $body .= $productClassName.PHP_EOL;
                }

                $this->sendMail($baseInfo, $subject, $body);
            }
        }
    }

    public function sendMail(BaseInfo $baseInfo, $subject, $body)
    {
        $message = (new \Swift_Message())
            ->setSubject($subject)
            ->setFrom([$baseInfo->getEmail01() => $baseInfo->getShopName()])
            ->setTo([$baseInfo->getEmail01()])
            ->setReplyTo($baseInfo->getEmail03())
            ->setReturnPath($baseInfo->getEmail04());

        $message->setBody($body);
        $this->mailer->send($message);
    }

    public static function getSubscribedEvents()
    {
        return [
           'front.shopping.complete.initialize' => 'onFrontShoppingCompleteInitialize',
        ];
    }
}

 

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください