<?php
/*
* Plugin Name : SearchPlus
*
* Copyright (C) BraTech Co., Ltd. All Rights Reserved.
* http://www.bratech.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\SearchPlus;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\Constant;
use Eccube\Event\EccubeEvents;
use Eccube\Event\TemplateEvent;
use Eccube\Event\EventArgs;
use Plugin\SearchPlus\Service\SearchPlusService;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class SearchPlusEvent implements EventSubscriberInterface
{
private $container;
private $entityManager;
private $searchPlusService;
private $requestStack;
public function __construct(
ContainerInterface $container,
EntityManagerInterface $entityManager,
SearchPlusService $searchPlusService,
RequestStack $requestStack
)
{
$this->container = $container;
$this->entityManager = $entityManager;
$this->searchPlusService = $searchPlusService;
$this->requestStack = $requestStack;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/Product/index.twig' => 'onTemplateAdminProduct',
'@admin/Order/edit.twig' => 'onTemplateAdminOrderEdit',
'@ProductPlus/admin/Product/edit.twig' => 'onTemplateAdminProductItemEdit',
EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH => 'hookAdminOrderEditSearchProductSearch',
'Product/list.twig' => 'onTemplateProductList',
];
}
public function onTemplateAdminProduct(TemplateEvent $event)
{
if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
$productItemRepository = $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
$ProductItems = $productItemRepository->findAll();
$parameters = $event->getParameters();
$parameters['ProductItems'] = $ProductItems;
$event->setParameters($parameters);
}
$twig = '@SearchPlus/admin/ext_search.twig';
$event->addSnippet($twig);
$js = '@SearchPlus/admin/ext_search.js';
$event->addAsset($js);
if(version_compare(Constant::VERSION,'4.1.0','<')){
$source = $event->getSource();
if(preg_match("/done\(function\(\)\s{/",$source, $result)){
$search = $result[0];
$snippet = file_get_contents($this->container->getParameter('plugin_realdir'). '/SearchPlus/Resource/template/admin/ext_inc_legacy.twig');
$replace = $search . $snippet;
$source = str_replace($search, $replace, $source);
}
$event->setSource($source);
}else{
$js = '@SearchPlus/admin/ext_inc.js';
$event->addAsset($js);
}
}
public function onTemplateAdminOrderEdit(TemplateEvent $event)
{
if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
$productItemRepository = $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
$ProductItems = $productItemRepository->findAll([],['sort_no' => 'DESC']);
$parameters = $event->getParameters();
$parameters['ProductItems'] = $ProductItems;
$event->setParameters($parameters);
}
$twig = '@SearchPlus/admin/Order/ext_search.twig';
$event->addSnippet($twig);
$js = '@SearchPlus/admin/Order/ext_search.js';
$event->addAsset($js);
$source = $event->getSource();
if(preg_match("/admin\_search\_product\_category\_id\'\)\.val\(\)/",$source, $result)){
$search = $result[0];
$replace = $search . ",{{ include('@SearchPlus/admin/Order/ext_js.twig') }}";
$source = str_replace($search, $replace, $source);
}
$event->setSource($source);
}
public function hookAdminOrderEditSearchProductSearch(EventArgs $event)
{
$qb = $event->getArgument('qb');
$request = $this->requestStack->getMasterRequest();
$searchData['tag_ids'] = $request->get('tag_ids');
if (!empty($searchData['tag_ids']) && $searchData['tag_ids']) {
$ids = $searchData['tag_ids'];
if(!is_array($ids))$ids = [$ids];
$qb->innerJoin('p.ProductTag', 'pt');
$qb->andWhere($qb->expr()->in('pt.Tag', $ids));
}
$searchData['pmin'] = $request->get('pmin');
$searchData['pmax'] = $request->get('pmax');
$searchData['instock'] = $request->get('instock');
if(strlen($searchData['pmin']) > 0 || strlen($searchData['pmax'] > 0 || strlen($searchData['instock'] > 0))){
$dql = $qb->getDQL();
if(!preg_match('/INNER\sJOIN\sp\.ProductClasses/',$dql)){
$qb->innerJoin('p.ProductClasses', 'pc')
->andWhere('pc.visible = true');
}
if(isset($searchData['pmin']) && is_numeric($searchData['pmin'])){
$qb
->andWhere('pc.price02 >= :price_min')
->setParameter('price_min', $searchData['pmin']);
}
if(isset($searchData['pmax']) && is_numeric($searchData['pmax'])){
$qb
->andWhere('pc.price02 <= :price_max')
->setParameter('price_max', $searchData['pmax']);
}
if(isset($searchData['instock']) && !empty($searchData['instock'])){
$qb
->andWhere('pc.stock_unlimited = true OR pc.stock > 0');
}
}
if(method_exists('Eccube\Entity\Product','getMaker')){
$searchData['maker_id'] = $request->get('maker_id');
if (!empty($searchData['maker_id']) && $searchData['maker_id']) {
$ids = $searchData['maker_id'];
if(!is_array($ids))$ids = [$ids];
$qb->andWhere($qb->expr()->in('p.Maker', $ids));
}
}
if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
$productItemRepository = $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
$ProductItems = $productItemRepository->findAll();
foreach($ProductItems as $ProductItem){
if($ProductItem->getInputType() == \Plugin\ProductPlus\Entity\ProductItem::DATE_TYPE){
$start = $request->get('productplus_'.$ProductItem->getId().'_date_start');
$end = $request->get('productplus_'.$ProductItem->getId().'_date_end');
if(strlen($start) > 0)$searchData['productplus_'.$ProductItem->getId().'_date_start'] = new \DateTime($start);
if(strlen($end) > 0)$searchData['productplus_'.$ProductItem->getId().'_date_end'] = new \DateTime($end);
}else{
$searchData['productplus_'.$ProductItem->getId()] = $request->get('productplus_'.$ProductItem->getId());
}
}
$qb = $this->searchPlusService->createQueryBuilder($qb, $searchData);
}
$event->setArgument('qb',$qb);
}
public function onTemplateProductList(TemplateEvent $event)
{
$source = $event->getSource();
if(preg_match("/\{\%\sfor\sitem\sin\ssearch\_form\s\%\}/",$source, $result)){
$search = $result[0];
$replace = $search . '
{% if item.vars.value is iterable %}
{% for value in item.vars.value %}
<input type="hidden"
name="{{ item.vars.full_name }}[]"
value="{{ value }}"/>
{% endfor %}
{% else %}';
$source = str_replace($search, $replace, $source);
}
if(preg_match('/value\=\"\{\{\sitem\.vars\.value\s\}\}\"\s\{\%\sendif\s\%\}\/\>/',$source, $result)){
$search = $result[0];
$replace = $search . "{% endif %}";
$source = str_replace($search, $replace, $source);
}
$event->setSource($source);
$twig = '@SearchPlus/default/Product/list_result.twig';
$event->addSnippet($twig);
$js = '@SearchPlus/default/Product/list_result.js';
$event->addAsset($js);
$parameters = $event->getParameters();
if($this->searchPlusService->checkInstallPlugin('ProductPlus')){
$productItemRepository = $this->entityManager->getRepository('Plugin\ProductPlus\Entity\ProductItem');
if(method_exists('Plugin\ProductPlus\Entity\ProductItem', 'setSearchFlg')){
$ProductItems = $productItemRepository->findBy(['search_flg' => true],['sort_no' => 'DESC']);
}else{
$ProductItems = $productItemRepository->findBy([],['sort_no' => 'DESC']);
}
$parameters['ProductItems'] = $ProductItems;
}
$event->setParameters($parameters);
}
public function onTemplateAdminProductItemEdit(TemplateEvent $event)
{
if(method_exists('Plugin\ProductPlus\Entity\ProductItem', 'setSearchFlg')){
$twig = '@SearchPlus/admin/Product/ext_edit.twig';
$event->addSnippet($twig);
$js = '@SearchPlus/admin/Product/ext_edit.js';
$event->addAsset($js);
}
}
}