<?php
namespace Plugin\BootechTimeSale42\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Repository\ProductClassRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* サイトにアクセスしたとき、セール開始・終了対象の商品を検索し、商品情報の更新処理を行う。
*
* Class ScheduleSaleSubscriber
* @package Plugin\BootechTimeSale42\EventSubscriber
*/
class ScheduleSaleSubscriber implements EventSubscriberInterface
{
/**
* @var ProductClassRepository
*/
private $productClassRepository;
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(
ProductClassRepository $productClassRepository,
EntityManagerInterface $entityManager
) {
$this->productClassRepository = $productClassRepository;
$this->entityManager = $entityManager;
}
public function onKernelRequest(RequestEvent $event)
{
$now = new \DateTime();
// 更新が必要なデータを取得する
// セール期間 AND セールフラグ=false
// セール終了後 AND セールフラグ=true
$qb = $this->productClassRepository->createQueryBuilder("pc");
$qb
->where("pc.sale_price IS NOT NULL AND pc.sale_end_price IS NOT NULL")
->andWhere("(pc.sale_start_date <= :now AND :now < pc.sale_end_date AND pc.sale_flg = false) OR (pc.sale_end_date <= :now AND pc.sale_flg = true)")
->setParameters([
"now" => $now
])
;
$ProductClasses = $qb->getQuery()->getResult();
if ($ProductClasses) {
foreach ($ProductClasses as $ProductClass) {
$saleFlg = $ProductClass->getSaleFlg();
// セール開始対象商品の処理
if ($saleFlg === false) {
$ProductClass->setPrice02($ProductClass->getSalePrice());
$ProductClass->setSaleFlg(true);
}
// セール終了対象商品の処理
if ($saleFlg === true) {
$ProductClass->setPrice02($ProductClass->getSaleEndPrice());
$ProductClass->setSaleFlg(false);
}
$this->entityManager->persist($ProductClass);
}
$this->entityManager->flush();
}
}
public static function getSubscribedEvents()
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}