app/Plugin/BootechTimeSale42/EventSubscriber/ScheduleSaleSubscriber.php line 37

Open in your IDE?
  1. <?php
  2. namespace Plugin\BootechTimeSale42\EventSubscriber;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Eccube\Repository\ProductClassRepository;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. /**
  9.  * サイトにアクセスしたとき、セール開始・終了対象の商品を検索し、商品情報の更新処理を行う。
  10.  *
  11.  * Class ScheduleSaleSubscriber
  12.  * @package Plugin\BootechTimeSale42\EventSubscriber
  13.  */
  14. class ScheduleSaleSubscriber implements EventSubscriberInterface
  15. {
  16.     /**
  17.      * @var ProductClassRepository
  18.      */
  19.     private $productClassRepository;
  20.     /**
  21.      * @var EntityManagerInterface
  22.      */
  23.     private $entityManager;
  24.     public function __construct(
  25.         ProductClassRepository $productClassRepository,
  26.         EntityManagerInterface $entityManager
  27.     ) {
  28.         $this->productClassRepository $productClassRepository;
  29.         $this->entityManager $entityManager;
  30.     }
  31.     public function onKernelRequest(RequestEvent $event)
  32.     {
  33.         $now = new \DateTime();
  34.         // 更新が必要なデータを取得する
  35.         // セール期間 AND セールフラグ=false
  36.         // セール終了後 AND セールフラグ=true
  37.         $qb $this->productClassRepository->createQueryBuilder("pc");
  38.         $qb
  39.             ->where("pc.sale_price IS NOT NULL AND pc.sale_end_price IS NOT NULL")
  40.             ->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)")
  41.             ->setParameters([
  42.                 "now" => $now
  43.             ])
  44.         ;
  45.         $ProductClasses $qb->getQuery()->getResult();
  46.         if ($ProductClasses) {
  47.             foreach ($ProductClasses as $ProductClass) {
  48.                 $saleFlg $ProductClass->getSaleFlg();
  49.                 // セール開始対象商品の処理
  50.                 if ($saleFlg === false) {
  51.                     $ProductClass->setPrice02($ProductClass->getSalePrice());
  52.                     $ProductClass->setSaleFlg(true);
  53.                 }
  54.                 // セール終了対象商品の処理
  55.                 if ($saleFlg === true) {
  56.                     $ProductClass->setPrice02($ProductClass->getSaleEndPrice());
  57.                     $ProductClass->setSaleFlg(false);
  58.                 }
  59.                 $this->entityManager->persist($ProductClass);
  60.             }
  61.             $this->entityManager->flush();
  62.         }
  63.     }
  64.     public static function getSubscribedEvents()
  65.     {
  66.         return [
  67.             'kernel.request' => 'onKernelRequest',
  68.         ];
  69.     }
  70. }