app/Plugin/PlgExpandProductColumns/Event.php line 225

Open in your IDE?
  1. <?php
  2. namespace Plugin\PlgExpandProductColumns;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\DomCrawler\Crawler;
  8. use Plugin\PlgExpandProductColumns\Form\Type\Admin\PlgExpandProductColumnsType;
  9. use Symfony\Component\Form\FormFactoryInterface;
  10. use Plugin\PlgExpandProductColumns\Entity\PlgExpandProductColumnsValue;
  11. use Plugin\PlgExpandProductColumns\Entity\PlgExpandProductColumns;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. // use Eccube\Repository\ProductRepository;
  16. use Customize\Repository\ProductRepository;
  17. use Plugin\PlgExpandProductColumns\Form\Type\Admin\PlgExpandProductColumnsValueType;
  18. use Eccube\Repository\BaseInfoRepository;
  19. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  20. use Eccube\Common\EccubeConfig;
  21. use Eccube\Entity\Product;
  22. use Knp\Component\Pager\PaginatorInterface;
  23. use Eccube\Repository\Master\ProductListMaxRepository;
  24. use Eccube\Form\Type\SearchProductType;
  25. use Eccube\Event\EventArgs;
  26. use Eccube\Event\EccubeEvents;
  27. class Event implements EventSubscriberInterface
  28. {
  29.     private $twig;
  30.     private $formFactory;
  31.     private $entityManager;
  32.     private $session;
  33.     private $productRepository;
  34.     private $baseInfo;
  35.     private $eventDispatcher;
  36.     private $paginator;
  37.     /**
  38.      * @var EccubeConfig
  39.      */
  40.     protected $eccubeConfig;
  41.     /**
  42.      * @var ProductListMaxRepository
  43.      */
  44.     protected $productListMaxRepository;
  45.     public function __construct(
  46.         \Twig\Environment $twig,
  47.         FormFactoryInterface $formFactory,
  48.         EntityManagerInterface $entityManager,
  49.         SessionInterface $session,
  50.         ProductRepository $productRepository,
  51.         BaseInfoRepository $baseInfoRepository,
  52.         EventDispatcherInterface $eventDispatcher,
  53.         PaginatorInterface $paginator,
  54.         ProductListMaxRepository $productListMaxRepository,
  55.     ) {
  56.         $this->twig $twig;
  57.         $this->formFactory $formFactory;
  58.         $this->entityManager $entityManager;
  59.         $this->session $session;
  60.         $this->productRepository $productRepository;
  61.         $this->baseInfo $baseInfoRepository->get();
  62.         $this->eventDispatcher $eventDispatcher;
  63.         $this->paginator $paginator;
  64.         $this->productListMaxRepository $productListMaxRepository;
  65.     }
  66.     /**
  67.      * @return array
  68.      */
  69.     public static function getSubscribedEvents()
  70.     {
  71.         return [
  72.             KernelEvents::RESPONSE => 'onKernelResponse',
  73.             KernelEvents::REQUEST  => 'onKernelRequest',
  74.             'deleteProductColumnValue' => 'deleteProductColumnValue',
  75.         ];
  76.     }
  77.     public function onKernelResponse(ResponseEvent $event)
  78.     {
  79.         $request $event->getRequest();
  80.         if ($request->attributes->get('_route') === 'admin_product_product_new' || $request->attributes->get('_route') === 'admin_product_product_edit') {
  81.             $this->addColumnProductAdmin($event);
  82.         }
  83.     }
  84.     public function onKernelRequest(RequestEvent $event)
  85.     {
  86.         $request $event->getRequest();
  87.         // Show column to product_list
  88.         if ($request->attributes->get('_route') === 'product_list' || $request->attributes->get('_route') === 'product_detail' || $request->attributes->get('_route') === 'product_detail_locale') {
  89.             $this->setExpandColumns($event);
  90.         }
  91.         if ($request->attributes->get('_route') === 'admin_product_product_new' || $request->attributes->get('_route') === 'admin_product_product_edit' && $request->isMethod('POST')) {
  92.             $this->session->set('plg_expand_product_columns_value'$request->request->get('plg_expand_product_columns_value'));
  93.             $response $event->getResponse();
  94.             if (!$response instanceof RedirectResponse) {
  95.                 return;
  96.             }
  97.         }
  98.         if ($request->attributes->get('_route') === 'admin_product_product_new' || $request->attributes->get('_route') === 'admin_product_product_edit') {
  99.             if ($this->session->has('product_id')) {
  100.                 $productId $this->session->get('product_id');
  101.                 if ($productId) {
  102.                     $this->saveValueColumn($event$productId$this->session->get('plg_expand_product_columns_value'));
  103.                 }
  104.             }
  105.         }
  106.     }
  107.     public function saveValueColumn($event$productId$data)
  108.     {
  109.         if (!empty($data)) {
  110.             foreach ($data as $key => $value) {
  111.                 $productColumn $this->entityManager->getRepository(PlgExpandProductColumns::class)->findOneBy(
  112.                     [
  113.                         'id' => (int)substr($keystrpos($key"field_") + strlen("field_")),
  114.                     ]
  115.                 );
  116.                 $product $this->entityManager->getRepository(Product::class)->findOneBy(
  117.                     [
  118.                         'id' => $productId,
  119.                     ]
  120.                 );
  121.                 $productColumnValue $this->entityManager
  122.                     ->getRepository(PlgExpandProductColumnsValue::class)
  123.                     ->findOneBy([
  124.                         'columnId' => $productColumn->getId(),
  125.                         'productId' => $productId,
  126.                     ]);
  127.                 // It is only allowed to add multies columns
  128.                 if ($value) {
  129.                     if (is_array($value)) {
  130.                         $value implode(';'$value);
  131.                     }
  132.                     // Update or create
  133.                     if ($productColumnValue) {
  134.                         $productColumnValue->setValue($value);
  135.                     } else {
  136.                         $productColumnValue = new PlgExpandProductColumnsValue();
  137.                         $productColumnValue->setProductId($product);
  138.                         $productColumnValue->setColumnId($productColumn);
  139.                         $productColumnValue->setValue($value);
  140.                     }
  141.                     $this->entityManager->persist($productColumnValue);
  142.                     $this->entityManager->flush();
  143.                 } else {
  144.                     if ($productColumnValue) {
  145.                         $this->entityManager->remove($productColumnValue);
  146.                         $this->entityManager->flush();
  147.                     }
  148.                 }
  149.             }
  150.             $this->session->remove('product_id');
  151.             $this->session->remove('plg_expand_product_columns_value');
  152.         }
  153.     }
  154.     public function onRenderAdminProductNew($event$templateEvent)
  155.     {
  156.     }
  157.     public function addColumnProductAdmin($event)
  158.     {
  159.         $html $event->getResponse()->getContent();
  160.         $request $event->getRequest();
  161.         $productColumnValue = new PlgExpandProductColumnsValue();
  162.         $form $this->formFactory->create(PlgExpandProductColumnsType::class, $productColumnValue);
  163.         $data $this->entityManager->getRepository(PlgExpandProductColumns::class)->findAll();
  164.         // Edit product
  165.         $exColumnsValue null;
  166.         $id $request->attributes->get('id');
  167.         if ($id) {
  168.             $exColumnsValue $this->entityManager->getRepository(PlgExpandProductColumnsValue::class)->findBy(
  169.                 [
  170.                     'productId' => $id
  171.                 ]
  172.             );
  173.         }
  174.         // PlgExpandProductColumnsValueType
  175.         $form $this->formFactory->create(PlgExpandProductColumnsValueType::class, null, [
  176.             'data' => $data,
  177.         ]);
  178.         // set default value in form
  179.         if (!empty($exColumnsValue)) {
  180.             foreach ($exColumnsValue as $key => $value) {
  181.                 if (in_array($value['columnId']['type'], [5])) {
  182.                     $form->get(('field_' $value->getColumnId()->getId()))->setData(explode(';'$value->getValue()));
  183.                 } else {
  184.                     $form->get(('field_' $value->getColumnId()->getId()))->setData($value->getValue());
  185.                 }
  186.             }
  187.         }
  188.         $renderedTemplate $this->twig->render('@PlgExpandProductColumns/admin/expand_column.twig', [
  189.             'form' => $form->createView(),
  190.             'data' => $data,
  191.         ]);
  192.         $crawler = new Crawler($html);
  193.         $oldElement $crawler->filter('.c-primaryCol')->filter('.rounded')->last();
  194.         if (count($oldElement) > 0) {
  195.             $html str_replace('<div class="expandColumn">''<div class="expandColumn">' $renderedTemplate$html);
  196.             $event->setResponse($event->getResponse()->setContent($html));
  197.         }
  198.     }
  199.     public function setExpandColumns($event)
  200.     {
  201.         $route $event->getRequest()->attributes->get('_route');
  202.         $valueRepository $this->entityManager->getRepository(PlgExpandProductColumnsValue::class);
  203.         $columnRepository $this->entityManager->getRepository(PlgExpandProductColumns::class);
  204.         switch ($route) {
  205.             case 'product_detail':
  206.                 $id $event->getRequest()->attributes->get('id');
  207.                 $exProductDetail $this->getProductExt(
  208.                     $id,
  209.                     $valueRepository,
  210.                     $columnRepository
  211.                 );
  212.                 return $this->twig->addGlobal('__EX_PRODUCT_DETAIL'$exProductDetail);
  213.             case 'product_detail_locale':
  214.                 $id $event->getRequest()->attributes->get('id');
  215.                 $exProductDetail $this->getProductExt(
  216.                     $id,
  217.                     $valueRepository,
  218.                     $columnRepository
  219.                 );
  220.                 return $this->twig->addGlobal('__EX_PRODUCT_DETAIL'$exProductDetail);
  221.             case 'product_list':
  222.                 $exProductList = [];
  223.                 $products $this->getPagination($event);
  224.                 foreach ($products as $product) {
  225.                     $exProductList[$product->getId()] = $this->getProductExt(
  226.                         $product->getId(),
  227.                         $valueRepository,
  228.                         $columnRepository
  229.                     );
  230.                 }
  231.                 return $this->twig->addGlobal('__EX_PRODUCT_LIST'$exProductList);
  232.         }
  233.     }
  234.     private function getProductExt($id$value_repository$column_repository)
  235.     {
  236.         $product_ex = [];
  237.         $columns $column_repository->findAll();
  238.         /** @var \Plugin\PlgExpandProductColumns\Entity\PlgExpandProductColumns $column */
  239.         foreach ($columns as $column) {
  240.             $value $value_repository->findOneBy([
  241.                 'columnId' => $column->getId(),
  242.                 'productId' => $id
  243.             ]);
  244.             $product_ex[$column->getId()] = [
  245.                 'id' => $column->getId(),
  246.                 'name' => $column->getName(),
  247.                 'value' => $value
  248.             ];
  249.         }
  250.         return $product_ex;
  251.     }
  252.     // Custom pagination
  253.     private function getPagination($event)
  254.     {
  255.         $request $event->getRequest();
  256.         if ($this->baseInfo->isOptionNostockHidden()) {
  257.             $this->entityManager->getFilters()->enable('option_nostock_hidden');
  258.         }
  259.         if ($request->getMethod() === 'GET') {
  260.             $request->query->set('pageno'$request->query->get('pageno'''));
  261.         }
  262.         // searchForm
  263.         /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
  264.         $builder $this->formFactory->createNamedBuilder(''SearchProductType::class);
  265.         if ($request->getMethod() === 'GET') {
  266.             $builder->setMethod('GET');
  267.         }
  268.         $event = new EventArgs(
  269.             [
  270.                 'builder' => $builder,
  271.             ],
  272.             $request
  273.         );
  274.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_PRODUCT_INDEX_INITIALIZE);
  275.         /* @var $searchForm \Symfony\Component\Form\FormInterface */
  276.         $searchForm $builder->getForm();
  277.         $searchForm->handleRequest($request);
  278.         $searchData $searchForm->getData();
  279.         $categories = [];
  280.         for ($i 0$i <= 4$i++) {
  281.             $paramName 'category_id_' $i;
  282.             if ($request->query->has($paramName)) {
  283.                 $categories[] = $request->query->get($paramName);
  284.             }
  285.         }
  286.         $date $request->query->get('date');
  287.         $qb $this->productRepository->getQueryBuilderBySearchData($searchData$this->entityManager$categories$date);
  288.         $event = new EventArgs(
  289.             [
  290.                 'searchData' => $searchData,
  291.                 'qb' => $qb,
  292.             ],
  293.             $request
  294.         );
  295.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_PRODUCT_INDEX_SEARCH);
  296.         $searchData $event->getArgument('searchData');
  297.         $query $qb->getQuery();
  298.         /** @var SlidingPagination $pagination */
  299.         return $this->paginator->paginate(
  300.             $query,
  301.             !empty($searchData['pageno']) ? $searchData['pageno'] : 1,
  302.             !empty($searchData['disp_number']) ? $searchData['disp_number']->getId() : $this->productListMaxRepository->findOneBy([], ['sort_no' => 'ASC'])->getId()
  303.         );
  304.     }
  305.     /**
  306.      * Delete column before delete product
  307.      *
  308.      * @param EventArgs $event
  309.      * @return void
  310.      */
  311.     public function deleteProductColumnValue(EventArgs $event)
  312.     {
  313.         $product $event->getArgument('Product');
  314.         $productColumnValues $this->entityManager
  315.             ->getRepository(PlgExpandProductColumnsValue::class)
  316.             ->findBy([
  317.                 'productId' => $product->getId(),
  318.             ]);
  319.         foreach ($productColumnValues as $productColumnValue) {
  320.             $this->entityManager->remove($productColumnValue);
  321.         }
  322.         $this->entityManager->flush();
  323.     }
  324. }