<?php
namespace Plugin\ExhibitorCoin\Controller\Front;
use Eccube\Controller\AbstractController;
use Plugin\ExhibitorCoin\Form\Type\Front\ExhibitionApplicationType;
use Plugin\ExhibitorCoin\Service\ExhibitorCoinMailService;
use Plugin\ExhibitorCoin\Repository\ExhibitionRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* @Route("/mypage/exhibition")
*/
class MyPageExhibitionController extends AbstractController
{
protected $exhibitionRepository;
protected $mailService;
private $dirCoin;
public function __construct(
ExhibitionRepository $exhibitionRepository,
ExhibitorCoinMailService $mailService
) {
$this->exhibitionRepository = $exhibitionRepository;
$this->mailService = $mailService;
}
/**
* 出品申込み入力画面
*
* @Route("/disp_photo", name="mypage_exhibition_disp_photo", methods={"GET"})
*/
public function disp_photo(Request $request){
$photo = $request->get("id");
if(!empty($photo)){
$this->dirCoin = $this->getParameter('kernel.project_dir')."/app/Coin";
$file_path = $this->dirCoin."/temp_image/".$photo;
if(is_file( $file_path ) && file_exists( $file_path ) && filesize( $file_path ) > 0){
$data = file_get_contents($file_path);
header('Content-type: image/jpg');
echo $data;
exit;
}
}
exit;
}
/**
* 出品申込み入力画面
*
* @Route("", name="mypage_exhibition", methods={"GET"})
* @Template("@ExhibitorCoin/default/exhibition/index.twig")
*/
public function index(Request $request)
{
if (!$this->isGranted('ROLE_USER')) {
return $this->redirectToRoute('mypage_login');
}
$form = $this->createForm(ExhibitionApplicationType::class);
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
$formType = $form->getConfig()->getType()->getInnerType();
$errors = $formType->validateForm($request->request->all());
if (empty($errors) && $form->isValid()) {
return $this->redirectToRoute('mypage_exhibition_confirm');
} else {
foreach ($errors as $error) {
$this->addError($error, 'front');
}
}
}
return [
'form' => $form->createView(),
];
}
/**
* 出品申込み確認画面
*
* @Route("/confirm", name="mypage_exhibition_confirm", methods={"GET", "POST"})
* @Template("@ExhibitorCoin/default/exhibition/confirm.twig")
*/
public function confirm(Request $request)
{
$this->dirCoin = $this->getParameter('kernel.project_dir')."/app/Coin";
if (!$this->isGranted('ROLE_USER')) {
return $this->redirectToRoute('mypage_login');
}
if ('POST' === $request->getMethod()) {
$params = $request->request->all();
$posts = $params["exhibition_application"];
// バリデーション
if (empty($posts["coin_type01"])) {
$this->addError("1枚目の鑑定会社を選択してください。", 'front');
return $this->redirectToRoute('mypage_exhibition');
}
if (empty($posts["coin_kantei01"])) {
$this->addError("1枚目の鑑定番号を入力してください。", 'front');
return $this->redirectToRoute('mypage_exhibition');
}
// データ整形
$rows = $posts;
for ($i = 1; $i <= 10; $i++) {
$kantei = sprintf("coin_kantei%02d", $i);
$name = sprintf("coin_name%02d", $i);
$rows[$name] = empty($rows[$kantei]) ? "" : $rows[$kantei];
}
// ファイル処理
$session = $request->getSession();
$sessionId = $session->getId();
$tmpDir = $this->dirCoin.'/temp_image/' . $sessionId;
if (!is_dir($tmpDir)) {
mkdir($tmpDir, 0777, true);
}
$images = [];
$fileNames = [];
$files = $request->files->get("exhibition_application");
for ($i = 1; $i <= 10; $i++) {
$num = sprintf('%02d', $i);
// 表面画像
$coinA = sprintf("coin_photo%sa", $num);
$uploadedFileA = $files[$coinA];
if ($uploadedFileA && $uploadedFileA->isValid()) {
$extension = strtolower($uploadedFileA->getClientOriginalExtension());
$destFileName = sprintf("img%sa.%s", $num, $extension);
$uploadedFileA->move($tmpDir, $destFileName);
$rows[$coinA] = $sessionId . "/" . $destFileName;
$images[$coinA] = $destFileName;
$fileNames[$coinA] = $uploadedFileA->getClientOriginalName();
}
// 裏面画像
$coinB = sprintf("coin_photo%sb", $num);
$uploadedFileB = $files[$coinB];
if ($uploadedFileB && $uploadedFileB->isValid()) {
$extension = strtolower($uploadedFileB->getClientOriginalExtension());
$destFileName = sprintf("img%sb.%s", $num, $extension);
$uploadedFileB->move($tmpDir, $destFileName);
$rows[$coinB] = $sessionId . "/" . $destFileName;
$images[$coinB] = $destFileName;
$fileNames[$coinB] = $uploadedFileB->getClientOriginalName();
}
}
// セッションに保存
$session->set('exhibition.images', $images);
$session->set('exhibition.file_names', $fileNames);
$session->set('exhibition.params', $rows);
return [
'rows' => $rows,
];
}
return $this->redirectToRoute('mypage_exhibition');
}
/**
* 出品申込み完了画面
*
* @Route("/complete", name="mypage_exhibition_complete", methods={"POST"})
* @Template("@ExhibitorCoin/default/exhibition/complete.twig")
*/
public function complete(Request $request)
{
$this->dirCoin = $this->getParameter('kernel.project_dir')."/app/Coin";
if (!$this->isGranted('ROLE_USER')) {
return $this->redirectToRoute('mypage_login');
}
$session = $request->getSession();
$params = $session->get('exhibition.params');
$images = $session->get('exhibition.images', []);
$fileNames = $session->get('exhibition.file_names', []);
if (empty($params["coin_type01"]) || empty($params["coin_name01"])) {
$this->addError("出品確認ができませんでした。", 'front');
return $this->redirectToRoute('mypage_exhibition');
}
// 画像ファイル情報をパラメータに追加
for ($i = 1; $i <= 10; $i++) {
$num = sprintf('%02d', $i);
$coinA = sprintf("coin_photo%sa", $num);
$coinB = sprintf("coin_photo%sb", $num);
$params[$coinA] = $images[$coinA] ?? '';
$params[$coinA . "_name"] = $fileNames[$coinA] ?? '';
$params[$coinB] = $images[$coinB] ?? '';
$params[$coinB . "_name"] = $fileNames[$coinB] ?? '';
}
// Exhibitionエンティティに保存するデータを準備
$exhibitionData = $this->prepareExhibitionData($params);
// Exhibition エンティティ保存
try {
$customer = $this->getUser();
$exhibition = new \Plugin\ExhibitorCoin\Entity\Exhibition();
$exhibition->setCustomerId($customer->getId());
$exhibition->setStatusId(1); // 出品依頼
$exhibition->setDatetimeRequest(new \DateTime());
// コイン枚数計算
$coinCount = 0;
for ($i = 1; $i <= 10; $i++) {
$num = sprintf('%02d', $i);
if (!empty($params['coin_type' . $num])) {
$coinCount++;
}
}
$exhibition->setCoinNum($coinCount);
// コイン情報設定
for ($i = 1; $i <= 10; $i++) {
$num = sprintf('%02d', $i);
if (!empty($params['coin_type' . $num])) {
$exhibition->{'setCoinType' . $num}($params['coin_type' . $num] ?? '');
$exhibition->{'setCoinName' . $num}($params['coin_name' . $num] ?? '');
$exhibition->{'setCoinGrade' . $num}($params['coin_grade' . $num] ?? '');
$exhibition->{'setCoinPhoto' . $num . 'a'}($images['coin_photo' . $num . 'a'] ?? '');
$exhibition->{'setCoinPhoto' . $num . 'b'}($images['coin_photo' . $num . 'b'] ?? '');
}
}
$this->entityManager->persist($exhibition);
$this->entityManager->flush();
$exhibitionId = $exhibition->getId();
// 画像ファイル移動
$sessionId = $session->getId();
$tmpDir = $this->dirCoin.'/temp_image/' . $sessionId;
$coinDir = $this->dirCoin.'/'. $exhibitionId;
if (!is_dir($coinDir)) {
mkdir($coinDir, 0777, true);
}
// ファイルのコピーと削除
foreach ($images as $key => $fileName) {
if (file_exists($tmpDir . '/' . $fileName)) {
copy($tmpDir . '/' . $fileName, $coinDir . '/' . $fileName);
unlink($tmpDir . '/' . $fileName);
}
}
rmdir($tmpDir);
// メール送信
$mailResult = $this->mailService->sendExhibitionApplicationMail($params, $customer);
if ($mailResult !== 1) {
// メール送信失敗してもエラーにはしない(ログ出力済み)
}
} catch (\Exception $ex) {
dump($ex->getMessage());exit;
$this->addError('出品情報の登録に失敗しました。', 'front');
return $this->redirectToRoute('mypage_exhibition');
}
// セッションクリア
$session->remove('exhibition.params');
$session->remove('exhibition.images');
$session->remove('exhibition.file_names');
return [];
}
/**
* Exhibition保存用データ準備
*/
private function prepareExhibitionData($params)
{
$data = $params;
$data['datetime_request'] = new \DateTime();
return $data;
}
}