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', ]; } }