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