src/Eccube/Controller/Mypage/DeliveryController.php line 65

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 Eccube\Controller\Mypage;
  13. use Customize\Form\Type\Front\CustomerAddressType;
  14. use Eccube\Controller\AbstractController;
  15. use Eccube\Entity\BaseInfo;
  16. use Eccube\Entity\CustomerAddress;
  17. use Eccube\Event\EccubeEvents;
  18. use Eccube\Event\EventArgs;
  19. use Eccube\Repository\BaseInfoRepository;
  20. use Eccube\Repository\CustomerAddressRepository;
  21. use Eccube\Service\MailService;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  25. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. class DeliveryController extends AbstractController
  28. {
  29.     /**
  30.      * @var BaseInfo
  31.      */
  32.     protected $BaseInfo;
  33.     /**
  34.      * @var CustomerAddressRepository
  35.      */
  36.     protected $customerAddressRepository;
  37.     /**
  38.      * @var MailService
  39.      */
  40.     protected $mailService;
  41.     public function __construct(
  42.         BaseInfoRepository $baseInfoRepository,
  43.         CustomerAddressRepository $customerAddressRepository,
  44.         MailService $mailService
  45.     )
  46.     {
  47.         $this->BaseInfo $baseInfoRepository->get();
  48.         $this->customerAddressRepository $customerAddressRepository;
  49.         $this->mailService $mailService;
  50.     }
  51.     /**
  52.      * お届け先一覧画面.
  53.      *
  54.      * @Route("/mypage/delivery", name="mypage_delivery", methods={"GET"})
  55.      * @Template("Mypage/delivery.twig")
  56.      */
  57.     public function index(Request $request)
  58.     {
  59.         $Customer $this->getUser();
  60.         return [
  61.             'Customer' => $Customer,
  62.         ];
  63.     }
  64.     /**
  65.      * お届け先編集画面.
  66.      *
  67.      * @Route("/mypage/delivery/new", name="mypage_delivery_new", methods={"GET", "POST"})
  68.      * @Route("/mypage/delivery/{id}/edit", name="mypage_delivery_edit", requirements={"id" = "\d+"}, methods={"GET", "POST"})
  69.      * @Template("Mypage/delivery_edit.twig")
  70.      */
  71.     public function edit(Request $request$id null)
  72.     {
  73.         $Customer $this->getUser();
  74.         // 配送先住所最大値判定
  75.         // $idが存在する際は、追加処理ではなく、編集の処理ため本ロジックスキップ
  76.         if (is_null($id)) {
  77.             $addressCurrNum count($Customer->getCustomerAddresses());
  78.             $addressMax $this->eccubeConfig['eccube_deliv_addr_max'];
  79.             if ($addressCurrNum >= $addressMax) {
  80.                 throw new NotFoundHttpException();
  81.             }
  82.             $CustomerAddress = new CustomerAddress();
  83.             $CustomerAddress->setCustomer($Customer);
  84.         } else {
  85.             $CustomerAddress $this->customerAddressRepository->findOneBy(
  86.                 [
  87.                     'id' => $id,
  88.                     'Customer' => $Customer,
  89.                 ]
  90.             );
  91.             if (!$CustomerAddress) {
  92.                 throw new NotFoundHttpException();
  93.             }
  94.         }
  95.         $parentPage $request->get('parent_page'null);
  96.         // 正しい遷移かをチェック
  97.         $allowedParents = [
  98.             $this->generateUrl('mypage_delivery'),
  99.             $this->generateUrl('shopping_redirect_to'),
  100.         ];
  101.         // 遷移が正しくない場合、デフォルトであるマイページの配送先追加の画面を設定する
  102.         if (!in_array($parentPage$allowedParents)) {
  103.             // @deprecated 使用されていないコード
  104.             $parentPage $this->generateUrl('mypage_delivery');
  105.         }
  106.         $builder $this->formFactory
  107.             ->createBuilder(CustomerAddressType::class, $CustomerAddress);
  108.         $event = new EventArgs(
  109.             [
  110.                 'builder' => $builder,
  111.                 'Customer' => $Customer,
  112.                 'CustomerAddress' => $CustomerAddress,
  113.             ],
  114.             $request
  115.         );
  116.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_DELIVERY_EDIT_INITIALIZE);
  117.         $form $builder->getForm();
  118.         $form->handleRequest($request);
  119.         if ($form->isSubmitted() && $form->isValid()) {
  120.             log_info('お届け先登録開始', [$id]);
  121.             $this->entityManager->persist($CustomerAddress);
  122.             $this->entityManager->flush();
  123.             // 会員情報変更時にメールを送信
  124.             if($this->BaseInfo->isOptionMailNotifier()) {
  125.                 // 情報のセット
  126.                 $userData['userAgent'] = $request->headers->get('User-Agent');
  127.                 $userData['ipAddress'] = $request->getClientIp();
  128.                 $this->mailService->sendCustomerChangeNotifyMail($Customer$userDatatrans('front.mypage.delivery.notify_title'));
  129.             }
  130.             log_info('お届け先登録完了', [$id]);
  131.             $event = new EventArgs(
  132.                 [
  133.                     'form' => $form,
  134.                     'Customer' => $Customer,
  135.                     'CustomerAddress' => $CustomerAddress,
  136.                 ],
  137.                 $request
  138.             );
  139.             $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_DELIVERY_EDIT_COMPLETE);
  140.             return $this->redirect($this->generateUrl('mypage_delivery'));
  141.         }
  142.         return [
  143.             'form' => $form->createView(),
  144.             'parentPage' => $parentPage,
  145.             'BaseInfo' => $this->BaseInfo,
  146.         ];
  147.     }
  148.     /**
  149.      * お届け先を削除する.
  150.      *
  151.      * @Route("/mypage/delivery/{id}/delete", name="mypage_delivery_delete", methods={"DELETE"})
  152.      */
  153.     public function delete(Request $requestCustomerAddress $CustomerAddress)
  154.     {
  155.         $this->isTokenValid();
  156.         log_info('お届け先削除開始', [$CustomerAddress->getId()]);
  157.         $Customer $this->getUser();
  158.         if ($Customer->getId() != $CustomerAddress->getCustomer()->getId()) {
  159.             throw new BadRequestHttpException();
  160.         }
  161.         $this->customerAddressRepository->delete($CustomerAddress);
  162.         $event = new EventArgs(
  163.             [
  164.                 'Customer' => $Customer,
  165.                 'CustomerAddress' => $CustomerAddress,
  166.             ], $request
  167.         );
  168.         $this->eventDispatcher->dispatch($eventEccubeEvents::FRONT_MYPAGE_DELIVERY_DELETE_COMPLETE);
  169.         // 会員情報変更時にメールを送信
  170.         if($this->BaseInfo->isOptionMailNotifier()) {
  171.             // 情報のセット
  172.             $userData['userAgent'] = $request->headers->get('User-Agent');
  173.             $userData['ipAddress'] = $request->getClientIp();
  174.             $this->mailService->sendCustomerChangeNotifyMail($Customer$userDatatrans('front.mypage.delivery.notify_title'));
  175.         }
  176.         log_info('お届け先削除完了', [$CustomerAddress->getId()]);
  177.         return $this->redirect($this->generateUrl('mypage_delivery'));
  178.     }
  179. }