app/Customize/Controller/Mypage/CustomMypageController.php line 40

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Customize\Controller\Mypage;
  13. use Eccube\Controller\AbstractController;
  14. use Eccube\Entity\BaseInfo;
  15. use Eccube\Entity\Customer;
  16. use Eccube\Entity\Order;
  17. use Eccube\Entity\Product;
  18. use Eccube\Event\EccubeEvents;
  19. use Eccube\Event\EventArgs;
  20. use Eccube\Exception\CartException;
  21. use Eccube\Form\Type\Front\CustomerLoginType;
  22. use Eccube\Repository\BaseInfoRepository;
  23. use Eccube\Repository\CustomerFavoriteProductRepository;
  24. use Eccube\Repository\OrderRepository;
  25. use Eccube\Repository\ProductRepository;
  26. use Eccube\Service\CartService;
  27. use Eccube\Service\PurchaseFlow\PurchaseContext;
  28. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  29. use Knp\Component\Pager\PaginatorInterface;
  30. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  33. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  34. use Symfony\Component\Routing\Annotation\Route;
  35. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  36. class CustomMypageController extends AbstractController
  37. {
  38.     /**
  39.      * @var ProductRepository
  40.      */
  41.     protected $productRepository;
  42.     /**
  43.      * @var CustomerFavoriteProductRepository
  44.      */
  45.     protected $customerFavoriteProductRepository;
  46.     /**
  47.      * @var BaseInfo
  48.      */
  49.     protected $BaseInfo;
  50.     /**
  51.      * @var CartService
  52.      */
  53.     protected $cartService;
  54.     /**
  55.      * @var OrderRepository
  56.      */
  57.     protected $orderRepository;
  58.     /**
  59.      * @var PurchaseFlow
  60.      */
  61.     protected $purchaseFlow;
  62.     /**
  63.      * MypageController constructor.
  64.      *
  65.      * @param OrderRepository $orderRepository
  66.      * @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
  67.      * @param CartService $cartService
  68.      * @param BaseInfoRepository $baseInfoRepository
  69.      * @param PurchaseFlow $purchaseFlow
  70.      */
  71.     public function __construct(
  72.         OrderRepository $orderRepository,
  73.         CustomerFavoriteProductRepository $customerFavoriteProductRepository,
  74.         CartService $cartService,
  75.         BaseInfoRepository $baseInfoRepository,
  76.         PurchaseFlow $purchaseFlow
  77.     ) {
  78.         $this->orderRepository $orderRepository;
  79.         $this->customerFavoriteProductRepository $customerFavoriteProductRepository;
  80.         $this->BaseInfo $baseInfoRepository->get();
  81.         $this->cartService $cartService;
  82.         $this->purchaseFlow $purchaseFlow;
  83.     }
  84.     /**
  85.      * ログイン画面.
  86.      *
  87.      * @Route("/mypage/login", name="mypage_login", methods={"GET", "POST"})
  88.      * @Template("Mypage/login.twig")
  89.      */
  90.     public function login(Request $requestAuthenticationUtils $utils)
  91.     {
  92.         if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
  93.             log_info('認証済のためログイン処理をスキップ');
  94.             $Customer $this->getUser();
  95.             if ($Customer instanceof Customer) {
  96.                 $this->clearCartItem($Customer);
  97.             }
  98.             return $this->redirectToRoute('mypage');
  99.         }
  100.         /* @var $form \Symfony\Component\Form\FormInterface */
  101.         $builder $this->formFactory
  102.             ->createNamedBuilder(''CustomerLoginType::class);
  103.         $builder->get('login_memory')->setData((bool) $request->getSession()->get('_security.login_memory'));
  104.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  105.             $Customer $this->getUser();
  106.             if ($Customer instanceof Customer) {
  107.                 $this->clearCartItem($Customer);
  108.                 $builder->get('login_email')
  109.                     ->setData($Customer->getEmail());
  110.             }
  111.         }
  112.         $event = new EventArgs(
  113.             [
  114.                 'builder' => $builder,
  115.             ],
  116.             $request
  117.         );
  118.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_LOGIN_INITIALIZE$event);
  119.         $form $builder->getForm();
  120.         return [
  121.             'error' => $utils->getLastAuthenticationError(),
  122.             'form' => $form->createView(),
  123.         ];
  124.     }
  125.     /**
  126.      * マイページ.
  127.      *
  128.      * @Route("/mypage/", name="mypage", methods={"GET"})
  129.      * @Template("Mypage/index.twig")
  130.      */
  131.     public function index(Request $requestPaginatorInterface $paginator)
  132.     {
  133.         $Customer $this->getUser();
  134.         // 購入処理中/決済処理中ステータスの受注を非表示にする.
  135.         $this->entityManager
  136.             ->getFilters()
  137.             ->enable('incomplete_order_status_hidden');
  138.         // paginator
  139.         $qb $this->orderRepository->getQueryBuilderByCustomer($Customer);
  140.         $event = new EventArgs(
  141.             [
  142.                 'qb' => $qb,
  143.                 'Customer' => $Customer,
  144.             ],
  145.             $request
  146.         );
  147.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_INDEX_SEARCH$event);
  148.         $pagination $paginator->paginate(
  149.             $qb,
  150.             $request->get('pageno'1),
  151.             $this->eccubeConfig['eccube_search_pmax']
  152.         );
  153.         return [
  154.             'pagination' => $pagination,
  155.         ];
  156.     }
  157.     /**
  158.      * メニューページ(販売店用トップ).
  159.      *
  160.      * @Route("/mypage/menu", name="mypage_menu", methods={"GET"})
  161.      * @Template("Mypage/menu.twig")
  162.      */
  163.     public function menu(Request $requestPaginatorInterface $paginator)
  164.     {
  165.         if (wp_remote_get($request->getSchemeAndHttpHost() . $request->getBasePath() . '/shop/wp-json/wp/v2/store-news?per_page=3&_embed'false)) {
  166.             $response wp_remote_get($request->getSchemeAndHttpHost() . $request->getBasePath() . '/shop/wp-json/wp/v2/store-news?per_page=3&_embed'false);
  167.             $posts json_decode($response["body"]);
  168.         } else {
  169.             $posts false;
  170.         }
  171.         $storeBlogDatas = [];
  172.         if ($posts) {
  173.           foreach ($posts as $data) {
  174.             $item = [];
  175.             $item['title'] = $data->title;
  176.             $item['date'] = $data->date;
  177.             $item['link'] = $data->link;
  178.             $name 'wp:featuredmedia';
  179.             if (isset($data->_embedded->{$name})) {
  180.               $item['attachment'] = $data->_embedded->{$name}[0];
  181.             }
  182.             $name 'wp:term';
  183.             if (isset($data->_embedded->{$name})) {
  184.               $item['category'] = $data->_embedded->{$name}[0];
  185.             }
  186.             $storeBlogDatas[] = $item;
  187.           }
  188.         }
  189.         return [
  190.             'storeBlogDatas' => $storeBlogDatas,
  191.         ];
  192.     }
  193.     /**
  194.      * 新着情報.
  195.      *
  196.      * @Route("/mypage/news", name="mypage_news", methods={"GET"})
  197.      * @Template("Mypage/news.twig")
  198.      */
  199.     public function news(Request $requestPaginatorInterface $paginator)
  200.     {
  201.         $Customer $this->getUser();
  202.         // 購入処理中/決済処理中ステータスの受注を非表示にする.
  203.         $this->entityManager
  204.             ->getFilters()
  205.             ->enable('incomplete_order_status_hidden');
  206.         // paginator
  207.         $qb $this->orderRepository->getQueryBuilderByCustomer($Customer);
  208.         $event = new EventArgs(
  209.             [
  210.                 'qb' => $qb,
  211.                 'Customer' => $Customer,
  212.             ],
  213.             $request
  214.         );
  215.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_INDEX_SEARCH$event);
  216.         $pagination $paginator->paginate(
  217.             $qb,
  218.             $request->get('pageno'1),
  219.             $this->eccubeConfig['eccube_search_pmax']
  220.         );
  221.         if (wp_remote_get($request->getSchemeAndHttpHost() . $request->getBasePath() . '/shop/wp-json/wp/v2/store-news?per_page=100&_embed'false)) {
  222.             $response wp_remote_get($request->getSchemeAndHttpHost() . $request->getBasePath() . '/shop/wp-json/wp/v2/store-news?per_page=100&_embed'false);
  223.             $posts json_decode($response["body"]);
  224.         } else {
  225.             $posts false;
  226.         }
  227.         $storeBlogDatas = [];
  228.         if ($posts) {
  229.           foreach ($posts as $data) {
  230.             $item = [];
  231.             $item['title'] = $data->title;
  232.             $item['date'] = $data->date;
  233.             $item['link'] = $data->link;
  234.             $name 'wp:featuredmedia';
  235.             if (isset($data->_embedded->{$name})) {
  236.               $item['attachment'] = $data->_embedded->{$name}[0];
  237.             }
  238.             $name 'wp:term';
  239.             if (isset($data->_embedded->{$name})) {
  240.               $item['category'] = $data->_embedded->{$name}[0];
  241.             }
  242.             $storeBlogDatas[] = $item;
  243.           }
  244.         }
  245.         return [
  246.             'pagination' => $pagination,
  247.             'storeBlogDatas' => $storeBlogDatas,
  248.         ];
  249.     }
  250.     /**
  251.      * 購入履歴詳細を表示する.
  252.      *
  253.      * @Route("/mypage/history/{order_no}", name="mypage_history", methods={"GET"})
  254.      * @Template("Mypage/history.twig")
  255.      */
  256.     public function history(Request $request$order_no)
  257.     {
  258.         $this->entityManager->getFilters()
  259.             ->enable('incomplete_order_status_hidden');
  260.         $Order $this->orderRepository->findOneBy(
  261.             [
  262.                 'order_no' => $order_no,
  263.                 'Customer' => $this->getUser(),
  264.             ]
  265.         );
  266.         $event = new EventArgs(
  267.             [
  268.                 'Order' => $Order,
  269.             ],
  270.             $request
  271.         );
  272.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_HISTORY_INITIALIZE$event);
  273.         /** @var Order $Order */
  274.         $Order $event->getArgument('Order');
  275.         if (!$Order) {
  276.             throw new NotFoundHttpException();
  277.         }
  278.         $stockOrder true;
  279.         foreach ($Order->getOrderItems() as $orderItem) {
  280.             if ($orderItem->isProduct() && $orderItem->getQuantity() < 0) {
  281.                 $stockOrder false;
  282.                 break;
  283.             }
  284.         }
  285.         return [
  286.             'Order' => $Order,
  287.             'stockOrder' => $stockOrder,
  288.         ];
  289.     }
  290.     /**
  291.      * 再購入を行う.
  292.      *
  293.      * @Route("/mypage/order/{order_no}", name="mypage_order", methods={"PUT"})
  294.      */
  295.     public function order(Request $request$order_no)
  296.     {
  297.         $this->isTokenValid();
  298.         log_info('再注文開始', [$order_no]);
  299.         $Customer $this->getUser();
  300.         /* @var $Order \Eccube\Entity\Order */
  301.         $Order $this->orderRepository->findOneBy(
  302.             [
  303.                 'order_no' => $order_no,
  304.                 'Customer' => $Customer,
  305.             ]
  306.         );
  307.         $event = new EventArgs(
  308.             [
  309.                 'Order' => $Order,
  310.                 'Customer' => $Customer,
  311.             ],
  312.             $request
  313.         );
  314.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_INITIALIZE$event);
  315.         if (!$Order) {
  316.             log_info('対象の注文が見つかりません', [$order_no]);
  317.             throw new NotFoundHttpException();
  318.         }
  319.         // エラーメッセージの配列
  320.         $errorMessages = [];
  321.         foreach ($Order->getOrderItems() as $OrderItem) {
  322.             try {
  323.                 if ($OrderItem->getProduct() && $OrderItem->getProductClass()) {
  324.                     $this->cartService->addProduct($OrderItem->getProductClass(), $OrderItem->getQuantity());
  325.                     // 明細の正規化
  326.                     $Carts $this->cartService->getCarts();
  327.                     foreach ($Carts as $Cart) {
  328.                         $result $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart$this->getUser()));
  329.                         // 復旧不可のエラーが発生した場合は追加した明細を削除.
  330.                         if ($result->hasError()) {
  331.                             $this->cartService->removeProduct($OrderItem->getProductClass());
  332.                             foreach ($result->getErrors() as $error) {
  333.                                 $errorMessages[] = $error->getMessage();
  334.                             }
  335.                         }
  336.                         foreach ($result->getWarning() as $warning) {
  337.                             $errorMessages[] = $warning->getMessage();
  338.                         }
  339.                     }
  340.                     $this->cartService->save();
  341.                 }
  342.             } catch (CartException $e) {
  343.                 log_info($e->getMessage(), [$order_no]);
  344.                 $this->addRequestError($e->getMessage());
  345.             }
  346.         }
  347.         foreach ($errorMessages as $errorMessage) {
  348.             $this->addRequestError($errorMessage);
  349.         }
  350.         $event = new EventArgs(
  351.             [
  352.                 'Order' => $Order,
  353.                 'Customer' => $Customer,
  354.             ],
  355.             $request
  356.         );
  357.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_COMPLETE$event);
  358.         if ($event->getResponse() !== null) {
  359.             return $event->getResponse();
  360.         }
  361.         log_info('再注文完了', [$order_no]);
  362.         return $this->redirect($this->generateUrl('cart'));
  363.     }
  364.     /**
  365.      * お気に入り商品を表示する.
  366.      *
  367.      * @Route("/mypage/favorite", name="mypage_favorite", methods={"GET"})
  368.      * @Template("Mypage/favorite.twig")
  369.      */
  370.     public function favorite(Request $requestPaginatorInterface $paginator)
  371.     {
  372.         if (!$this->BaseInfo->isOptionFavoriteProduct()) {
  373.             throw new NotFoundHttpException();
  374.         }
  375.         $Customer $this->getUser();
  376.         // paginator
  377.         $qb $this->customerFavoriteProductRepository->getQueryBuilderByCustomer($Customer);
  378.         $event = new EventArgs(
  379.             [
  380.                 'qb' => $qb,
  381.                 'Customer' => $Customer,
  382.             ],
  383.             $request
  384.         );
  385.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_FAVORITE_SEARCH$event);
  386.         $pagination $paginator->paginate(
  387.             $qb,
  388.             $request->get('pageno'1),
  389.             $this->eccubeConfig['eccube_search_pmax'],
  390.             ['wrap-queries' => true]
  391.         );
  392.         return [
  393.             'pagination' => $pagination,
  394.         ];
  395.     }
  396.     /**
  397.      * お気に入り商品を削除する.
  398.      *
  399.      * @Route("/mypage/favorite/{id}/delete", name="mypage_favorite_delete", methods={"DELETE"}, requirements={"id" = "\d+"})
  400.      */
  401.     public function delete(Request $requestProduct $Product)
  402.     {
  403.         $this->isTokenValid();
  404.         $Customer $this->getUser();
  405.         log_info('お気に入り商品削除開始', [$Customer->getId(), $Product->getId()]);
  406.         $CustomerFavoriteProduct $this->customerFavoriteProductRepository->findOneBy(['Customer' => $Customer'Product' => $Product]);
  407.         if ($CustomerFavoriteProduct) {
  408.             $this->customerFavoriteProductRepository->delete($CustomerFavoriteProduct);
  409.         } else {
  410.             throw new BadRequestHttpException();
  411.         }
  412.         $event = new EventArgs(
  413.             [
  414.                 'Customer' => $Customer,
  415.                 'CustomerFavoriteProduct' => $CustomerFavoriteProduct,
  416.             ], $request
  417.         );
  418.         $this->eventDispatcher->dispatch(EccubeEvents::FRONT_MYPAGE_MYPAGE_DELETE_COMPLETE$event);
  419.         log_info('お気に入り商品削除完了', [$Customer->getId(), $CustomerFavoriteProduct->getId()]);
  420.         return $this->redirect($this->generateUrl('mypage_favorite'));
  421.     }
  422.     private function clearCartItem($user){
  423.         if ($user instanceof Customer) {
  424.             $ChainStore $user->getChainStore();
  425.             if(is_object($ChainStore)){
  426.                 $this->cartService->getCarts(true);
  427.                 $this->cartService->clear();
  428.             }
  429.         }
  430.     }
  431. }