app/Customize/Controller/Mypage/MypageController.php line 112

Open in your IDE?
  1. <?php
  2. /* ログイン画面コントローラー
  3.  * ログイン後に遷移する画面を切り替えるため新規作成
  4.  * 2023/12/15 Pico鈴木 規約変更の確認画面 Route=help_new_agreementに飛ばすため修正
  5.  * 2024/05/21 Pico鈴木 購入履歴から再購入したときにノベルティまで再購入対象になる問題を修正
  6.  * 2026/10/09 Pico鈴木 ログイン済判定によりログイン後イベントページへの遷移ができなくなっていたため修正
  7.  */
  8. namespace Customize\Controller\Mypage;
  9. use Customize\Repository\EventLogRepository;
  10. use Customize\Repository\EigyoRepository;
  11. use Customize\Repository\QRCodeMikiRepository;
  12. use Eccube\Controller\AbstractController;
  13. use Eccube\Entity\Customer;
  14. use Eccube\Entity\Order;
  15. use Eccube\Event\EccubeEvents;
  16. use Eccube\Event\EventArgs;
  17. use Eccube\Form\Type\Front\CustomerLoginType;
  18. use Eccube\Repository\CustomerRepository;
  19. use Eccube\Repository\OrderRepository;
  20. use Eccube\Service\CartService;
  21. use Eccube\Service\PurchaseFlow\PurchaseContext;
  22. use Eccube\Service\PurchaseFlow\PurchaseFlow;
  23. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\RequestStack;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  28. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  29. use Symfony\Component\HttpFoundation\RedirectResponse;
  30. class MypageController extends AbstractController
  31. {
  32.     /**
  33.      * @var CartService
  34.      */
  35.     protected $cartService;
  36.     /**
  37.      * @var OrderRepository
  38.      */
  39.     protected $orderRepository;
  40.     /**
  41.      * @var PurchaseFlow
  42.      */
  43.     protected $purchaseFlow;
  44.     /**
  45.      * @var RequestStack
  46.      */
  47.     protected $requestStack;
  48.     /**
  49.      * @var CustomerRepository
  50.      */
  51.     protected $customerRepository;
  52.     /**
  53.      * @var EventLogRepository
  54.      */
  55.     protected $eventLogRepository;
  56.     /**
  57.      * @var EigyoRepository
  58.      */
  59.     protected $eigyoRepository;
  60.     /**
  61.      * @var QRCodeMikiRepository
  62.      */
  63.     protected $qrcodeMikiRepository;
  64.     /**
  65.     * MypageController constructor.
  66.     *
  67.     * @param OrderRepository $orderRepository
  68.     * @param CartService $cartService
  69.     * @param PurchaseFlow $purchaseFlow
  70.     * @param RequestStack $requestStack
  71.     * @param CustomerRepository $customerRepository
  72.     * @param EventLogRepository $eventLogRepository
  73.     * @param EigyoRepository $eigyoRepository
  74.     */
  75.     public function __construct(
  76.         OrderRepository $orderRepository,
  77.         CartService $cartService,
  78.         PurchaseFlow $purchaseFlow,
  79.         RequestStack $requestStack,
  80.         CustomerRepository $customerRepository,
  81.         EventLogRepository $eventLogRepository,
  82.         EigyoRepository $eigyoRepository,
  83.         QRCodeMikiRepository $qrcodeMikiRepository
  84.     )
  85.     {
  86.         $this->orderRepository = $orderRepository;
  87.         $this->cartService = $cartService;
  88.         $this->purchaseFlow = $purchaseFlow;
  89.         $this->requestStack = $requestStack;
  90.         $this->customerRepository = $customerRepository;
  91.         $this->eventLogRepository = $eventLogRepository;
  92.         $this->eigyoRepository = $eigyoRepository;
  93.         $this->qrcodeMikiRepository = $qrcodeMikiRepository;
  94.     }
  95.     /**
  96.      * ログイン画面.
  97.      *
  98.      * @Route("/mypage/login", name="mypage_login", methods={"GET", "POST"})
  99.      * @Template("Mypage/login.twig")
  100.      */
  101.     public function login(Request $request, AuthenticationUtils $utils)
  102.     {
  103.         if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
  104.             log_info('認証済のためログイン処理をスキップ');
  105.             if ($request->getMethod() === 'GET') {
  106.                 //URLに引数がある場合
  107.                 $redirect = NULL;
  108.                 switch (TRUE)
  109.                 {
  110.                     case $request->get('BS'):
  111.                         //$redirect = '/mypage/redirect/';
  112.                         $redirect = $this->generateUrl('help_new_agreement', ['id' => '1'], UrlGeneratorInterface::ABSOLUTE_URL);
  113.                         return new RedirectResponse($redirect);
  114.                         break;
  115.                     case $request->get('event_id') == 1:
  116.                         //$redirect = '/mypage/event';
  117.                         $redirect = $this->generateUrl('help_new_agreement', ['id' => '3'], UrlGeneratorInterface::ABSOLUTE_URL);
  118.                         return new RedirectResponse($redirect);
  119.                         break;
  120.                     default:
  121.                         return $this->redirectToRoute('mypage');
  122.                 }
  123.             } else {
  124.                 //URLに引数がない場合
  125.                 return $this->redirectToRoute('mypage');
  126.                 //return $this->redirectToRoute('homepage');
  127.             }
  128.         }
  129.         //Cookie削除 Logout後に本ページが表示されるためこの処理で削除する
  130.         setcookie('ec', '', time() - 3600, '/');
  131.         setcookie('ec_wp', '', time() - 3600, '/');
  132.         /* @var $form \Symfony\Component\Form\FormInterface */
  133.         $builder = $this->formFactory
  134.             ->createNamedBuilder('', CustomerLoginType::class);
  135.         $builder->get('login_memory')->setData((bool) $request->getSession()->get('_security.login_memory'));
  136.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  137.             $Customer = $this->getUser();
  138.             if ($Customer instanceof Customer) {
  139.                 $builder->get('login_email')
  140. //                    ->setData($Customer->getEmail());
  141.                     ->setData($Customer->getHostKono());
  142.             }
  143.         }
  144.         $event = new EventArgs(
  145.             [
  146.                 'builder' => $builder,
  147.             ],
  148.             $request
  149.         );
  150.         $this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_LOGIN_INITIALIZE);
  151.         $form = $builder->getForm();
  152.         // ログイン前の画面へ戻す
  153.         $error = $utils->getLastAuthenticationError();
  154.         if (!$error) {
  155.             $redirect = NULL;
  156.             if ($request->getMethod() === 'GET') {
  157.                 switch (TRUE)
  158.                 {
  159.                     case $request->get('BS'):
  160.                         //$redirect = '/mypage/redirect/';
  161.                         $redirect = $this->generateUrl('help_new_agreement', ['id' => '1'], UrlGeneratorInterface::ABSOLUTE_URL);
  162.                         break;
  163.                     case $request->get('event_id') == 1:
  164.                         //$redirect = '/mypage/event';
  165.                         $redirect = $this->generateUrl('help_new_agreement', ['id' => '3'], UrlGeneratorInterface::ABSOLUTE_URL);
  166.                         break;
  167.                 }
  168.             }
  169.             if (empty($redirect))
  170.             {
  171.                 // ログインエラーがなければ戻り先をセット
  172.                 //$referer = $request->headers->get('referer');
  173.                 $referer = $request->getSession()->get('_security.customer.target_path');
  174.                 if ($referer) {
  175.                     // refererチェック
  176.                     $referers = parse_url($referer);
  177.                     if ($referers['host'] == $request->getHost()) {
  178.                         // ホストが同一であればrefererをセット
  179.                         $requestStackUri = $this->requestStack->getMasterRequest()->getUri();
  180.                         if ($request->getUri() == $requestStackUri) {
  181.                             // ログイン画面遷移直前のuriをセット
  182.                             if (preg_match('/products/', $referer))
  183.                             {
  184.                                 //$redirect = $referer;
  185.                                 $arr = explode("/", $referers['path']);
  186.                                 $productCd = $arr[count($arr)-1];
  187.                                 $redirect = $this->generateUrl('help_new_agreement', ['id' => '2', 'productCd' => $productCd], UrlGeneratorInterface::ABSOLUTE_URL);
  188.                             }
  189.                         } else {
  190.                             // ログイン必須画面のuriをセット
  191.                             $redirect = $requestStackUri;
  192.                         }
  193.                     }
  194.                 }
  195.             }
  196.             if (empty($redirect))
  197.             {
  198.                 //$redirect = 'homepage';
  199.                 $this->generateUrl('help_new_agreement', ['id' => '0'], UrlGeneratorInterface::ABSOLUTE_URL);
  200.             }
  201.             $this->setLoginTargetPath($redirect);
  202.         }
  203.         return [
  204.             'error' => $error,
  205.             'form' => $form->createView(),
  206.         ];
  207.     }
  208.     /**
  209.      * loginリダイレクト 会員専用ページ
  210.      * @Route("/mypage/redirect/", name="mypage_redirect", methods={"GET"})
  211.      * @Template("Mypage/redirect.twig")
  212.      */
  213.     public function mypageRedirect(Request $request)
  214.     {
  215.         
  216.         $Customer = $this->getUser();
  217.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED'))
  218.         {
  219.             $redirect = null;
  220.             switch ($this->getUser()->getBc()->getId())
  221.             {
  222.                 case $this->eccubeConfig['eccube_bckbn1']:
  223.                     //URLが同じだとキャッシュが表示されるのでタイムスタンプを付与する
  224.                     $redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
  225.                     break;
  226.                 case $this->eccubeConfig['eccube_bckbn2']:
  227.                     $redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
  228.                     break;
  229.                 case $this->eccubeConfig['eccube_bckbn5']:
  230.                     $redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
  231.                     break;
  232.                 case $this->eccubeConfig['eccube_bckbn6']:
  233.                     $redirect = $this->eccubeConfig['eccube_bckbn1_url'] . '?' . time();
  234.                     break;
  235.             }
  236.         }
  237.         return[
  238.             'url' => $redirect
  239.         ];
  240.     }
  241.     /**
  242.      * loginリダイレクト イベントページ
  243.      * カード会員募集イベントでアクセスログを取得後、オリコのカード募集ページにリダイレクト
  244.      * @Route("/mypage/event/", name="mypage_event", methods={"GET"})
  245.      * @Template("Mypage/redirect.twig")
  246.     */
  247.     public function mypageEvent(Request $request)
  248.     {
  249.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED'))
  250.         {
  251.             $Customer = $this->getUser();
  252.             $EventLog = new \Customize\Entity\EventLog;
  253.             $EventLog->setEventId(1)
  254.                      ->setAccessDt(new \DateTime())
  255.                      ->setHostKono($Customer->getHostKono())
  256.                      ->setSibuCd($Customer->getSibu()->getSibuCd())
  257.                      ->setEigyoCd($Customer->getEigyoCd())
  258.                      ->setBiko('新メンバーズカード');
  259.             $this->eventLogRepository->save($EventLog);
  260.         }
  261.         return[
  262.             'url' => $this->eccubeConfig['eccube_event1_url']
  263.         ];
  264.     }
  265.     
  266.     /**
  267.      * 再購入を行う.
  268.      * 2024/05/21 Pico鈴木 再購入時にはノベルティを削除する
  269.      * @Route("/mypage/order/{order_no}", name="mypage_order", methods={"PUT"})
  270.      */
  271.     public function order(Request $request, $order_no)
  272.     {
  273.         $this->isTokenValid();
  274.         log_info('再注文開始', [$order_no]);
  275.         $Customer = $this->getUser();
  276.         /* @var $Order \Eccube\Entity\Order */
  277.         $Order = $this->orderRepository->findOneBy(
  278.             [
  279.                 'order_no' => $order_no,
  280.                 'Customer' => $Customer,
  281.             ]
  282.         );
  283.         $event = new EventArgs(
  284.             [
  285.                 'Order' => $Order,
  286.                 'Customer' => $Customer,
  287.             ],
  288.             $request
  289.         );
  290.         $this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_INITIALIZE);
  291.         if (!$Order) {
  292.             log_info('対象の注文が見つかりません', [$order_no]);
  293.             throw new NotFoundHttpException();
  294.         }
  295.         // エラーメッセージの配列
  296.         $errorMessages = [];
  297.         foreach ($Order->getOrderItems() as $OrderItem) {
  298.             try {
  299.                 if ($OrderItem->getProduct() && $OrderItem->getProductClass()) {
  300.                     //ノベルティ削除(商品明細行で価格が0はノベルティと判断)
  301.                     if ($OrderItem->isProduct() && $OrderItem->getPrice() == 0) {
  302.                         log_info('ノベルティ(' . $OrderItem->getProductName() . ')を再購入対象から除外', [$order_no]);
  303.                         continue;
  304.                     }
  305.                     $this->cartService->addProduct($OrderItem->getProductClass(), $OrderItem->getQuantity());
  306.                     // 明細の正規化
  307.                     $Carts = $this->cartService->getCarts();
  308.                     foreach ($Carts as $Cart) {
  309.                         $result = $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart, $this->getUser()));
  310.                         // 復旧不可のエラーが発生した場合は追加した明細を削除.
  311.                         if ($result->hasError()) {
  312.                             $this->cartService->removeProduct($OrderItem->getProductClass());
  313.                             foreach ($result->getErrors() as $error) {
  314.                                 $errorMessages[] = $error->getMessage();
  315.                             }
  316.                         }
  317.                         foreach ($result->getWarning() as $warning) {
  318.                             $errorMessages[] = $warning->getMessage();
  319.                         }
  320.                     }
  321.                     $this->cartService->save();
  322.                 }
  323.             } catch (CartException $e) {
  324.                 log_info($e->getMessage(), [$order_no]);
  325.                 $this->addRequestError($e->getMessage());
  326.             }
  327.         }
  328.         foreach ($errorMessages as $errorMessage) {
  329.             $this->addRequestError($errorMessage);
  330.         }
  331.         $event = new EventArgs(
  332.             [
  333.                 'Order' => $Order,
  334.                 'Customer' => $Customer,
  335.             ],
  336.             $request
  337.         );
  338.         $this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_ORDER_COMPLETE);
  339.         if ($event->getResponse() !== null) {
  340.             return $event->getResponse();
  341.         }
  342.         log_info('再注文完了', [$order_no]);
  343.         return $this->redirect($this->generateUrl('cart'));
  344.     }
  345.     
  346. }