app/Plugin/JoolenCheckedItemBlock4/Controller/Block/CheckedItemController.php line 87

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\Controller\Block;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Entity\BaseInfo;
  16. use Eccube\Repository\BaseInfoRepository;
  17. use Eccube\Repository\PluginRepository;
  18. use Plugin\JoolenCheckedItemBlock4\Entity\Config;
  19. use Plugin\JoolenCheckedItemBlock4\Event;
  20. use Plugin\JoolenCheckedItemBlock4\Repository\ConfigRepository;
  21. use Plugin\JoolenCheckedItemBlock4\Repository\ProductRepository;
  22. use Plugin\ProductReview4\Entity\ProductReview;
  23. use Plugin\ProductReview4\Entity\ProductReviewConfig;
  24. use Plugin\ProductReview4\Entity\ProductReviewStatus;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  26. use Symfony\Component\HttpFoundation\RedirectResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\RequestStack;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. class CheckedItemController extends AbstractController
  31. {
  32.     /**
  33.      * @var EntityManagerInterface
  34.      */
  35.     protected $entityManager;
  36.     /**
  37.      * @var ProductRepository
  38.      */
  39.     protected $productRepository;
  40.     /**
  41.      * @var PluginRepository
  42.      */
  43.     protected $pluginRepository;
  44.     /**
  45.      * @var BaseInfo
  46.      */
  47.     protected $BaseInfo;
  48.     /**
  49.      * @var Config
  50.      */
  51.     protected $Config;
  52.     /**
  53.      * @var RequestStack
  54.      */
  55.     protected $requestStack;
  56.     public function __construct(
  57.         EntityManagerInterface $entityManager,
  58.         ProductRepository $productRepository,
  59.         PluginRepository $pluginRepository,
  60.         BaseInfoRepository $baseInfoRepository,
  61.         ConfigRepository $configRepository,
  62.         RequestStack $requestStack
  63.     )
  64.     {
  65.         $this->entityManager $entityManager;
  66.         $this->productRepository $productRepository;
  67.         $this->pluginRepository $pluginRepository;
  68.         $this->BaseInfo $baseInfoRepository->get();
  69.         $this->Config $configRepository->getOneOrDefault();
  70.         $this->requestStack $requestStack;
  71.     }
  72.     /**
  73.      * @Route("/block/joolen_checked_item", name="block_joolen_checked_item")
  74.      * @Template("Block/joolen_checked_item.twig")
  75.      */
  76.     public function index(Request $request): array
  77.     {
  78.         // 削除時のリダイレクト用のURLを保存
  79.         $redirectUrl $this->requestStack->getMasterRequest()->getUri();
  80.         $this->session->getFlashBag()->set('joolen.checked_item.redirect.url'$redirectUrl);
  81.         // クッキーから閲覧した商品情報を取得
  82.         $checkedItems json_decode($request->cookies->get(Event::COOKIE_NAME), true);
  83.         $ProductReviewPlugin $this->pluginRepository->findOneBy(['code' => 'ProductReview4''enabled' => 1]);
  84.         // Doctrine SQLFilter
  85.         if ($this->BaseInfo->isOptionNostockHidden()) {
  86.             $this->entityManager->getFilters()->enable('option_nostock_hidden');
  87.         }
  88.         // MEMO: 閲覧した商品がある場合のみクエリを実行
  89.         if (!empty($checkedItems)) {
  90.             $Products $this->productRepository->findByCheckedItem($checkedItems)->getQuery()->getResult();
  91.         }
  92.         $datum = [];
  93.         // MEMO: 結果がある場合、閲覧した順番に並び替える
  94.         if (!empty($Products)) {
  95.             // 最後に閲覧したものを最初に表示するため反転させる
  96.             $checkedItems array_reverse($checkedItems);
  97.             foreach ($checkedItems as $checkedItem) {
  98.                 foreach ($Products as $Product) {
  99.                     if ($Product->getId() !== $checkedItem) {
  100.                         continue;
  101.                     }
  102.                     $rate = [
  103.                         "recommend_avg" => 0,
  104.                         "review_count" => 0
  105.                     ];
  106.                     // MEMO: 商品レビュー管理プラグインが有効な場合、レビュー情報を追加する
  107.                     if ($ProductReviewPlugin) {
  108.                         $ProductReviewConfig $this->entityManager->getRepository(ProductReviewConfig::class)->get();
  109.                         $productReviewRepository $this->entityManager->getRepository(ProductReview::class);
  110.                         $ProductReviews $productReviewRepository->findBy([
  111.                             'Status' => ProductReviewStatus::SHOW,
  112.                             'Product' => $Product
  113.                         ],
  114.                             [
  115.                                 'id' => 'DESC'
  116.                             ],
  117.                             $ProductReviewConfig->getReviewMax());
  118.                         $rate $productReviewRepository->getAvgAll($Product);
  119.                         $avg round($rate['recommend_avg']);
  120.                     }
  121.                     $datum[] = [
  122.                         'Product' => $Product,
  123.                         'ProductReviews' => $ProductReviews ?? null,
  124.                         'Avg' => $avg ?? null,
  125.                         'Count' => intval($rate['review_count']) ?? null
  126.                     ];
  127.                 }
  128.             }
  129.         }
  130.         return [
  131.             'datum' => $datum,
  132.             'ProductReviewPlugin' => $ProductReviewPlugin
  133.         ];
  134.     }
  135.     /**
  136.      * 履歴の削除
  137.      *
  138.      * @Route("/block/joolen_checked_item/remove", name="block_joolen_checked_item_remove")
  139.      * @param Request $request
  140.      * @return RedirectResponse
  141.      */
  142.     public function remove(Request $request): RedirectResponse
  143.     {
  144.         $redirectUrl $this->session->getFlashBag()->get('joolen.checked_item.redirect.url');
  145.         $redirectUrl array_shift($redirectUrl);
  146.         // MEMO: cookieの削除
  147.         // ※Event.phpに移動
  148.         // 何も指定されていない場合はTopページへリダイレクト
  149.         if (!$redirectUrl) {
  150.             return $this->redirectToRoute('homepage');
  151.         }
  152.         return $this->redirect($redirectUrl);
  153.     }
  154. }