app/Plugin/ExhibitorCoin/Controller/Front/MyPageExhibitionController.php line 60

Open in your IDE?
  1. <?php
  2. namespace Plugin\ExhibitorCoin\Controller\Front;
  3. use Eccube\Controller\AbstractController;
  4. use Plugin\ExhibitorCoin\Form\Type\Front\ExhibitionApplicationType;
  5. use Plugin\ExhibitorCoin\Service\ExhibitorCoinMailService;
  6. use Plugin\ExhibitorCoin\Repository\ExhibitionRepository;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  12. use Symfony\Component\HttpFoundation\File\UploadedFile;
  13. /**
  14.  * @Route("/mypage/exhibition")
  15.  */
  16. class MyPageExhibitionController extends AbstractController
  17. {
  18.     protected $exhibitionRepository;
  19.     protected $mailService;
  20.     private $dirCoin;
  21.     public function __construct(
  22.         ExhibitionRepository $exhibitionRepository,
  23.         ExhibitorCoinMailService $mailService
  24.     ) {
  25.         $this->exhibitionRepository $exhibitionRepository;
  26.         $this->mailService $mailService;
  27.     }
  28.     /**
  29.      * 出品申込み入力画面
  30.      *
  31.      * @Route("/disp_photo", name="mypage_exhibition_disp_photo", methods={"GET"})
  32.      */
  33.     public function disp_photo(Request $request){
  34.         $photo $request->get("id");
  35.         if(!empty($photo)){
  36.             $this->dirCoin $this->getParameter('kernel.project_dir')."/app/Coin";
  37.             $file_path $this->dirCoin."/temp_image/".$photo;
  38.             if(is_file$file_path ) && file_exists$file_path ) && filesize$file_path ) > 0){
  39.                 $data file_get_contents($file_path);
  40.                 header('Content-type: image/jpg');
  41.                 echo $data;
  42.                 exit;
  43.             }
  44.         }
  45.         exit;
  46.     }
  47.     /**
  48.      * 出品申込み入力画面
  49.      *
  50.      * @Route("", name="mypage_exhibition", methods={"GET"})
  51.      * @Template("@ExhibitorCoin/default/exhibition/index.twig")
  52.      */
  53.     public function index(Request $request)
  54.     {
  55.         if (!$this->isGranted('ROLE_USER')) {
  56.             return $this->redirectToRoute('mypage_login');
  57.         }
  58.         $form $this->createForm(ExhibitionApplicationType::class);
  59.         if ('POST' === $request->getMethod()) {
  60.             $form->handleRequest($request);
  61.             $formType $form->getConfig()->getType()->getInnerType();
  62.             $errors $formType->validateForm($request->request->all());
  63.             if (empty($errors) && $form->isValid()) {
  64.                 return $this->redirectToRoute('mypage_exhibition_confirm');
  65.             } else {
  66.                 foreach ($errors as $error) {
  67.                     $this->addError($error'front');
  68.                 }
  69.             }
  70.         }
  71.         return [
  72.             'form' => $form->createView(),
  73.         ];
  74.     }
  75.     /**
  76.      * 出品申込み確認画面
  77.      *
  78.      * @Route("/confirm", name="mypage_exhibition_confirm", methods={"GET", "POST"})
  79.      * @Template("@ExhibitorCoin/default/exhibition/confirm.twig")
  80.      */
  81.     public function confirm(Request $request)
  82.     {
  83.         $this->dirCoin $this->getParameter('kernel.project_dir')."/app/Coin";
  84.         if (!$this->isGranted('ROLE_USER')) {
  85.             return $this->redirectToRoute('mypage_login');
  86.         }
  87.         if ('POST' === $request->getMethod()) {
  88.             $params $request->request->all();
  89.             $posts $params["exhibition_application"];
  90.             // バリデーション
  91.             if (empty($posts["coin_type01"])) {
  92.                 $this->addError("1枚目の鑑定会社を選択してください。"'front');
  93.                 return $this->redirectToRoute('mypage_exhibition');
  94.             }
  95.             if (empty($posts["coin_kantei01"])) {
  96.                 $this->addError("1枚目の鑑定番号を入力してください。"'front');
  97.                 return $this->redirectToRoute('mypage_exhibition');
  98.             }
  99.             // データ整形
  100.             $rows $posts;
  101.             for ($i 1$i <= 10$i++) {
  102.                 $kantei sprintf("coin_kantei%02d"$i);
  103.                 $name sprintf("coin_name%02d"$i);
  104.                 $rows[$name] = empty($rows[$kantei]) ? "" $rows[$kantei];
  105.             }
  106.             // ファイル処理
  107.             $session $request->getSession();
  108.             $sessionId $session->getId();
  109.             $tmpDir $this->dirCoin.'/temp_image/' $sessionId;
  110.             if (!is_dir($tmpDir)) {
  111.                 mkdir($tmpDir0777true);
  112.             }
  113.             $images = [];
  114.             $fileNames = [];
  115.             $files $request->files->get("exhibition_application");
  116.             for ($i 1$i <= 10$i++) {
  117.                 $num sprintf('%02d'$i);
  118.                 // 表面画像
  119.                 $coinA sprintf("coin_photo%sa"$num);
  120.                 $uploadedFileA $files[$coinA];
  121.                 if ($uploadedFileA && $uploadedFileA->isValid()) {
  122.                     $extension strtolower($uploadedFileA->getClientOriginalExtension());
  123.                     $destFileName sprintf("img%sa.%s"$num$extension);
  124.                     $uploadedFileA->move($tmpDir$destFileName);
  125.                     $rows[$coinA] = $sessionId "/" $destFileName;
  126.                     $images[$coinA] = $destFileName;
  127.                     $fileNames[$coinA] = $uploadedFileA->getClientOriginalName();
  128.                 }
  129.                 // 裏面画像
  130.                 $coinB sprintf("coin_photo%sb"$num);
  131.                 $uploadedFileB $files[$coinB];
  132.                 if ($uploadedFileB && $uploadedFileB->isValid()) {
  133.                     $extension strtolower($uploadedFileB->getClientOriginalExtension());
  134.                     $destFileName sprintf("img%sb.%s"$num$extension);
  135.                     $uploadedFileB->move($tmpDir$destFileName);
  136.                     $rows[$coinB] = $sessionId "/" $destFileName;
  137.                     $images[$coinB] = $destFileName;
  138.                     $fileNames[$coinB] = $uploadedFileB->getClientOriginalName();
  139.                 }
  140.             }
  141.             // セッションに保存
  142.             $session->set('exhibition.images'$images);
  143.             $session->set('exhibition.file_names'$fileNames);
  144.             $session->set('exhibition.params'$rows);
  145.             return [
  146.                 'rows' => $rows,
  147.             ];
  148.         }
  149.         return $this->redirectToRoute('mypage_exhibition');
  150.     }
  151.     /**
  152.      * 出品申込み完了画面
  153.      *
  154.      * @Route("/complete", name="mypage_exhibition_complete", methods={"POST"})
  155.      * @Template("@ExhibitorCoin/default/exhibition/complete.twig")
  156.      */
  157.     public function complete(Request $request)
  158.     {
  159.         $this->dirCoin $this->getParameter('kernel.project_dir')."/app/Coin";
  160.         if (!$this->isGranted('ROLE_USER')) {
  161.             return $this->redirectToRoute('mypage_login');
  162.         }
  163.         $session $request->getSession();
  164.         $params $session->get('exhibition.params');
  165.         $images $session->get('exhibition.images', []);
  166.         $fileNames $session->get('exhibition.file_names', []);
  167.         if (empty($params["coin_type01"]) || empty($params["coin_name01"])) {
  168.             $this->addError("出品確認ができませんでした。"'front');
  169.             return $this->redirectToRoute('mypage_exhibition');
  170.         }
  171.         // 画像ファイル情報をパラメータに追加
  172.         for ($i 1$i <= 10$i++) {
  173.             $num sprintf('%02d'$i);
  174.             $coinA sprintf("coin_photo%sa"$num);
  175.             $coinB sprintf("coin_photo%sb"$num);
  176.             $params[$coinA] = $images[$coinA] ?? '';
  177.             $params[$coinA "_name"] = $fileNames[$coinA] ?? '';
  178.             $params[$coinB] = $images[$coinB] ?? '';
  179.             $params[$coinB "_name"] = $fileNames[$coinB] ?? '';
  180.         }
  181.         // Exhibitionエンティティに保存するデータを準備
  182.         $exhibitionData $this->prepareExhibitionData($params);
  183.         // Exhibition エンティティ保存
  184.         try {
  185.             $customer $this->getUser();
  186.             $exhibition = new \Plugin\ExhibitorCoin\Entity\Exhibition();
  187.             $exhibition->setCustomerId($customer->getId());
  188.             $exhibition->setStatusId(1); // 出品依頼
  189.             $exhibition->setDatetimeRequest(new \DateTime());
  190.             // コイン枚数計算
  191.             $coinCount 0;
  192.             for ($i 1$i <= 10$i++) {
  193.                 $num sprintf('%02d'$i);
  194.                 if (!empty($params['coin_type' $num])) {
  195.                     $coinCount++;
  196.                 }
  197.             }
  198.             $exhibition->setCoinNum($coinCount);
  199.             // コイン情報設定
  200.             for ($i 1$i <= 10$i++) {
  201.                 $num sprintf('%02d'$i);
  202.                 if (!empty($params['coin_type' $num])) {
  203.                     $exhibition->{'setCoinType' $num}($params['coin_type' $num] ?? '');
  204.                     $exhibition->{'setCoinName' $num}($params['coin_name' $num] ?? '');
  205.                     $exhibition->{'setCoinGrade' $num}($params['coin_grade' $num] ?? '');
  206.                     $exhibition->{'setCoinPhoto' $num 'a'}($images['coin_photo' $num 'a'] ?? '');
  207.                     $exhibition->{'setCoinPhoto' $num 'b'}($images['coin_photo' $num 'b'] ?? '');
  208.                 }
  209.             }
  210.             $this->entityManager->persist($exhibition);
  211.             $this->entityManager->flush();
  212.             $exhibitionId $exhibition->getId();
  213.             // 画像ファイル移動
  214.             $sessionId $session->getId();
  215.             $tmpDir $this->dirCoin.'/temp_image/' $sessionId;
  216.             $coinDir $this->dirCoin.'/'$exhibitionId;
  217.             if (!is_dir($coinDir)) {
  218.                 mkdir($coinDir0777true);
  219.             }
  220.             // ファイルのコピーと削除
  221.             foreach ($images as $key => $fileName) {
  222.                 if (file_exists($tmpDir '/' $fileName)) {
  223.                     copy($tmpDir '/' $fileName$coinDir '/' $fileName);
  224.                     unlink($tmpDir '/' $fileName);
  225.                 }
  226.             }
  227.             rmdir($tmpDir);
  228.             // メール送信
  229.             $mailResult $this->mailService->sendExhibitionApplicationMail($params$customer);
  230.             if ($mailResult !== 1) {
  231.                 // メール送信失敗してもエラーにはしない(ログ出力済み)
  232.             }
  233.         } catch (\Exception $ex) {
  234.           dump($ex->getMessage());exit;
  235.             $this->addError('出品情報の登録に失敗しました。''front');
  236.             return $this->redirectToRoute('mypage_exhibition');
  237.         }
  238.         // セッションクリア
  239.         $session->remove('exhibition.params');
  240.         $session->remove('exhibition.images');
  241.         $session->remove('exhibition.file_names');
  242.         return [];
  243.     }
  244.     /**
  245.      * Exhibition保存用データ準備
  246.      */
  247.     private function prepareExhibitionData($params)
  248.     {
  249.         $data $params;
  250.         $data['datetime_request'] = new \DateTime();
  251.         return $data;
  252.     }
  253. }