app/Plugin/PiaReservation/Controller/PiaReservationController.php line 64

Open in your IDE?
  1. <?php
  2. namespace Plugin\PiaReservation\Controller;
  3. use Eccube\Controller\AbstractController;
  4. use Plugin\PiaReservation\Repository\PiaReservationRepository;
  5. use Plugin\PiaReservation\Service\PiaReservationMailService;
  6. use Plugin\PiaReservation\Form\Type\PiaReservationType;
  7. use Symfony\Component\Form\FormFactoryInterface;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. /**
  13.  * PiaReservationController
  14.  *
  15.  * @Route("/reservation")
  16.  */
  17. class PiaReservationController extends AbstractController
  18. {
  19.     /**
  20.      * @var PiaReservationRepository
  21.      */
  22.     protected $piaReservationRepository;
  23.     /**
  24.      * @var PiaReservationMailService
  25.      */
  26.     protected $piaReservationMailService;
  27.     /**
  28.      * @var TokenStorageInterface
  29.      */
  30.     protected $tokenStorage;
  31.     /**
  32.      * @var FormFactoryInterface
  33.      */
  34.     protected $formFactory;
  35.     public function __construct(
  36.         PiaReservationRepository $piaReservationRepository,
  37.         PiaReservationMailService $piaReservationMailService,
  38.         TokenStorageInterface $tokenStorage,
  39.         FormFactoryInterface $formFactory
  40.     ) {
  41.         $this->piaReservationRepository $piaReservationRepository;
  42.         $this->piaReservationMailService $piaReservationMailService;
  43.         $this->tokenStorage $tokenStorage;
  44.         $this->formFactory $formFactory;
  45.     }
  46.     /**
  47.      * 来店予約フォームを表示
  48.      * View: PiaReservation/default/index.twig
  49.      * URL: /reservation/
  50.      *
  51.      * @Route("/", name="plugin_pia_reservation")
  52.      */
  53.     public function index(Request $request)
  54.     {
  55.         $errorMsg = [];
  56.         if ($request->getSession()->has('error_msg')) {
  57.             $errorMsg $request->getSession()->get('error_msg');
  58.             $request->getSession()->remove('error_msg');
  59.         }
  60.         // ログイン情報を取得
  61.         $token $this->tokenStorage->getToken();
  62.         $customer $token && $token->getUser() ? $token->getUser() : null;
  63.         // 初期データを設定
  64.         $data = [];
  65.         if ($customer) {
  66.             $data = [
  67.                 'reservation_name' => $customer->getName01() . ' ' $customer->getName02(),
  68.                 'reservation_email' => $customer->getEmail(),
  69.                 'reservation_tel' => $customer->getPhoneNumber(),
  70.             ];
  71.         }
  72.         // フォームを作成
  73.         $form $this->formFactory->createBuilder(PiaReservationType::class, $data)->getForm();
  74.         $startDate date("Y-m") . "-01";
  75.         $htRoku = [];
  76.         for ($i 0$i 4$i++) {
  77.             $month date("Y-m"strtotime("+{$i} month"strtotime($startDate)));
  78.             $hash $this->getHashRokuyou($month);
  79.             foreach ($hash as $k => $v) {
  80.                 $htRoku[$k] = $v;
  81.             }
  82.         }
  83.         // 定休日一覧を取得
  84.         $holiday $this->piaReservationRepository->getDispHoliday();
  85.         return $this->render('@PiaReservation/default/index.twig', [
  86.             'form' => $form->createView(),
  87.             'error_msg' => $errorMsg,
  88.             'holiday' => $holiday,
  89.             'htRoku' => $htRoku,
  90.         ]);
  91.     }
  92.     /**
  93.      * 確認画面
  94.      * View: PiaReservation/default/confirm.twig
  95.      * URL: /reservation/confirm
  96.      *
  97.      * @Route("/confirm", name="plugin_pia_reservation_confirm")
  98.      */
  99.     public function confirm(Request $request)
  100.     {
  101.         $params $request->request->all();
  102.         $errorMsg = [];
  103.         // 登録処理
  104.         if (!empty($params["mode"]) && $params["mode"] == "regist") {
  105.             if (!$request->getSession()->has('params')) {
  106.                 $errorMsg[] = "「戻るボタン」で戻った場合は最初からご入力ください。";
  107.                 $request->getSession()->set('error_msg'$errorMsg);
  108.                 return $this->redirectToRoute('plugin_pia_reservation');
  109.             } else {
  110.                 $params $request->getSession()->get('params');
  111.                 
  112.                 try {
  113.                     $token $this->tokenStorage->getToken();
  114.                     $customerId $token && $token->getUser() ? $token->getUser()->getId() : 0;
  115.                     // 1. DBを登録
  116.                     $data $params;
  117.                     $data["status"] = 1;
  118.                     $data["hope_time01"] = empty($params["hope_time01"]) ? "" $params["hope_time01"];
  119.                     $data["hope_date02"] = empty($params["hope_date02"]) ? "" $params["hope_date02"];
  120.                     $data["hope_time02"] = empty($params["hope_time02"]) ? "" $params["hope_time02"];
  121.                     $data["hope_date03"] = empty($params["hope_date03"]) ? "" $params["hope_date03"];
  122.                     $data["hope_time03"] = empty($params["hope_time03"]) ? "" $params["hope_time03"];
  123.                     $data["customer_id"] = $customerId;
  124.                     $data["register_id"] = $customerId;
  125.                     $data["update_id"] = $customerId;
  126.                     $data["create_date"] = new \DateTime();
  127.                     $data["update_date"] = new \DateTime();
  128.                     $this->piaReservationRepository->save($data);
  129.                     // 2. メールを送信
  130.                     $this->piaReservationMailService->sendPiaReservationMail($data);
  131.                     // 3. セッションの削除
  132.                     $request->getSession()->remove('params');
  133.                     // 4. スプレッドシートに登録
  134.                     $this->saveSpreadSheet($params);
  135.                     // 5. 完了画面の表示
  136.                     return $this->redirectToRoute('plugin_pia_reservation_complete');
  137.                 } catch (\Exception $ex) {
  138.                     $errorMsg[] = $ex->getMessage();
  139.                     $request->getSession()->set('error_msg'$errorMsg);
  140.                     return $this->redirectToRoute('plugin_pia_reservation');
  141.                 }
  142.             }
  143.         }
  144.         // フォームの処理
  145.         $form $this->formFactory->createBuilder(PiaReservationType::class)->getForm();
  146.         $form->handleRequest($request);
  147.         // フォームが送信された場合
  148.         if ($form->isSubmitted() && $form->isValid()) {
  149.             $data $form->getData();
  150.             
  151.             // DateTimeオブジェクトを文字列に変換
  152.             if ($data['hope_date01'] instanceof \DateTime) {
  153.                 $data['hope_date01'] = $data['hope_date01']->format('Y-m-d');
  154.             }
  155.             if ($data['hope_date02'] instanceof \DateTime) {
  156.                 $data['hope_date02'] = $data['hope_date02']->format('Y-m-d');
  157.             }
  158.             if ($data['hope_date03'] instanceof \DateTime) {
  159.                 $data['hope_date03'] = $data['hope_date03']->format('Y-m-d');
  160.             }
  161.             
  162.             $request->getSession()->set('params'$data);
  163.             return $this->render('@PiaReservation/default/confirm.twig', ['params' => $data]);
  164.         }
  165.         // フォームが無効な場合、エラーを表示
  166.         if ($form->isSubmitted() && !$form->isValid()) {
  167.             $errorMsg[] = "入力内容に誤りがあります。";
  168.             $request->getSession()->set('error_msg'$errorMsg);
  169.             return $this->redirectToRoute('plugin_pia_reservation');
  170.         }
  171.         // 通常のバリデーション(フォームを使用しない場合のフォールバック)
  172.         if (empty($params["hope_date01"])) {
  173.             $errorMsg[] = "第1希望日を選択してください。";
  174.         }
  175.         if (empty($params["reservation_name"])) {
  176.             $errorMsg[] = "お名前を入力してください。";
  177.         }
  178.         if (empty($params["reservation_tel"])) {
  179.             $errorMsg[] = "電話番号を入力してください。";
  180.         }
  181.         if (empty($params["reservation_email"])) {
  182.             $errorMsg[] = "メールアドレスを入力してください。";
  183.         }
  184.         if (count($errorMsg) > 0) {
  185.             $request->getSession()->set('error_msg'$errorMsg);
  186.             return $this->redirectToRoute('plugin_pia_reservation');
  187.         }
  188.         // DateTimeオブジェクトを文字列に変換(フォールバック処理用)
  189.         if (isset($params['hope_date01']) && $params['hope_date01'] instanceof \DateTime) {
  190.             $params['hope_date01'] = $params['hope_date01']->format('Y-m-d');
  191.         }
  192.         if (isset($params['hope_date02']) && $params['hope_date02'] instanceof \DateTime) {
  193.             $params['hope_date02'] = $params['hope_date02']->format('Y-m-d');
  194.         }
  195.         if (isset($params['hope_date03']) && $params['hope_date03'] instanceof \DateTime) {
  196.             $params['hope_date03'] = $params['hope_date03']->format('Y-m-d');
  197.         }
  198.         $request->getSession()->set('params'$params);
  199.         return $this->render('@PiaReservation/default/confirm.twig', ['params' => $params]);
  200.     }
  201.     /**
  202.      * 完了画面
  203.      * View: PiaReservation/default/complete.twig
  204.      * URL: /reservation/complete
  205.      *
  206.      * @Route("/complete", name="plugin_pia_reservation_complete")
  207.      */
  208.     public function complete()
  209.     {
  210.         return $this->render('@PiaReservation/default/complete.twig');
  211.     }
  212.     /**
  213.      * スプレッドシートに保存
  214.      *
  215.      * @param array $data
  216.      */
  217.     private function saveSpreadSheet($data)
  218.     {
  219.         $keyFile $this->getParameter('kernel.project_dir') . '/app/Library/vendor/coinpalace-form-appraisal-d0023a2a5631.json';
  220.         $autoloadFile $this->getParameter('kernel.project_dir') . '/app/Library/vendor/autoload.php';
  221.         if (!file_exists($keyFile) || !file_exists($autoloadFile)) {
  222.             error_log('Google Sheets API key file or autoload.php not found');
  223.             return;
  224.         }
  225.         require_once $autoloadFile;
  226.         define('SCOPES'implode(' ', array(\Google_Service_Sheets::SPREADSHEETS)));
  227.         
  228.         $client = new \Google_Client();
  229.         $client->setScopes(SCOPES);
  230.         $client->setAuthConfig($keyFile);
  231.         $sheet = new \Google_Service_Sheets($client);
  232.         $spreadsheetId '1qBc9w5NkeiwOo814TyX1cUJ8RJnQgWzGYTPfi6Np94E';
  233.         
  234.         // null値を空文字列に変換し、連続した配列インデックスを保証
  235.         $value = [];
  236.         $value[] = date("Y-m-d H:i:s");
  237.         $value[] = $data["hope_date01"] ?? '';
  238.         $value[] = $data["hope_time01"] ?? '';
  239.         $value[] = $data["hope_date02"] ?? '';
  240.         $value[] = $data["hope_time02"] ?? '';
  241.         $value[] = $data["hope_date03"] ?? '';
  242.         $value[] = $data["hope_time03"] ?? '';
  243.         $value[] = $data["reservation_name"] ?? '';
  244.         $value[] = $data["reservation_tel"] ?? '';
  245.         $value[] = $data["reservation_email"] ?? '';
  246.         $value[] = $data["visitor"] ?? '';
  247.         $value[] = $data["visitor_detail"] ?? '';
  248.         $value[] = $data["message"] ?? '';
  249.         // 配列を連続したインデックスに再構築(JSONでオブジェクトではなく配列として出力されるように)
  250.         $values = [array_values($value)];
  251.         $body = new \Google_Service_Sheets_ValueRange([
  252.             'values' => $values,
  253.         ]);
  254.         
  255.         $response $sheet->spreadsheets_values->append(
  256.             $spreadsheetId,
  257.             '来店予約',
  258.             $body,
  259.             ["valueInputOption" => 'USER_ENTERED']
  260.         );
  261.     }
  262.     /**
  263.      * 六曜をハッシュで取得
  264.      *
  265.      * @param string $month
  266.      * @return array
  267.      */
  268.     public function getHashRokuyou($month)
  269.     {
  270.         list($year$mon) = explode("-"$month);
  271.         $lastDay date('d'mktime(000intval($mon) + 10$year));
  272.         $hash = [];
  273.         $htNm = ['0' => '大安''1' => '赤口''2' => '先勝''3' => '友引''4' => '先負''5' => '仏滅'];
  274.         
  275.         for ($day 1$day <= $lastDay$day++) {
  276.             $date $year "-" $mon "-" sprintf("%02d"$day);
  277.             $no $this->getRokuyou($year$mon$day);
  278.             $hash[$date] = empty($htNm[$no]) ? "" $htNm[$no];
  279.         }
  280.         
  281.         return $hash;
  282.     }
  283.     /**
  284.      * 六曜算出関数
  285.      *
  286.      * @param int $year
  287.      * @param int $mon
  288.      * @param int $day
  289.      * @return int
  290.      */
  291.     public function getRokuyou($year$mon$day)
  292.     {
  293.         // 簡略化された六曜計算(実際の実装ではより複雑な計算が必要)
  294.         // ここでは日付の合計値から六曜を算出
  295.         $total $year $mon $day;
  296.         return ($total 6);
  297.     }
  298. }