app/Customize/Controller/EntryController.php line 154

Open in your IDE?
  1. <?php
  2.    /**
  3.     * @version EC-CUBE4系
  4.     * @copyright 株式会社 翔 kakeru.co.jp
  5.     *
  6.     * 2021年12月22日カスタマイズ
  7.     *
  8.     * app\Customize\Controller\EntryController.php
  9.     *
  10.     * 新規会員登録 カスタマイズ
  11.     *
  12.     *
  13.     *
  14.     *                                        ≡≡≡┏(^o^)┛
  15.     *****************************************************/
  16. namespace Customize\Controller;
  17. use Customize\Service\Google\ReCaptchaService;
  18. use Customize\Service\MobileDetector as LmMobileDetector;
  19. use Eccube\Entity\BaseInfo;
  20. use Eccube\Entity\Master\CustomerStatus;
  21. use Eccube\Event\EccubeEvents;
  22. use Eccube\Event\EventArgs;
  23. #use Eccube\Form\Type\Front\EntryType;
  24. use Eccube\Repository\BaseInfoRepository;
  25. use Eccube\Repository\CustomerRepository;
  26. use Eccube\Repository\Master\CustomerStatusRepository;
  27. use Eccube\Repository\PageRepository;
  28. #use Eccube\Service\CartService;
  29. use Eccube\Service\MailService;
  30. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  31. use Symfony\Component\HttpFoundation\Request;
  32. use Symfony\Component\HttpKernel\Exception as HttpException;
  33. use Symfony\Component\Routing\Annotation\Route;
  34. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  35. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  36. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  37. use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
  38. use Symfony\Component\Validator\Constraints as Assert;
  39. use Symfony\Component\Validator\Validator\ValidatorInterface;
  40. use Customize\Form\Type\Front\EntryType;
  41. use Customize\Service\CommonService;
  42. use Customize\Converter\CustomerConverter;
  43. use Customize\Service\CartService;
  44. class EntryController extends  \Eccube\Controller\EntryController
  45. {
  46.     /**
  47.      * @var CustomerStatusRepository
  48.      */
  49.     protected $customerStatusRepository;
  50.     /**
  51.      * @var ValidatorInterface
  52.      */
  53.     protected $recursiveValidator;
  54.     /**
  55.      * @var MailService
  56.      */
  57.     protected $mailService;
  58.     /**
  59.      * @var BaseInfo
  60.      */
  61.     protected $BaseInfo;
  62.     /**
  63.      * @var CustomerRepository
  64.      */
  65.     protected $customerRepository;
  66.     /**
  67.      * @var EncoderFactoryInterface
  68.      */
  69.     protected $encoderFactory;
  70.     /**
  71.      * @var TokenStorageInterface
  72.      */
  73.     protected $tokenStorage;
  74.     /**
  75.      * @var \Eccube\Service\CartService
  76.      */
  77.     protected $cartService;
  78.     /**
  79.      * @var PageRepository
  80.      */
  81.     protected $pageRepository;
  82.     protected $CommonService;
  83.     protected $CustomerConverter;
  84.     /**
  85.      * @var LmMobileDetector
  86.      */
  87.     protected $mobileDetector;
  88.     protected $reCaptchaService;
  89.     /**
  90.      * EntryController constructor.
  91.      *
  92.      * @param CartService $cartService
  93.      * @param CustomerStatusRepository $customerStatusRepository
  94.      * @param MailService $mailService
  95.      * @param BaseInfoRepository $baseInfoRepository
  96.      * @param CustomerRepository $customerRepository
  97.      * @param EncoderFactoryInterface $encoderFactory
  98.      * @param ValidatorInterface $validatorInterface
  99.      * @param TokenStorageInterface $tokenStorage
  100.      *  @param LmMobileDetector $mobileDetector
  101.      */
  102.     public function __construct(
  103.         CartService $cartService,
  104.         CustomerStatusRepository $customerStatusRepository,
  105.         MailService $mailService,
  106.         BaseInfoRepository $baseInfoRepository,
  107.         CustomerRepository $customerRepository,
  108.         EncoderFactoryInterface $encoderFactory,
  109.         ValidatorInterface $validatorInterface,
  110.         TokenStorageInterface $tokenStorage,
  111.         PageRepository $pageRepository
  112.         ,CommonService $CommonService
  113.         ,CustomerConverter $CustomerConverter,
  114.         LmMobileDetector       $mobileDetector,
  115.         ReCaptchaService $reCaptchaService
  116.     ) {
  117.         $this->customerStatusRepository $customerStatusRepository;
  118.         $this->mailService $mailService;
  119.         $this->BaseInfo $baseInfoRepository->get();
  120.         $this->customerRepository $customerRepository;
  121.         $this->encoderFactory $encoderFactory;
  122.         $this->recursiveValidator $validatorInterface;
  123.         $this->tokenStorage $tokenStorage;
  124.         $this->cartService $cartService;
  125.         $this->pageRepository $pageRepository;
  126.         $this->CommonService $CommonService;
  127.         $this->CustomerConverter $CustomerConverter;
  128.         $this->mobileDetector $mobileDetector;
  129.         $this->reCaptchaService $reCaptchaService;
  130.     }
  131.     /**
  132.      * 会員登録画面.
  133.      *
  134.      * @Route("/regi/", name="entry", methods={"GET", "POST"})
  135.      * @Route("/regi/", name="entry_confirm", methods={"GET", "POST"})
  136.      * @Template("Entry/index.twig")
  137.      */
  138.     public function index(Request $request)
  139.     {
  140.         if ($this->isGranted('ROLE_USER')) {
  141.             log_info('認証済のためログイン処理をスキップ');
  142.             return $this->redirectToRoute('mypage');
  143.         }
  144.         $Entry $request->request->get('entry');
  145.         $RequestEmail $Entry['email'] ?? null;
  146.         $reCaptchaSiteKey $this->reCaptchaService->getReCaptchaSiteKey();
  147.         if ($RequestEmail) {
  148.             $Entry['email'] = [
  149.                 "first" => mb_convert_kana($RequestEmail['first'], 'a''UTF-8'),
  150.                 "second" => mb_convert_kana($RequestEmail['second'], 'a''UTF-8')
  151.             ];
  152.             $request->request->set('entry'$Entry);
  153.         }
  154.         /** @var $Customer \Eccube\Entity\Customer */
  155.         $Customer $this->customerRepository->newCustomer();
  156.         /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
  157.         $builder $this->formFactory->createBuilder(EntryType::class, $Customer);
  158.        // $LmBuilder = $this->formFactory->createNamedBuilder('', Lm_EntryType::class);
  159.         $event = new EventArgs(
  160.             [
  161.                 'builder' => $builder,
  162.                 'Customer' => $Customer,
  163.             ],
  164.             $request
  165.         );
  166.         $this->eventDispatcher->dispatch($event,EccubeEvents::FRONT_ENTRY_INDEX_INITIALIZE );
  167.         /* @var $form \Symfony\Component\Form\FormInterface */
  168.         $form $builder->getForm();
  169.         #kakeru ここまでしないと初期と初期値を登録できない
  170.         if (is_null($request->request->get('entry'))){
  171.         //$melmaga = $req['customer_melmaga'] ?? 1;
  172.              $form->get('customer_melmaga')->setData(true);
  173.          }
  174.         $form->handleRequest($request);
  175.         if ($form->isSubmitted()) {
  176.             if (!$form->isValid()) {
  177.                 $errors $this->collectFormErrors($form);
  178.                 $request->getSession()->getFlashBag()->add('form_debug'json_encode($errorsJSON_UNESCAPED_UNICODE JSON_UNESCAPED_SLASHES));
  179.             }
  180.             $this->isTokenValid();
  181.             if ($form->isValid()) {
  182.                 switch ($request->get('mode')) {
  183.                     case 'confirm':
  184.                         $this->reCaptchaService->handleRequest($request);
  185.                         log_info('会員登録確認開始');
  186.                         log_info('会員登録確認完了');
  187.                         return $this->render(
  188.                             'Entry/confirm.twig',
  189.                             [
  190.                                 'form' => $form->createView(),
  191.                                 'Page' => $this->pageRepository->getPageByRoute('entry_confirm'),
  192.                                 'BreadCrumbs' => [],
  193.                                 'reCaptchaSiteKey' => $reCaptchaSiteKey,
  194.                                 'path_info' => $request->getPathInfo(),
  195.                                 'customer_type' => $form->get('customer_type')->getData()
  196.                             ]
  197.                         );
  198.                     case 'complete':
  199.                         $this->reCaptchaService->handleRequest($request);
  200.                         log_info('会員登録開始');
  201.                         $encoder $this->encoderFactory->getEncoder($Customer);
  202.                         $salt $encoder->createSalt();
  203.                         $password $encoder->encodePassword($Customer->getPassword(), $salt);
  204.                         $secretKey $this->customerRepository->getUniqueSecretKey();
  205.                         $Datas $form->getData();
  206.                         
  207.                         // Get company type to determine which fields to save
  208.                         $customerType $form->get('customer_type')->getData();
  209.                         // Set custom fields on dtb_customer (entity extension)
  210.                         $companyKana $form->get('customer_company_kana')->getData();
  211.                         $lastNameKana $form->get('customer_last_name_kana')->getData();
  212.                         $mobileNumber $form->get('customer_mobile_number')->getData();
  213.                         $uniformUsage $form->get('customer_uniform_usage')->getData();
  214.                         $uniformUsageOther null;
  215.                         if (is_array($uniformUsage) && in_array('8'$uniformUsage)) {
  216.                             $uniformUsageOther $form->get('customer_uniform_usage_other')->getData();
  217.                         }
  218.                         $Tel $form->get('phone_number')->getData();
  219.                         $Customer
  220.                             ->setSalt($salt)
  221.                             ->setPassword($password)
  222.                             ->setSecretKey($secretKey)
  223.                             ->setPoint(0)
  224.                             ->setPhoneNumber($Tel)
  225.                             ->setName02('');
  226.                         
  227.                         $Customer->setCompanyKana($companyKana);
  228.                         $Customer->setLastNameKana($lastNameKana);
  229.                         $Customer->setMobileNumber($mobileNumber);
  230.                         // Multi-selects saved as comma-separated strings in dtb_customer
  231.                         $Customer->setUniformUsageOther($uniformUsageOther);
  232.                         
  233.                         // Get uniform replacement frequency for all users (required field)
  234.                         $uniformFreq $form->get('customer_uniform_replacement_frequency')->getData();
  235.                         $Customer->setUniformReplacementFrequency($uniformFreq);
  236.                         $Customer->setCustomerType($customerType);
  237.                         
  238.                         // Only save job-related fields if not individual (customer_type != '3')
  239.                         if ($customerType !== '3') {
  240.                             $usage $form->get('customer_uniform_usage')->getData();
  241.                             $jobCategory $form->get('job_category')->getData();
  242.                             $jobSubcategory $form->get('job_subcategory')->getData();
  243.                             
  244.                             $Customer->setUniformUsage(is_array($usage) ? implode(','$usage) : $usage);
  245.                             $Customer->setJobCategory($jobCategory);
  246.                             $Customer->setJobSubcategory($jobSubcategory);
  247.                         } else {
  248.                             // For individual users, set empty values for job fields only
  249.                             $Customer->setUniformUsage('');
  250.                             $Customer->setJobCategory('');
  251.                             $Customer->setJobSubcategory('');
  252.                         }
  253.                         $this->entityManager->persist($Customer);
  254.                         $this->entityManager->flush();
  255.                         #2021/12/23 LMDATAを渡す
  256.                         $Columns $this->CommonService->GetYaml('LmCustomer.yaml');
  257.                         foreach ($Columns as $Column) {
  258.                             switch ($Column) {
  259.                                 case 'customer_melmaga':
  260.                                     $LmDatas[$Column] = $form->get('customer_melmaga')->getData() ?? 0;
  261.                                     break;
  262.                                 case 'customer_cart_follow':
  263.                                 case 'customer_review_request':
  264.                                     $LmDatas[$Column] = 1;
  265.                                     break;
  266.                                 case 'customer_uniform_usage':
  267.                                 case 'customer_uniform_replacement_frequency':
  268.                                 case 'job_category':
  269.                                 case 'job_subcategory':
  270.                                     // Only save job-related fields if not individual
  271.                                     if ($customerType !== '3') {
  272.                                         $LmDatas[$Column] = $form->get($Column)->getData();
  273.                                     } else {
  274.                                         $LmDatas[$Column] = '';
  275.                                     }
  276.                                     break;
  277.                                 case 'customer_type':
  278.                                     $LmDatas[$Column] = $customerType;
  279.                                     break;
  280.                                 default:
  281.                                     $LmDatas[$Column] = $form->get($Column)->getData();
  282.                             }
  283.                         }
  284.                         $LmCustomerId $this->CustomerConverter->SetCustomer($Customer$LmDatas);
  285.                         $Customer->setLmCustomerId($LmCustomerId);
  286.                         $this->entityManager->persist($Customer);
  287.                         $this->entityManager->flush();
  288.                         log_info('会員登録完了');
  289.                         $event = new EventArgs(
  290.                             [
  291.                                 'form' => $form,
  292.                                 'Customer' => $Customer,
  293.                             ],
  294.                             $request
  295.                         );
  296.                         $this->eventDispatcher->dispatch($event,EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE);
  297.                         $activateFlg $this->BaseInfo->isOptionCustomerActivate();
  298.                         // 仮会員設定が有効な場合は、確認メールを送信し完了画面表示.
  299.                         if ($activateFlg) {
  300.                             $activateUrl $this->generateUrl('entry_activate', ['secret_key' => $Customer->getSecretKey()], UrlGeneratorInterface::ABSOLUTE_URL);
  301.                             // メール送信
  302.                             $this->mailService->sendCustomerConfirmMail($Customer$activateUrl);
  303.                             if ($event->hasResponse()) {
  304.                                 return $event->getResponse();
  305.                             }
  306.                             log_info('仮会員登録完了画面へリダイレクト');
  307.                             return $this->redirectToRoute('entry_complete');
  308.                         } else {
  309.                             // 仮会員設定が無効な場合は、会員登録を完了させる.
  310.                             $qtyInCart $this->entryActivate($request$Customer->getSecretKey());
  311.                             $redirect $request->query->get('redirect');
  312.                             if (in_array($redirect, ['cart''shopping'])) {
  313.                                 return $this->redirectToRoute($redirect);
  314.                             }
  315.                             #2022/11/29
  316.                             if ($this->cartService->GetCartType()) {
  317.                                 return $this->redirectToRoute('shopping');
  318.                             }
  319.                             // URLを変更するため完了画面にリダイレクト
  320.                             return $this->redirectToRoute('entry_activate', [
  321.                                 'secret_key' => $Customer->getSecretKey(),
  322.                                 'qtyInCart' => $qtyInCart,
  323.                                 'BreadCrumbs' => [],
  324.                             ]);
  325.                         }
  326.                 }
  327.             }
  328.         }
  329.         $route $request->get('_route');
  330.         $isLogin $route === 'shopping_entry';
  331.         $isRegister $route === 'entry';
  332.         // Load job categories data from JSON
  333.         $jobCategoriesData $this->loadJobCategoriesData();
  334.         
  335.         return [
  336.             'form' => $form->createView(),
  337.             'BreadCrumbs' => [],
  338.             'isMobile' => $this->mobileDetector->isMobile(),
  339.             'isLogin' => $isLogin,
  340.             'isRegister' => $isRegister,
  341.             'reCaptchaSiteKey' => $reCaptchaSiteKey,
  342.             'jobCategoriesData' => $jobCategoriesData
  343.          ];
  344.     }
  345.     /**
  346.      * 会員登録画面.
  347.      *
  348.      * @Route("/shopping/regi/", name="shopping_entry", methods={"GET", "POST"})
  349.      * @Template("Entry/index.twig")
  350.      */
  351.     public function shoppingEntry(Request $request)
  352.     {
  353.         if ($this->isGranted('ROLE_USER')) {
  354.             log_info('認証済のためログイン処理をスキップ');
  355.             return $this->redirectToRoute('mypage');
  356.         }
  357.         $Entry $request->request->get('entry');
  358.         $RequestEmail = (isset($Entry) && is_array($Entry) && isset($Entry['email'])) ? $Entry['email'] : null;
  359.         if ($RequestEmail) {
  360.             $Entry['email'] = [
  361.                 "first" => mb_convert_kana($RequestEmail['first'], 'a''UTF-8'),
  362.                 "second" => mb_convert_kana($RequestEmail['second'], 'a''UTF-8')
  363.             ];
  364.             $request->request->set('entry'$Entry);
  365.         }
  366.         /** @var $Customer \Eccube\Entity\Customer */
  367.         $Customer $this->customerRepository->newCustomer();
  368.         /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
  369.         $builder $this->formFactory->createBuilder(EntryType::class, $Customer);
  370.         $event = new EventArgs(
  371.             [
  372.                 'builder' => $builder,
  373.                 'Customer' => $Customer,
  374.             ],
  375.             $request
  376.         );
  377.         $this->eventDispatcher->dispatch($event,EccubeEvents::FRONT_ENTRY_INDEX_INITIALIZE );
  378.         /* @var $form \Symfony\Component\Form\FormInterface */
  379.         $form $builder->getForm();
  380.         #kakeru ここまでしないと初期と初期値を登録できない
  381.         if (is_null($request->request->get('entry'))){
  382.         //$melmaga = $req['customer_melmaga'] ?? 1;
  383.              $form->get('customer_melmaga')->setData(true);
  384.          }
  385.         $form->handleRequest($request);
  386.         if ($form->isSubmitted() && $form->isValid()) {
  387.             switch ($request->get('mode')) {
  388.                 case 'confirm':
  389.                     log_info('会員登録確認開始');
  390.                     log_info('会員登録確認完了');
  391.                     return $this->render(
  392.                         'Entry/confirm.twig',
  393.                         [
  394.                             'form' => $form->createView(),
  395.                             'Page' => $this->pageRepository->getPageByRoute('entry_confirm'),
  396.                             'BreadCrumbs' => [],
  397.                             'path_info' => $request->getPathInfo(),
  398.                             'customer_type' => $form->get('customer_type')->getData()
  399.                         ]
  400.                     );
  401.                 case 'complete':
  402.                     log_info('会員登録開始');
  403.                     $encoder $this->encoderFactory->getEncoder($Customer);
  404.                     $salt $encoder->createSalt();
  405.                     $password $encoder->encodePassword($Customer->getPassword(), $salt);
  406.                     $secretKey $this->customerRepository->getUniqueSecretKey();
  407.                     $Datas$form->getData();
  408.                     $Tel $form->get('phone_number')->getData();
  409.                     $Customer
  410.                         ->setSalt($salt)
  411.                         ->setPassword($password)
  412.                         ->setSecretKey($secretKey)
  413.                         ->setPoint(0)
  414.                         ->setPhoneNumber($Tel)
  415.                         ->setName02('');
  416.                     // Get company type to determine which fields to save
  417.                     $customerType $form->get('customer_type')->getData();
  418.                     
  419.                     // Set custom fields on dtb_customer (entity extension)
  420.                     $Customer->setCompanyKana($form->get('customer_company_kana')->getData());
  421.                     $Customer->setLastNameKana($form->get('customer_last_name_kana')->getData());
  422.                     $Customer->setMobileNumber($form->get('customer_mobile_number')->getData());
  423.                     // Multi-selects saved as comma-separated strings in dtb_customer
  424.                     $uniformUsage $form->get('customer_uniform_usage')->getData();
  425.                     $uniformUsageOther null;
  426.                     if (is_array($uniformUsage) && in_array('8'$uniformUsage)) {
  427.                         $uniformUsageOther $form->get('customer_uniform_usage_other')->getData();
  428.                     }
  429.                     $Customer->setUniformUsageOther($uniformUsageOther);
  430.                     
  431.                     // Get uniform replacement frequency for all users (required field)
  432.                     $uniformFreq $form->get('customer_uniform_replacement_frequency')->getData();
  433.                     $Customer->setUniformReplacementFrequency($uniformFreq);
  434.                     $Customer->setCustomerType($customerType);
  435.                     
  436.                     // Only save job-related fields if not individual (customer_type != '3')
  437.                     if ($customerType !== '3') {
  438.                         $usage $form->get('customer_uniform_usage')->getData();
  439.                         $jobCategory $form->get('job_category')->getData();
  440.                         $jobSubcategory $form->get('job_subcategory')->getData();
  441.                         
  442.                         $Customer->setUniformUsage(is_array($usage) ? implode(','$usage) : $usage);
  443.                         $Customer->setJobCategory($jobCategory);
  444.                         $Customer->setJobSubcategory($jobSubcategory);
  445.                     } else {
  446.                         // For individual users, set empty values for job fields only
  447.                         $Customer->setUniformUsage('');
  448.                         $Customer->setJobCategory('');
  449.                         $Customer->setJobSubcategory('');
  450.                     }
  451.                     $this->entityManager->persist($Customer);
  452.                     $this->entityManager->flush();
  453.                     #2021/12/23 LMDATAを渡す
  454.                     $Columns $this->CommonService->GetYaml('LmCustomer.yaml');
  455.                     foreach ( $Columns  as $Column){
  456.                         switch ($Column){
  457.                         case 'customer_melmaga':
  458.                             $LmDatas[$Column]= $form->get('customer_melmaga')->getData() ?? ;
  459.                             break;
  460.                         case 'customer_cart_follow':
  461.                         case 'customer_review_request':
  462.                             $LmDatas[$Column] = 1;
  463.                         break;
  464.                         case 'customer_uniform_usage':
  465.                         case 'customer_uniform_replacement_frequency':
  466.                         case 'job_category':
  467.                         case 'job_subcategory':
  468.                             // Only save job-related fields if not individual
  469.                             if ($customerType !== '3') {
  470.                                 $LmDatas[$Column] = $form->get($Column)->getData();
  471.                             } else {
  472.                                 $LmDatas[$Column] = '';
  473.                             }
  474.                             break;
  475.                         case 'customer_type':
  476.                             $LmDatas[$Column] = $customerType;
  477.                             break;
  478.                         default:
  479.                             $LmDatas[$Column]= $form->get($Column)->getData();
  480.                         }
  481.                     }
  482.                     $LmCustomerId =$this->CustomerConverter->SetCustomer($Customer,$LmDatas);
  483.                     $Customer->setLmCustomerId($LmCustomerId);
  484.                     $this->entityManager->persist($Customer);
  485.                     $this->entityManager->flush();
  486.                     log_info('会員登録完了');
  487.                     $event = new EventArgs(
  488.                         [
  489.                             'form' => $form,
  490.                             'Customer' => $Customer,
  491.                         ],
  492.                         $request
  493.                     );
  494.                     $this->eventDispatcher->dispatch($event,EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE, );
  495.                     $activateFlg $this->BaseInfo->isOptionCustomerActivate();
  496.                     // 仮会員設定が有効な場合は、確認メールを送信し完了画面表示.
  497.                     if ($activateFlg) {
  498.                         $activateUrl $this->generateUrl('entry_activate', ['secret_key' => $Customer->getSecretKey()], UrlGeneratorInterface::ABSOLUTE_URL);
  499.                         // メール送信
  500.                         $this->mailService->sendCustomerConfirmMail($Customer$activateUrl);
  501.                         if ($event->hasResponse()) {
  502.                             return $event->getResponse();
  503.                         }
  504.                         log_info('仮会員登録完了画面へリダイレクト');
  505.                         return $this->redirectToRoute('entry_complete');
  506.                     } else {
  507.                         // 仮会員設定が無効な場合は、会員登録を完了させる.
  508.                         $qtyInCart $this->entryActivate($request$Customer->getSecretKey());
  509.                         $redirect $request->query->get('redirect');
  510.                         if (in_array($redirect, ['cart''shopping'])) {
  511.                             return $this->redirectToRoute($redirect);
  512.                         }
  513.                         #2022/11/29
  514.                         if($this->cartService->GetCartType()){
  515.                             return $this->redirectToRoute('shopping');
  516.                         }
  517.                         // URLを変更するため完了画面にリダイレクト
  518.                         return $this->redirectToRoute('entry_activate', [
  519.                             'secret_key' => $Customer->getSecretKey(),
  520.                             'qtyInCart' => $qtyInCart,
  521.                             'BreadCrumbs' => [],
  522.                         ]);
  523.                     }
  524.             }
  525.         }
  526.         if ($form->isSubmitted() && !$form->isValid()) {
  527.             $errors $this->collectFormErrors($form);
  528.             log_info('Entry form validation errors', ['context' => 'entry:shoppingEntry''errors' => $errors]);
  529.             $request->getSession()->getFlashBag()->add('form_debug'json_encode($errorsJSON_UNESCAPED_UNICODE JSON_UNESCAPED_SLASHES));
  530.         }
  531.         $route $request->get('_route');
  532.         $isLogin $route === 'shopping_entry';
  533.         $isRegister $route === 'entry';
  534.         // Load job categories data from JSON
  535.         $jobCategoriesData $this->loadJobCategoriesData();
  536.         
  537.         return [
  538.             'form' => $form->createView(),
  539.             'BreadCrumbs' => [],
  540.             'isMobile' => $this->mobileDetector->isMobile(),
  541.             'isLogin' => $isLogin,
  542.             'isRegister' => $isRegister,
  543.             'jobCategoriesData' => $jobCategoriesData
  544.          ];
  545.     }
  546.     /**
  547.      * 会員登録処理を行う
  548.      *
  549.      * @param Request $request
  550.      * @param $secret_key
  551.      *
  552.      * @return \Eccube\Entity\Cart|mixed
  553.      */
  554.      private function entryActivate(Request $request$secret_key)
  555.     {
  556.         log_info('本会員登録開始');
  557.         $Customer $this->customerRepository->getProvisionalCustomerBySecretKey($secret_key);
  558.         if (is_null($Customer)) {
  559.             throw new HttpException\NotFoundHttpException();
  560.         }
  561.         $CustomerStatus $this->customerStatusRepository->find(CustomerStatus::REGULAR);
  562.         $Customer->setStatus($CustomerStatus);
  563.         $this->entityManager->persist($Customer);
  564.         $this->entityManager->flush();
  565.         log_info('本会員登録完了');
  566.         $event = new EventArgs(
  567.             [
  568.                 'Customer' => $Customer,
  569.             ],
  570.             $request
  571.         );
  572.         $this->eventDispatcher->dispatch($event,EccubeEvents::FRONT_ENTRY_ACTIVATE_COMPLETE );
  573.         // メール送信
  574.         $this->mailService->sendCustomerCompleteMail($Customer);
  575.         // Assign session carts into customer carts
  576.         $Carts $this->cartService->getCarts();
  577.         $qtyInCart 0;
  578.         foreach ($Carts as $Cart) {
  579.             $qtyInCart += $Cart->getTotalQuantity();
  580.         }
  581.         // 本会員登録してログイン状態にする
  582.         $token = new UsernamePasswordToken($Customernull'customer', ['ROLE_USER']);
  583.         $this->tokenStorage->setToken($token);
  584.         $request->getSession()->migrate(true);
  585.         if ($qtyInCart) {
  586.             $this->cartService->save();
  587.         }
  588.         log_info('ログイン済に変更', [$this->getUser()->getId()]);
  589.         return $qtyInCart;
  590.     }
  591.     /**
  592.      * Load job categories data from JSON file
  593.      */
  594.     private function loadJobCategoriesData()
  595.     {
  596.         $jsonPath __DIR__ '/../Resource/Json/JobCategoryOptions.json';
  597.         
  598.         if (!file_exists($jsonPath)) {
  599.             return [];
  600.         }
  601.         
  602.         $jsonContent file_get_contents($jsonPath);
  603.         $data json_decode($jsonContenttrue);
  604.         
  605.         if (json_last_error() !== JSON_ERROR_NONE) {
  606.             return [];
  607.         }
  608.         
  609.         return $data['categories'] ?? [];
  610.     }
  611.     private function collectFormErrors(\Symfony\Component\Form\FormInterface $form): array
  612.     {
  613.         $errors = [];
  614.         foreach ($form->getErrors(true) as $error) {
  615.             $origin $error->getOrigin();
  616.             $errors[] = [
  617.                 'field' => $origin $origin->getName() : null,
  618.                 'message' => $error->getMessage(),
  619.             ];
  620.         }
  621.         return $errors;
  622.     }
  623. }