app/Plugin/KokokaraSelect/EventSubscriber/MypageEventSubscriber.php line 93

Open in your IDE?
  1. <?php
  2. /**
  3.  * Copyright(c) 2020 SYSTEM_KD
  4.  * Date: 2020/05/26
  5.  */
  6. namespace Plugin\KokokaraSelect\EventSubscriber;
  7. use Eccube\Entity\Customer;
  8. use Eccube\Entity\Order;
  9. use Eccube\Entity\OrderItem;
  10. use Eccube\Event\EccubeEvents;
  11. use Eccube\Event\EventArgs;
  12. use Eccube\Event\TemplateEvent;
  13. use Eccube\Service\CartService;
  14. use Eccube\Service\PurchaseFlow\PurchaseContext;
  15. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  16. use Plugin\KokokaraSelect\Config\ConfigSetting;
  17. use Plugin\KokokaraSelect\Entity\KsSelectItem;
  18. use Plugin\KokokaraSelect\Entity\KsSelectItemGroup;
  19. use Plugin\KokokaraSelect\Service\KsCartHelper;
  20. use Plugin\KokokaraSelect\Service\KsOrderItemService;
  21. use Plugin\KokokaraSelect\Service\KsSelectItemGroupService;
  22. use Plugin\KokokaraSelect\Service\KsSelectItemService;
  23. use Plugin\KokokaraSelect\Service\KsService;
  24. use Plugin\KokokaraSelect\Service\PlgConfigService\ConfigService;
  25. use Plugin\KokokaraSelect\Service\TwigRenderService\EventSubscriber\TwigRenderTrait;
  26. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  27. use Symfony\Component\HttpFoundation\Session\Session;
  28. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  29. class MypageEventSubscriber implements EventSubscriberInterface
  30. {
  31.     use TwigRenderTrait;
  32.     /** @var KsSelectItemService */
  33.     protected $ksSelectItemService;
  34.     /** @var KsSelectItemGroupService */
  35.     protected $ksSelectItemGroupService;
  36.     /** @var CartService */
  37.     protected $cartService;
  38.     /** @var KsCartHelper */
  39.     protected $ksCartHelper;
  40.     /** @var PurchaseFlow */
  41.     protected $purchaseFlow;
  42.     /** @var Session */
  43.     protected $session;
  44.     /** @var KsService */
  45.     protected $ksService;
  46.     /** @var KsOrderItemService */
  47.     protected $ksOrderItemService;
  48.     /** @var ConfigService */
  49.     protected $configService;
  50.     public function __construct(
  51.         KsSelectItemService $ksSelectItemService,
  52.         KsSelectItemGroupService $ksSelectItemGroupService,
  53.         CartService $cartService,
  54.         KsCartHelper $ksCartHelper,
  55.         PurchaseFlow $cartPurchaseFlow,
  56.         SessionInterface $session,
  57.         KsService $ksService,
  58.         KsOrderItemService $ksOrderItemService,
  59.         ConfigService $configService
  60.     )
  61.     {
  62.         $this->ksSelectItemService $ksSelectItemService;
  63.         $this->ksSelectItemGroupService $ksSelectItemGroupService;
  64.         $this->cartService $cartService;
  65.         $this->ksCartHelper $ksCartHelper;
  66.         $this->purchaseFlow $cartPurchaseFlow;
  67.         $this->session $session;
  68.         $this->ksService $ksService;
  69.         $this->ksOrderItemService $ksOrderItemService;
  70.         $this->configService $configService;
  71.     }
  72.     /**
  73.      * 注文履歴詳細テンプレート
  74.      *
  75.      * @param TemplateEvent $event
  76.      */
  77.     public function onTemplateMypageHistory(TemplateEvent $event)
  78.     {
  79.         if ($this->configService->isKeyBool(ConfigSetting::SETTING_KEY_SELECT_ITEM_VIEW_HISTORY)) {
  80.             $this->initRenderService($event);
  81.             $eachChild $this->twigRenderService
  82.                 ->eachChildBuilder()
  83.                 ->findThis()
  84.                 ->find('.ec-imageGrid__content')
  85.                 ->targetFindAndIndexKey('#kokokara_select_item_'"kokokaraSelectIndex")
  86.                 ->setInsertModeAppend();
  87.             $this->twigRenderService
  88.                 ->eachBuilder()
  89.                 ->find('.ec-orderDelivery__item')
  90.                 ->setEachIndexKey('kokokaraSelectIndex')
  91.                 ->each($eachChild);
  92.             $this->addTwigRenderSnippet('@KokokaraSelect/default/Mypage/history_ex.twig');
  93.         }
  94.     }
  95.     /**
  96.      * マイページ再注文完了
  97.      *
  98.      * @param EventArgs $event
  99.      */
  100.     public function onFrontMypageMypageOrderComplete(EventArgs $event)
  101.     {
  102.         /** @var Order $order */
  103.         $order $event->getArgument('Order');
  104.         /** @var Customer $customer */
  105.         $customer $event->getArgument('Customer');
  106.         $selectItemData = [];
  107.         $parentQuantityList = [];
  108.         $groupIndexMax 0;
  109.         $groupIndexSeq = [];
  110.         /** @var OrderItem $orderItem */
  111.         foreach ($order->getOrderItems() as $orderItem) {
  112.             if (!$orderItem->isProduct()
  113.                 && !$this->ksOrderItemService->isKsOrderItem($orderItem)) continue;
  114.             if ($this->ksService->isKsProduct($orderItem)) {
  115.                 // 注文件数保持
  116.                 $parentQuantityList[$orderItem->getProductClass()->getId()] = $orderItem->getQuantity();
  117.             }
  118.             $ksOrderItemEx $orderItem->getKsOrderItemEx();
  119.             // 選択商品を処理対象とする
  120.             if ($ksOrderItemEx) {
  121.                 // 選択商品が所属するGroup, Itemが存在するかチェック
  122.                 $ksSelectItemGroupId $ksOrderItemEx->getKsSelectItemGroupId();
  123.                 $ksSelectItemId $ksOrderItemEx->getKsSelectItemId();
  124.                 $shippingId $ksOrderItemEx->getOrderItem()->getShipping()->getId();
  125.                 $gid $ksOrderItemEx->getGroupId();
  126.                 if (isset($groupIndexSeq[$shippingId '-' $gid])) {
  127.                     $groupIndex $groupIndexSeq[$shippingId '-' $gid];
  128.                 } else {
  129.                     $groupIndex $groupIndexMax;
  130.                     $groupIndexSeq[$shippingId '-' $gid] = $groupIndexMax;
  131.                     $groupIndexMax += 1;
  132.                 }
  133.                 // 親のProductClass 取得
  134.                 $parentProductClass $ksOrderItemEx->getParentOrderItem()->getProductClass();
  135.                 /** @var KsSelectItemGroup $ksSelectItemGroup */
  136.                 $ksSelectItemGroup $ksOrderItemEx->getKsSelectItemGroup();
  137.                 if (!$ksSelectItemGroup) {
  138.                     // 選択商品のグループが存在しない
  139.                     log_info('[KokokaraSelect]選択商品の所属グループが存在しない。', [
  140.                         'ks_select_item_group_id' => $ksSelectItemGroupId,
  141.                         'ks_select_item_id' => $ksSelectItemId,
  142.                     ]);
  143.                     continue;
  144.                 }
  145.                 /** @var KsSelectItem $ksSelectItem */
  146.                 $ksSelectItem $ksOrderItemEx->getKsSelectItem();
  147.                 if (!$ksSelectItem) {
  148.                     // 復帰できない場合
  149.                     // ※ProductClassは退避から取得
  150.                     $targetProductClass $ksOrderItemEx->getOrderItem()->getKsTmpProductClass();
  151.                     // 選択商品は既に存在しない
  152.                     log_info('[KokokaraSelect]選択商品が存在しない。', [
  153.                         'ks_select_item_group_id' => $ksSelectItemGroupId,
  154.                         'ks_select_item_id' => $ksOrderItemEx->getKsSelectItemId(),
  155.                         'product_class_id' => $targetProductClass->getId(),
  156.                     ]);
  157.                     continue;
  158.                 }
  159.                 $selectItemData[$parentProductClass->getId()][$groupIndex][] = [
  160.                     'KsSelectItem' => $ksSelectItem,
  161.                     'KsSelectItemGroup' => $ksSelectItemGroup,
  162.                     'quantity' => $orderItem->getQuantity(),
  163.                 ];
  164.             }
  165.         }
  166.         // カートと選択商品をリレーション
  167.         $this->ksCartHelper->setKsCartSelectItemGroupByOrder($this->cartService->getCarts(), $selectItemData);
  168.         // カート情報最適化
  169.         $optimizeList $this->ksCartHelper->optimizeData($this->cartService->getCarts(), $parentQuantityList);
  170.         foreach ($optimizeList as $productClassId => $quantity) {
  171.             if ($quantity == 0) {
  172.                 // 削除
  173.                 $this->cartService->removeProduct($productClassId);
  174.                 $this->session->getFlashBag()->add('eccube.front.request.error''kokokara_select.cart.item.validate.item');
  175.             } else {
  176.                 // 数量を減らす
  177.                 $this->cartService->addProduct($productClassId, -$quantity);
  178.             }
  179.             // カートを取得して明細の正規化を実行
  180.             foreach ($this->cartService->getCarts() as $Cart) {
  181.                 $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart$customer));
  182.             }
  183.             $this->cartService->save();
  184.         }
  185.         $this->cartService->save();
  186.     }
  187.     public static function getSubscribedEvents()
  188.     {
  189.         return [
  190.             'Mypage/history.twig' => ['onTemplateMypageHistory'],
  191.             EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_COMPLETE => ['onFrontMypageMypageOrderComplete'],
  192.         ];
  193.     }
  194. }