app/Plugin/OrderBySale4ForCP/Controller/BlockController.php line 53

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