app/Plugin/OrderStatusEx/EventSubscriber/OrderStatusEventSubscriber.php line 171

Open in your IDE?
  1. <?php
  2. /**
  3.  * Copyright(c) 2022 SYSTEM_KD
  4.  * Date: 2022/09/03
  5.  */
  6. namespace Plugin\OrderStatusEx\EventSubscriber;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Eccube\Entity\Master\OrderStatus;
  9. use Eccube\Entity\Order;
  10. use Eccube\Entity\Shipping;
  11. use Eccube\Event\TemplateEvent;
  12. use Eccube\Form\Type\Admin\OrderStatusSettingType;
  13. use Eccube\Service\SystemService;
  14. use Eccube\Util\CacheUtil;
  15. use Plugin\OrderStatusEx\Controller\Admin\Seggin\Shop\OrderStatusExController;
  16. use Plugin\OrderStatusEx\Entity\OrderStatusEvent;
  17. use Plugin\OrderStatusEx\Entity\OrderStatusEx;
  18. use Plugin\OrderStatusEx\Service\OrderStatusExService;
  19. use Plugin\OrderStatusEx\Service\TwigRenderService\EventSubscriber\TwigRenderTrait;
  20. use Symfony\Component\DependencyInjection\ContainerInterface;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Symfony\Component\Form\FormFactoryInterface;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  25. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  26. use Symfony\Component\HttpKernel\KernelEvents;
  27. use Symfony\Component\Routing\RouterInterface;
  28. use Symfony\Component\Workflow\Event\TransitionEvent;
  29. class OrderStatusEventSubscriber implements EventSubscriberInterface
  30. {
  31.     use TwigRenderTrait;
  32.     /** @var RouterInterface */
  33.     protected $router;
  34.     /** @var FormFactoryInterface */
  35.     protected $formFactory;
  36.     /** @var ContainerInterface */
  37.     protected $container;
  38.     /** @var EntityManagerInterface */
  39.     protected $entityManager;
  40.     /** @var OrderStatusExService */
  41.     protected $orderStatusExService;
  42.     /** @var OrderStatusExController */
  43.     protected $orderStatusExController;
  44.     /** @var CacheUtil */
  45.     protected $cachUtil;
  46.     /** @var SessionInterface */
  47.     protected $session;
  48.     /** @var SystemService */
  49.     protected $systemService;
  50.     public function __construct(
  51.         RouterInterface         $router,
  52.         FormFactoryInterface    $formFactory,
  53.         ContainerInterface      $container,
  54.         EntityManagerInterface  $entityManager,
  55.         OrderStatusExService    $orderStatusExService,
  56.         OrderStatusExController $orderStatusExController,
  57.         SessionInterface        $session,
  58.         CacheUtil               $cacheUtil,
  59.         SystemService           $systemService
  60.     )
  61.     {
  62.         $this->router $router;
  63.         $this->formFactory $formFactory;
  64.         $this->container $container;
  65.         $this->entityManager $entityManager;
  66.         $this->orderStatusExService $orderStatusExService;
  67.         $this->orderStatusExController $orderStatusExController;
  68.         $this->session $session;
  69.         $this->cachUtil $cacheUtil;
  70.         $this->systemService $systemService;
  71.     }
  72.     /**
  73.      * 受注対応状況設定テンプレート
  74.      *
  75.      * @param TemplateEvent $event
  76.      * @return void
  77.      */
  78.     public function onSettingShopOrderStatusTwig(TemplateEvent $event)
  79.     {
  80.         // リダイレクトしない場合はキャッシュクリア用フラグOFF
  81.         $this->session->set(OrderStatusExService::CACHE_CLEAR_KEYfalse);
  82.         /** @var Request $request */
  83.         $request $this->container->get('request_stack')->getMainRequest();
  84.         // 新規登録エラー用
  85.         $builder $this->formFactory->createBuilder(OrderStatusSettingType::class, null);
  86.         $form $builder->getForm();
  87.         $form->get('color')->setData('#a3a3a3');
  88.         if ('POST' === $request->getMethod()) {
  89.             $form->handleRequest($request);
  90.             if ($form->isSubmitted()) {
  91.                 $form->isValid();
  92.             }
  93.         }
  94.         $event->setParameter('createForm'$form->createView());
  95.         $this->initRenderService($event);
  96.         // 新規登録ブロック追加
  97.         $this->createInsertBuilder()
  98.             ->find(".c-contentsArea__primaryCol")
  99.             ->setTargetId('order_status_ex_block')
  100.             ->setInsertModePrepend();
  101.         // テーブル追加
  102.         $this->createInsertBuilder()
  103.             ->find('table > thead > tr')
  104.             ->setTargetId('order_status_ex_table_head')
  105.             ->setInsertModeAppend();
  106.         // 削除ボタン
  107.         $child $this->twigRenderService
  108.             ->eachChildBuilder()
  109.             ->findThis()
  110.             ->targetFindAndIndexKey("#orderStatusExIndex_""orderStatusExIndex")
  111.             ->setInsertModeAppend();
  112.         $this->twigRenderService
  113.             ->eachBuilder()
  114.             ->find("table > tbody > tr")
  115.             ->setEachIndexKey("orderStatusExIndex")
  116.             ->each($child->build());
  117.         // 削除用モーダル
  118.         $this->createInsertBuilder()
  119.             ->find("#form")
  120.             ->setTargetId("OrderStatusDeleteModal")
  121.             ->setInsertModeAfter();
  122.         $child $this->twigRenderService
  123.             ->eachChildBuilder()
  124.             ->findThis()
  125.             ->find('td')
  126.             ->eq(2)
  127.             ->targetFindAndIndexKey("#orderStatusExIndex2_""orderStatusExIndex2")
  128.             ->setInsertModeAppend();
  129.         $this->twigRenderService
  130.             ->eachBuilder()
  131.             ->find("table > tbody > tr")
  132.             ->setEachIndexKey("orderStatusExIndex2")
  133.             ->each($child->build());
  134.         $this->addTwigRenderSnippet(
  135.             '@OrderStatusEx/admin/Setting/Shop/order_status_add.twig',
  136.             '@OrderStatusEx/admin/Setting/Shop/order_status_add_js.twig'
  137.         );
  138.     }
  139.     public function onKernelController(ControllerEvent $event)
  140.     {
  141.         $request $event->getRequest();
  142.         $route $request->attributes->get('_route');
  143.         if ('admin_setting_shop_order_status' === $route) {
  144.             if ($this->session->get(OrderStatusExService::CACHE_CLEAR_KEYfalse)) {
  145.                 $this->systemService->switchMaintenance(true);
  146.                 // Cache Clear
  147.                 $this->session->set(OrderStatusExService::CACHE_CLEAR_KEYfalse);
  148.                 $this->cachUtil->clearCache();
  149.                 $this->systemService->disableMaintenance();
  150.             }
  151.             // 新規登録Form
  152.             $builder $this->formFactory->createBuilder(OrderStatusSettingType::class, null);
  153.             $form $builder->getForm();
  154.             $form->handleRequest($request);
  155.             // 新規登録分の登録処理
  156.             if ($form->isSubmitted()) {
  157.                 if ($form->isValid()) {
  158.                     // 登録処理実施
  159.                     /** @var OrderStatus $orderStatus */
  160.                     $orderStatus $form->getData();
  161.                     // 受注状態追加
  162.                     $masterResult $this->orderStatusExService->getMasterNextId(OrderStatus::class);
  163.                     $orderStatus
  164.                         ->setId($masterResult->nextId)
  165.                         ->setSortNo($masterResult->nextSortNo);
  166.                     $this->entityManager->persist($orderStatus);
  167.                     $this->entityManager->flush();
  168.                     // 色登録
  169.                     $color $form->get('color')->getData();
  170.                     $this->orderStatusExService->registerOrderStatusColor($orderStatus$color);
  171.                     // マイページ用名称登録
  172.                     $customerOrderStatusName $form->get('customer_order_status_name')->getData();
  173.                     $this->orderStatusExService->registerCustomerOrderStatus($orderStatus$customerOrderStatusName);
  174.                     // 移動先・イベント種別情報登録
  175.                     // 移動先取得
  176.                     $orderStatuses $form->get('OrderStatuses')->getData();
  177.                     // 選択イベント取得
  178.                     $activeEvent $form->get('ActiveEvent')->getData();
  179.                     // 他の受注状況拡張情報取得
  180.                     $orderStatusExs $this->entityManager->getRepository(OrderStatusEx::class)->findAll();
  181.                     $orderStatusEventRepository $this->entityManager->getRepository(OrderStatusEvent::class);
  182.                     $selectEvents = [];
  183.                     /** @var OrderStatusEx $orderStatusEx */
  184.                     foreach ($orderStatusExs as $orderStatusEx) {
  185.                         /** @var OrderStatusEvent $selectEventGroup */
  186.                         $selectEventGroup $orderStatusEventRepository->find($orderStatusEx->getMoveOrderStatusId());
  187.                         if ($selectEventGroup) {
  188.                             $selectEvents[$orderStatusEx->getMoveOrderStatusId()] = $selectEventGroup->getSelectEventGroup();
  189.                         } else {
  190.                             $selectEvents[$orderStatusEx->getMoveOrderStatusId()] = OrderStatusEvent::EVENT_GROUP_NONE;
  191.                         }
  192.                     }
  193.                     // 新規追加分のイベント設定
  194.                     $selectEvents[$orderStatus->getId()] = $activeEvent;
  195.                     $this->orderStatusExService->updateOrderStatusEx($orderStatus$orderStatuses$selectEvents);
  196.                     $this->entityManager->flush();
  197.                     // リダイレクト
  198.                     $event->setController([$this->orderStatusExController'success']);
  199.                 }
  200.             } else if ($request->getMethod() == 'POST') {
  201.                 // Cache Clear ON
  202.                 $this->session->set(OrderStatusExService::CACHE_CLEAR_KEYtrue);
  203.             }
  204.         }
  205.     }
  206.     /**
  207.      * 受注状況の発送済み相当変更時
  208.      *
  209.      * @param TransitionEvent $event
  210.      * @return void
  211.      */
  212.     public function onShip(TransitionEvent $event)
  213.     {
  214.         $tos $event->getTransition()->getTos();
  215.         if (in_array(OrderStatus::DELIVERED$tos)) {
  216.             return;
  217.         }
  218.         /** @var Order $order */
  219.         $order $event->getSubject()->getOrder();
  220.         $order->getShippings()->map(function (Shipping $shipping) {
  221.             if (!$shipping->isShipped()) {
  222.                 $shipping->setShippingDate(new \DateTime());
  223.             }
  224.         });
  225.     }
  226.     public static function getSubscribedEvents()
  227.     {
  228.         return [
  229.             KernelEvents::CONTROLLER => 'onKernelController',
  230.             '@admin/Setting/Shop/order_status.twig' => 'onSettingShopOrderStatusTwig',
  231.             'workflow.order.transition.ship' => 'onShip',
  232.         ];
  233.     }
  234. }