<?php
namespace Plugin\PiaContact\Controller;
use Eccube\Controller\AbstractController;
use Eccube\Event\EventArgs;
use Eccube\Event\EccubeEvents;
use Plugin\PiaContact\Form\Type\FormAppraisalType;
use Plugin\PiaContact\Service\PiaContactMailService;
use Plugin\PiaContact\Service\PiaContactSpreadsheetService;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
/**
* 査定申込Controller
*/
class AppraisalController extends AbstractController
{
protected $piaContactMailService;
protected $piaContactSpreadsheetService;
protected $authorizationChecker;
protected $eventDispatcher;
public function __construct(
PiaContactMailService $piaContactMailService,
PiaContactSpreadsheetService $piaContactSpreadsheetService,
AuthorizationCheckerInterface $authorizationChecker,
EventDispatcherInterface $eventDispatcher
) {
$this->piaContactMailService = $piaContactMailService;
$this->piaContactSpreadsheetService = $piaContactSpreadsheetService;
$this->authorizationChecker = $authorizationChecker;
$this->eventDispatcher = $eventDispatcher;
}
/**
* 査定申込フォーム表示
*
* @Route("/form_appraisal", name="plugin_pia_form_appraisal")
* @Template("@PiaContact/default/appraisal/index.twig")
*/
public function index(Request $request)
{
$builder = $this->formFactory->createBuilder(FormAppraisalType::class);
// ログインユーザーの場合、ユーザー情報を設定
if ($this->authorizationChecker->isGranted('ROLE_USER')) {
/** @var \Eccube\Entity\Customer $user */
$user = $this->getUser();
$builder->setData([
'name' => [
'name01' => $user->getName01(),
'name02' => $user->getName02(),
],
'kana' => [
'kana01' => $user->getKana01(),
'kana02' => $user->getKana02(),
],
'zip' => $user->getPostalCode(),
'address' => [
'pref' => $user->getPref(),
'addr01' => $user->getAddr01(),
'addr02' => $user->getAddr02(),
],
'tel' => $user->getPhoneNumber(),
'email' => $user->getEmail(),
]);
}
// FRONT_CONTACT_INDEX_INITIALIZE
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_CONTACT_INDEX_INITIALIZE);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
switch ($request->get('mode')) {
case 'confirm':
// 確認画面
$data = $form->getData();
$files = [];
// 画像データを一時保存
for ($i = 1; $i <= 5; $i++) {
$fieldName = "item0{$i}_img";
if (isset($_FILES["form_appraisal"]["name"][$fieldName]) && $_FILES["form_appraisal"]["name"][$fieldName]) {
$file_name = $_FILES["form_appraisal"]["name"][$fieldName];
$originalName = $file_name;
$extension = substr($file_name, strrpos($file_name, '.') + 1);
$fileName = date("Ymd_His") . "_" . sprintf("%03d", rand(0, 999)) . "_img0{$i}." . $extension;
// 一時ディレクトリに保存(EC-CUBE4標準パス)
$tempDir = $this->getParameter('kernel.project_dir') . '/html/upload/temp_image/';
if (!is_dir($tempDir)) {
mkdir($tempDir, 0777, true);
}
rename($_FILES["form_appraisal"]["tmp_name"][$fieldName], $tempDir.$fileName);
$files[$fieldName] = [
'name' => $originalName,
'file_name' => $fileName
];
$data[$fieldName] = $originalName;
} else {
$data[$fieldName] = '';
}
}
// セッションに画像情報を保存
$request->getSession()->set('plugin.form.appraisal.img', serialize($files));
return $this->render('@PiaContact/default/appraisal/confirm.twig', [
'form' => $form->createView(),
]);
case 'complete':
// 完了処理
$data = $form->getData();
// 連絡方法・受取方法の表示名を設定
$htContact = ["1" => "TEL", "2" => "メール"];
$htReceiving = ["1" => "ご配送", "2" => "ご来店"];
$data["contact_nm"] = $htContact[$data["contact"]] ?? "";
$data["receiving_nm"] = $htReceiving[$data["receiving"]] ?? "";
// 画像ファイルの処理
$this->processImageFiles($data, $request);
// イベントを実行してデータを保存
$event = new EventArgs(
[
'form' => $form,
'data' => $data,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_CONTACT_INDEX_COMPLETE);
$data = $event->getArgument('data');
try {
// スプレッドシートに保存
$this->piaContactSpreadsheetService->saveAppraisal($data);
// メール送信
$this->piaContactMailService->sendPiaAppraisalMail($data);
$this->addSuccess('査定申込を受け付けました。', 'front');
} catch (\Exception $e) {
$this->addError('申込処理中にエラーが発生しました: ' . $e->getMessage(), 'front');
error_log('Appraisal Process Error: ' . $e->getMessage());
return [
'form' => $form->createView(),
];
}
return $this->redirectToRoute('plugin_pia_form_appraisal_complete');
}
}
return [
'form' => $form->createView(),
];
}
/**
* 査定申込完了画面
*
* @Route("/appraisal/complete", name="plugin_pia_form_appraisal_complete")
*/
public function complete()
{
return $this->render('@PiaContact/default/appraisal/complete.twig');
}
/**
* 画像ファイルの処理
*
* @param array $data
* @param Request $request
*/
private function processImageFiles(&$data, Request $request)
{
$dir_tmp = $this->getParameter('kernel.project_dir') . '/html/upload/temp_image/';
$dir_up = $this->getParameter('kernel.project_dir') . '/html/upload/appraisal/';
// アップロードディレクトリが存在しない場合は作成
if (!is_dir($dir_up)) {
mkdir($dir_up, 0777, true);
}
// セッションから画像情報を取得
$htImg = unserialize($request->getSession()->get('plugin.form.appraisal.img', ''));
for ($i = 1; $i <= 5; $i++) {
$key = "item0{$i}_img";
$data[$key] = empty($htImg[$key]["file_name"]) ? "" : $htImg[$key]["file_name"];
if (!empty($data[$key])) {
$tempFile = $dir_tmp . $data[$key];
$finalFile = $dir_up . $data[$key];
if (file_exists($tempFile)) {
rename($tempFile, $finalFile);
}
}
}
}
}