app/Plugin/SearchPlus/SearchPlusEvent.php line 59

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : SearchPlus
  4. *
  5. * Copyright (C) BraTech Co., Ltd. All Rights Reserved.
  6. * http://www.bratech.co.jp/
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Plugin\SearchPlus;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Eccube\Common\Constant;
  14. use Eccube\Event\EccubeEvents;
  15. use Eccube\Event\TemplateEvent;
  16. use Eccube\Event\EventArgs;
  17. use Plugin\SearchPlus\Service\SearchPlusService;
  18. use Symfony\Component\DependencyInjection\ContainerInterface;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. class SearchPlusEvent implements EventSubscriberInterface
  22. {
  23.     private $container;
  24.     private $entityManager;
  25.     private $searchPlusService;
  26.     private $requestStack;
  27.     public function __construct(
  28.             ContainerInterface $container,
  29.             EntityManagerInterface $entityManager,
  30.             SearchPlusService $searchPlusService,
  31.             RequestStack $requestStack
  32.             )
  33.     {
  34.         $this->container $container;
  35.         $this->entityManager $entityManager;
  36.         $this->searchPlusService $searchPlusService;
  37.         $this->requestStack $requestStack;
  38.     }
  39.     /**
  40.      * @return array
  41.      */
  42.     public static function getSubscribedEvents()
  43.     {
  44.         return [
  45.             '@admin/Product/index.twig' => 'onTemplateAdminProduct',
  46.             '@admin/Order/edit.twig' => 'onTemplateAdminOrderEdit',
  47.             '@ProductPlus/admin/Product/edit.twig' => 'onTemplateAdminProductItemEdit',
  48.             EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH => 'hookAdminOrderEditSearchProductSearch',
  49.             'Product/list.twig' => 'onTemplateProductList',
  50.         ];
  51.     }
  52.     public function onTemplateAdminProduct(TemplateEvent $event)
  53.     {
  54.         if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
  55.             $productItemRepository $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
  56.             $ProductItems $productItemRepository->findAll();
  57.             $parameters $event->getParameters();
  58.             $parameters['ProductItems'] = $ProductItems;
  59.             $event->setParameters($parameters);
  60.         }
  61.         $twig '@SearchPlus/admin/ext_search.twig';
  62.         $event->addSnippet($twig);
  63.         $js '@SearchPlus/admin/ext_search.js';
  64.         $event->addAsset($js);
  65.         if(version_compare(Constant::VERSION,'4.1.0','<')){
  66.             $source $event->getSource();
  67.             if(preg_match("/done\(function\(\)\s{/",$source$result)){
  68.                 $search $result[0];
  69.                 $snippet file_get_contents($this->container->getParameter('plugin_realdir'). '/SearchPlus/Resource/template/admin/ext_inc_legacy.twig');
  70.                 $replace $search $snippet;
  71.                 $source str_replace($search$replace$source);
  72.             }
  73.             $event->setSource($source);
  74.         }else{
  75.             $js '@SearchPlus/admin/ext_inc.js';
  76.             $event->addAsset($js);
  77.         }
  78.     }
  79.     public function onTemplateAdminOrderEdit(TemplateEvent $event)
  80.     {
  81.         if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
  82.             $productItemRepository $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
  83.             $ProductItems $productItemRepository->findAll([],['sort_no' => 'DESC']);
  84.             $parameters $event->getParameters();
  85.             $parameters['ProductItems'] = $ProductItems;
  86.             $event->setParameters($parameters);
  87.         }
  88.         $twig '@SearchPlus/admin/Order/ext_search.twig';
  89.         $event->addSnippet($twig);
  90.         $js '@SearchPlus/admin/Order/ext_search.js';
  91.         $event->addAsset($js);
  92.         $source $event->getSource();
  93.         if(preg_match("/admin\_search\_product\_category\_id\'\)\.val\(\)/",$source$result)){
  94.             $search $result[0];
  95.             $replace $search ",{{ include('@SearchPlus/admin/Order/ext_js.twig') }}";
  96.             $source str_replace($search$replace$source);
  97.         }
  98.         $event->setSource($source);
  99.     }
  100.     public function hookAdminOrderEditSearchProductSearch(EventArgs $event)
  101.     {
  102.         $qb $event->getArgument('qb');
  103.         $request $this->requestStack->getMasterRequest();
  104.         $searchData['tag_ids'] = $request->get('tag_ids');
  105.         if (!empty($searchData['tag_ids']) && $searchData['tag_ids']) {
  106.             $ids $searchData['tag_ids'];
  107.             if(!is_array($ids))$ids = [$ids];
  108.             $qb->innerJoin('p.ProductTag''pt');
  109.             $qb->andWhere($qb->expr()->in('pt.Tag'$ids));
  110.         }
  111.         $searchData['pmin'] = $request->get('pmin');
  112.         $searchData['pmax'] = $request->get('pmax');
  113.         $searchData['instock'] = $request->get('instock');
  114.         if(strlen($searchData['pmin']) > || strlen($searchData['pmax'] > || strlen($searchData['instock'] > 0))){
  115.             $dql $qb->getDQL();
  116.             if(!preg_match('/INNER\sJOIN\sp\.ProductClasses/',$dql)){
  117.                 $qb->innerJoin('p.ProductClasses''pc')
  118.                    ->andWhere('pc.visible = true');
  119.             }
  120.             if(isset($searchData['pmin']) && is_numeric($searchData['pmin'])){
  121.                 $qb
  122.                     ->andWhere('pc.price02 >= :price_min')
  123.                     ->setParameter('price_min'$searchData['pmin']);
  124.             }
  125.             if(isset($searchData['pmax']) && is_numeric($searchData['pmax'])){
  126.                 $qb
  127.                     ->andWhere('pc.price02 <= :price_max')
  128.                     ->setParameter('price_max'$searchData['pmax']);
  129.             }
  130.             if(isset($searchData['instock']) && !empty($searchData['instock'])){
  131.                 $qb
  132.                     ->andWhere('pc.stock_unlimited = true OR pc.stock > 0');
  133.             }
  134.         }
  135.         if(method_exists('Eccube\Entity\Product','getMaker')){
  136.             $searchData['maker_id'] = $request->get('maker_id');
  137.             if (!empty($searchData['maker_id']) && $searchData['maker_id']) {
  138.                 $ids $searchData['maker_id'];
  139.                 if(!is_array($ids))$ids = [$ids];
  140.                 $qb->andWhere($qb->expr()->in('p.Maker'$ids));
  141.             }
  142.         }
  143.         if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
  144.             $productItemRepository $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
  145.             $ProductItems $productItemRepository->findAll();
  146.             foreach($ProductItems as $ProductItem){
  147.                 if($ProductItem->getInputType() == \Plugin\ProductPlus\Entity\ProductItem::DATE_TYPE){
  148.                     $start $request->get('productplus_'.$ProductItem->getId().'_date_start');
  149.                     $end $request->get('productplus_'.$ProductItem->getId().'_date_end');
  150.                     if(strlen($start) > 0)$searchData['productplus_'.$ProductItem->getId().'_date_start'] = new \DateTime($start);
  151.                     if(strlen($end) > 0)$searchData['productplus_'.$ProductItem->getId().'_date_end'] = new \DateTime($end);
  152.                 }else{
  153.                     $searchData['productplus_'.$ProductItem->getId()] = $request->get('productplus_'.$ProductItem->getId());
  154.                 }
  155.             }
  156.             $qb $this->searchPlusService->createQueryBuilder($qb$searchData);
  157.         }
  158.         $event->setArgument('qb',$qb);
  159.     }
  160.     public function onTemplateProductList(TemplateEvent $event)
  161.     {
  162.         $source $event->getSource();
  163.         if(preg_match("/\{\%\sfor\sitem\sin\ssearch\_form\s\%\}/",$source$result)){
  164.             $search $result[0];
  165.             $replace $search '
  166.                 {% if item.vars.value is iterable %}
  167.                     {% for value in item.vars.value %}
  168.                     <input type="hidden"
  169.                            name="{{ item.vars.full_name }}[]"
  170.                            value="{{ value }}"/>
  171.                     {% endfor %}
  172.                 {% else %}';
  173.             $source str_replace($search$replace$source);
  174.         }
  175.         if(preg_match('/value\=\"\{\{\sitem\.vars\.value\s\}\}\"\s\{\%\sendif\s\%\}\/\>/',$source$result)){
  176.             $search $result[0];
  177.             $replace $search "{% endif %}";
  178.             $source str_replace($search$replace$source);
  179.         }
  180.         $event->setSource($source);
  181.         $twig '@SearchPlus/default/Product/list_result.twig';
  182.         $event->addSnippet($twig);
  183.         $js '@SearchPlus/default/Product/list_result.js';
  184.         $event->addAsset($js);
  185.         $parameters $event->getParameters();
  186.         if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
  187.             $productItemRepository $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
  188.             if(method_exists('Plugin\ProductPlus\Entity\ProductItem''setSearchFlg')){
  189.                 $ProductItems $productItemRepository->findBy(['search_flg' => true],['sort_no' => 'DESC']);
  190.             }else{
  191.                 $ProductItems $productItemRepository->findBy([],['sort_no' => 'DESC']);
  192.             }
  193.             $parameters['ProductItems'] = $ProductItems;
  194.         }
  195.         $event->setParameters($parameters);
  196.     }
  197.     public function onTemplateAdminProductItemEdit(TemplateEvent $event)
  198.     {
  199.         if(method_exists('Plugin\ProductPlus\Entity\ProductItem''setSearchFlg')){
  200.             $twig '@SearchPlus/admin/Product/ext_edit.twig';
  201.             $event->addSnippet($twig);
  202.             $js '@SearchPlus/admin/Product/ext_edit.js';
  203.             $event->addAsset($js);
  204.         }
  205.     }
  206. }