app/Plugin/JoolenCheckedItemBlock4/Event.php line 48

Open in your IDE?
  1. <?php
  2. /*
  3.  * Plugin Name: JoolenCheckedItemBlock4
  4.  *
  5.  * Copyright(c) joolen inc. All Rights Reserved.
  6.  *
  7.  * https://www.joolen.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Plugin\JoolenCheckedItemBlock4;
  13. use Eccube\Entity\Product;
  14. use Plugin\JoolenCheckedItemBlock4\Entity\Config;
  15. use Plugin\JoolenCheckedItemBlock4\Repository\ConfigRepository;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpFoundation\Cookie;
  18. use Symfony\Component\HttpKernel\Event\KernelEvent;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. class Event implements EventSubscriberInterface
  21. {
  22.     public const COOKIE_NAME 'joolen_checked_item_cookie';
  23.     /**
  24.      * @var Config
  25.      */
  26.     protected $Config;
  27.     public function __construct(ConfigRepository $configRepository)
  28.     {
  29.         $this->Config $configRepository->getOneOrDefault();
  30.     }
  31.     /**
  32.      * @return array
  33.      */
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         return [
  37.             KernelEvents::RESPONSE => 'onKernelResponse'
  38.         ];
  39.     }
  40.     public function onKernelResponse(KernelEvent $event)
  41.     {
  42.         $request $event->getRequest();
  43.         $pathInfo $request->getPathInfo();
  44.         // 閲覧履歴の保存
  45.         if (preg_match('/.*\/products\/detail\/.*/'$pathInfo) === 1) {
  46.             /** @var Product $Product */
  47.             $Product $event->getRequest()->get('Product');
  48.             $product_id $Product->getId();
  49.             // クッキーから閲覧した商品情報を取得
  50.             $checkedItems json_decode($request->cookies->get(self::COOKIE_NAME), true) ?? [];
  51.             $key array_search($product_id$checkedItems);
  52.             // MEMO: すでに閲覧している場合、削除する
  53.             if ($key !== false) {
  54.                 unset($checkedItems[$key]);
  55.                 $checkedItems array_values($checkedItems);    // 削除するとIndexずれるので前詰め
  56.             }
  57.             $checkedItems[] = $product_id;
  58.             // MEMO:
  59.             //  【重要】設定の表示件数=保存件数なので設定値が変わっている可能性があるため、現在の保存件数が表示件数を
  60.             //  上回ってる場合、古い方から削除する
  61.             if (!empty($checkedItems) && count($checkedItems) > $this->Config->getDisplayNumber()) {
  62.                 // 削除する件数
  63.                 $deleteNumber count($checkedItems) - $this->Config->getDisplayNumber();
  64.                 // 古い方から削除
  65.                 for($i 0$i $deleteNumber; ++$i) {
  66.                     unset($checkedItems[$i]);
  67.                 }
  68.                 $checkedItems array_values($checkedItems);    // 削除するとIndexずれるので前詰め
  69.             }
  70.             $response $event->getResponse();
  71.             $response->headers->setCookie(
  72.                 new Cookie(
  73.                     self::COOKIE_NAME,
  74.                     json_encode($checkedItems),
  75.                     2147483647,
  76.                     '/',
  77.                     null,
  78.                     $this->Config->isCookieSecure())
  79.             );
  80.             $event->setResponse($response);
  81.             return;
  82.         }
  83.         // 閲覧履歴の削除
  84.         if (preg_match('/.*\/joolen_checked_item\/remove.*/'$pathInfo) === 1) {
  85.             $response $event->getResponse();
  86.             $response->headers->clearCookie(Event::COOKIE_NAME'/'null);
  87.             $event->setResponse($response);
  88.         }
  89.     }
  90. }