app/Plugin/OrderBySale4/Controller/BlockController.php line 63

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of OrderBySale4
  4.  *
  5.  * Copyright(c) U-Mebius Inc. All Rights Reserved.
  6.  *
  7.  * https://umebius.com/
  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\OrderBySale4\Controller;
  13. use Doctrine\ORM\Tools\Pagination\Paginator;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Entity\Master\OrderStatus;
  16. use Eccube\Entity\Master\ProductStatus;
  17. use Eccube\Repository\BaseInfoRepository;
  18. use Eccube\Repository\ProductRepository;
  19. use Plugin\OrderBySale4\Entity\Config;
  20. use Plugin\OrderBySale4\Repository\ConfigRepository;
  21. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. class BlockController extends AbstractController
  25. {
  26.     /**
  27.      * @var ProductRepository
  28.      */
  29.     protected $productRepository;
  30.     /**
  31.      * @var ConfigRepository
  32.      */
  33.     private $configRepository;
  34.     /**
  35.      * @var BaseInfoRepository
  36.      */
  37.     private $baseInfoRepository;
  38.     /**
  39.      * ProductController constructor.
  40.      */
  41.     public function __construct(
  42.         ProductRepository $productRepository,
  43.         ConfigRepository $configRepository,
  44.         BaseInfoRepository $baseInfoRepository
  45.     ) {
  46.         $this->productRepository $productRepository;
  47.         $this->configRepository $configRepository;
  48.         $this->baseInfoRepository $baseInfoRepository;
  49.     }
  50.     /**
  51.      * @Route("/block/order_by_sale", name="block_order_by_sale")
  52.      *
  53.      * @Template("Block/order_by_sale.twig")
  54.      */
  55.     public function index(Request $request)
  56.     {
  57.         $originOptionNostockHidden $this->entityManager->getFilters()->isEnabled('option_nostock_hidden');
  58.         // Doctrine SQLFilter
  59.         if ($this->baseInfoRepository->get()->isOptionNostockHidden()) {
  60.             $this->entityManager->getFilters()->enable('option_nostock_hidden');
  61.         }
  62.         $qb $this->productRepository
  63.             ->createQueryBuilder('p');
  64.         $qb
  65.             ->where('p.Status = :Disp')
  66.             ->setParameter('Disp'ProductStatus::DISPLAY_SHOW);
  67.         /* @var $Config Config */
  68.         $Config $this->configRepository->findOneBy([]);
  69.         // @see https://github.com/EC-CUBE/ec-cube/issues/1998
  70.         if ($this->entityManager->getFilters()->isEnabled('option_nostock_hidden') == true) {
  71.             $qb->innerJoin('p.ProductClasses''pc');
  72.             $qb->andWhere('pc.visible = true');
  73.         }
  74.         $excludes = [OrderStatus::CANCELOrderStatus::PENDINGOrderStatus::PROCESSINGOrderStatus::RETURNED];
  75.         if ($Config) {
  76.             if ($Config->getType() == Config::ORDER_BY_AMOUNT) {
  77.                 $select '(SELECT CASE WHEN SUM(oi.price * oi.quantity) IS NULL THEN -1 ELSE SUM(oi.price * oi.quantity) END';
  78.             } elseif ($Config->getType() == Config::ORDER_BY_QUANTITY) {
  79.                 $select '(SELECT CASE WHEN SUM(oi.quantity) IS NULL THEN -1 ELSE SUM(oi.quantity) END';
  80.             }
  81.             $select .= ' FROM \Eccube\Entity\OrderItem AS oi
  82.                     LEFT JOIN oi.Order AS o
  83.                     WHERE
  84.                      oi.Product=p.id
  85.                      AND o.OrderStatus not in (:excludes)';
  86.             if ($Config->getTargetDays()) {
  87.                 $targetDate = new \DateTime();
  88.                 $targetDate->setTime(0000);
  89.                 $targetDate->sub(new \DateInterval('P'.$Config->getTargetDays().'D'));
  90.                 $qb->setParameter('target_date'$targetDate);
  91.                 $select .= ' AND o.order_date >= :target_date';
  92.             }
  93.             $select .= ') AS HIDDEN buy_quantity';
  94.             $qb->addSelect($select)
  95.                 ->orderBy('buy_quantity''DESC')
  96.                 ->groupBy('p.id')
  97.                 ->setParameter('excludes'$excludes);
  98.         }
  99.         $qb->setMaxResults($Config->getBlockDisplayNumber());
  100.         $paginator = new Paginator($qb->getQuery(), $fetchJoinCollection true);
  101.         $Products = [];
  102.         foreach ($paginator as $Product) {
  103.             $Products[] = $Product;
  104.         }
  105.         if ($originOptionNostockHidden) {
  106.             if (!$this->entityManager->getFilters()->isEnabled('option_nostock_hidden')) {
  107.                 $this->entityManager->getFilters()->enable('option_nostock_hidden');
  108.             }
  109.         } else {
  110.             if ($this->entityManager->getFilters()->isEnabled('option_nostock_hidden')) {
  111.                 $this->entityManager->getFilters()->disable('option_nostock_hidden');
  112.             }
  113.         }
  114.         return [
  115.             'Products' => $Products,
  116.         ];
  117.     }
  118. }