<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Customize\Controller;
use Customize\Event\LmEvents;
use Customize\Service\CustomerService;
use Customize\Service\CommonService;
use Customize\Service\Google\ReCaptchaService;
use Lm\Service\Store\FileStoreService;
use Customize\Converter\DynamicConverter;
use Customize\Form\Type\Front\QuestionType;
use Customize\Service\MailQuestionService;
use Eccube\Controller\ContactController;
use Customize\Form\Type\Front\MailType;
use Eccube\Entity\Customer;
use Eccube\Repository\PageRepository;
use Customize\Service\MailService;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Annotation\Route;
class MailController extends ContactController
{
/*
const S3_LM_DOC = 'lm-doc-dev';
const TMP_DIR = 'front-public/images/tmp_img/';
const S3_REGION = 'ap-northeast-1';
const S3_API_VERSION = 'latest';
*/
/**
* @var MailService
*/
protected $mailService;
/**
* @var PageRepository
*/
private $pageRepository;
/**
* @var CustomerService
*/
protected $CustomerService;
/**
* @var CommonService
*/
protected $CommonService;
/**
* @var BreadCrumbs_MyPageTop
*/
protected $BreadCrumbs_MyPageTop;
/**
* @var Request|null
*/
protected $request;
/**
* @var MailQuestionService
*/
protected $mailQuestionService;
/**
* @var DynamicConverter
*/
protected $dynamicConverter;
/**
* @var ReCaptchaService
*/
protected $reCaptchaService;
/**
* ContactController constructor.
*
* @param MailService $mailService
* @param PageRepository $pageRepository
*/
public function __construct(
CustomerService $CustomerService,
CommonService $CommonService,
MailService $mailService,
MailQuestionService $mailQuestionService,
DynamicConverter $dynamicConverter,
PageRepository $pageRepository,
RequestStack $requestStack,
ReCaptchaService $reCaptchaService
)
{
$this->CustomerService = $CustomerService;
$this->CommonService = $CommonService;
$this->mailService = $mailService;
$this->mailQuestionService = $mailQuestionService;
$this->dynamicConverter = $dynamicConverter;
$this->pageRepository = $pageRepository;
$this->request = $requestStack->getMasterRequest();
$this->reCaptchaService = $reCaptchaService;
}
/**
* お問い合わせ画面.
*
* @Route("/mail/", name="contact", methods={"GET", "POST"})
* @Route("/mail/", name="contact_confirm", methods={"GET", "POST"})
* @Route("/mypage/contact/", name="mypage_contact", methods={"GET", "POST"})
* @Route("/mypage/contact/", name="mypage_contact_confirm", methods={"GET", "POST"})
* @Template("Contact/index.twig")
*/
public function index(Request $request)
{
// 他画面との共有のための設定
// TODO: 完了画面の対応
$routeName = $request->get('_route');
$routeBase = null;
$BreadCrumbs = [];
$isShowLeftMenu = false;
$reCaptchaSiteKey = $this->reCaptchaService->getReCaptchaSiteKey();
if (in_array($routeName, ["mypage_contact", "mypage_contact_confirm"])) {
$isShowLeftMenu = true;
}
if (preg_match('/^((?:\S+_)?contact)/', $routeName, $matches)) {
$routeBase = $matches[1];
$BreadCrumbs = [
1 => $this->__getBreadCrumbs_MyPageTop(),
];
}
$confirmRouteName = "{$routeBase}_confirm";
$completeRouteName = "{$routeBase}_complete";
$builder = $this->formFactory->createBuilder(MailType::class);
if ($this->isGranted('ROLE_USER')) {
/** @var Customer $user */
$Customer = $this->getUser();
$LmCustomer = $this->CustomerService->GetLandMarkCustomerId($Customer->getLmCustomerId());
if ($LmCustomer) {
$builder->setData(
[
'inquiry_user_name' => $LmCustomer['customer_user_name'],
'inquiry_tel' => $LmCustomer['customer_tel'],
'inquiry_email' => $LmCustomer['customer_mail'],
]
);
}
}
$contact = $request->request->get('contact');
if( !empty($contact['inquiry_user_name']) ){
$contact['inquiry_user_name'] = $this->unicodeTrim($contact['inquiry_user_name']);
}
$request->request->set('contact', $contact);
$this->session->set(LmEvents::SESSION_FRONT_MYPAGE_EMAIL_INQUIRY, $contact['inquiry_email'] ?? '');
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->reCaptchaService->handleRequest($request);
/*
$s3 = new S3Client(array(
'version' => self::S3_API_VERSION,
'region' => self::S3_REGION,
));
*/
$s3 = new FileStoreService(env('S3_LM_DOC'), MailService::INQUIRY_TMP_DIR);
// 添付ファイルの処理
for ($i = 1; $i <= 3; $i++) {
if (isset($_FILES['contact']['tmp_name']['inquiry_file' . $i]) and $_FILES['contact']['tmp_name']['inquiry_file' . $i] != "") {
$f_name[$i] = $_FILES['contact']['name']['inquiry_file' . $i];
$t_name[$i] = $_FILES['contact']['tmp_name']['inquiry_file' . $i];
$kaku[$i] = strtolower(substr($f_name[$i], strrpos($f_name[$i], ".") + 1, strlen($f_name[$i]) - strrpos($f_name[$i], ".")));
$contentType[$i] = $_FILES['contact']['type']['inquiry_file' . $i];
}
}
switch ($request->get('mode')) {
case 'confirm':
for ($i = 1; $i <= 3; $i++) {
// 保存
if (isset($_FILES['contact']['tmp_name']['inquiry_file' . $i]) and $_FILES['contact']['tmp_name']['inquiry_file' . $i] != "") {
if (isset($_SESSION['inquiry']['inquiry_file' . $i]['tmp_name']) and $_SESSION['inquiry']['inquiry_file' . $i]['tmp_name'] != "") {
if ($s3->isObjectExists($_SESSION['inquiry']['inquiry_file' . $i]['tmp_name'])) {
$s3->deleteObject($_SESSION['inquiry']['inquiry_file' . $i]['tmp_name']);
}
unset($_SESSION['inquiry']['inquiry_file' . $i]);
}
// 拡張子を取得
while (true) {
$new_name = $this->getNewPass() . "." . $kaku[$i];
if (!$s3->isObjectExists($new_name))
break;
}
/*
$args = array(
'Bucket' => self::S3_LM_DOC,
'SourceFile' => $t_name[$i],
'Key' => self::TMP_DIR . $new_name,
);
// 添付ファイルを保存
$s3->putObject($args);
*/
// 添付ファイルを保存
$s3->uploadFile($new_name, $t_name[$i]);
// dump(self::TMP_DIR . $new_name);exit;
// セッション変数に登録
$_SESSION['inquiry']['inquiry_file' . $i]['tmp_name'] = $new_name;
$_SESSION['inquiry']['inquiry_file' . $i]['name'] = $f_name[$i];
$_SESSION['inquiry']['inquiry_file' . $i]['ext'] = $kaku[$i];
$_SESSION['inquiry']['inquiry_file' . $i]['contentType'] = $contentType[$i];
}
}
//
$tmpFiles = $_SESSION['inquiry'] ?? []; // TODO: $_SESSIONの使用を廃止
//
$thumbnails = array_map(function ($tmpFile) {
//
$bucket = env('S3_LM_DOC');
$prefix = MailService::INQUIRY_TMP_DIR;
$filename = $tmpFile['tmp_name'];
$url = env('S3_LM_DOC_PATH') . "/{$prefix}{$filename}";
//
return [
'name' => $tmpFile['name'],
'url' => $url,
];
}, $tmpFiles);
return $this->render('Contact/confirm.twig', [
'form' => $form->createView(),
'Page' => $this->pageRepository->getPageByRoute('contact_confirm'),
'Thumbnails' => $thumbnails,
'BreadCrumbs' => $BreadCrumbs,
'isShowLeftMenu' => $isShowLeftMenu,
'reCaptchaSiteKey' => $reCaptchaSiteKey,
'routeName' => $routeName,
'path_info' => $request->getPathInfo()
]);
case 'complete':
//
$inquiryData = $form->getData();
//
$tmpFiles = $_SESSION['inquiry'] ?? []; // TODO: $_SESSIONの使用を廃止
$this->mailService->createInquiryMail($inquiryData, $tmpFiles);
// 後処理
unset($_SESSION['inquiry']);
return $this->redirect($this->generateUrl($completeRouteName));
}
}
$main_h1 = null;
$category_h1 = null;
$h1_comment = null;
$common_header_contents_all = '';
$common_header_contents = null;
$recentviews = [];
$custom_menu = null;
$custom_frequently_searched_word = null;
$data=[];
return [
'form' => $form->createView(),
'confirmRouteName' => $confirmRouteName,
'data' => $data,
'main_h1' => $main_h1,
'category_h1' => $category_h1,
'h1_comment' => $h1_comment,
'common_header_contents_all' => $common_header_contents_all,
'common_header_contents' => $common_header_contents,
'recentviews' => $recentviews,
'custom_menu' => $custom_menu,
'custom_frequently_searched_word' => $custom_frequently_searched_word,
'BreadCrumbs' => $BreadCrumbs,
'isShowLeftMenu' => $isShowLeftMenu,
'reCaptchaSiteKey' => $reCaptchaSiteKey,
'routeName' => $routeName
];
}
/**
* Function trim space (full-width | normal-space) from string
*
* @param string $str Input string
* @return string
*/
private function unicodeTrim ($str) {
return preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u','',$str);
}
/**
* お問い合わせ完了画面.
*
* @Route("/mail/complete/", name="contact_complete", methods={"GET"})
* #Route("/mypage/contact_complete/", name="mypage_contact_complete", methods={"GET"})
* @Template("Contact/complete.twig")
*/
public function complete()
{
//
$request = $this->request;
//
$routeName = $request->get('_route');
$BreadCrumbs = [];
if (preg_match('/^((?:\S+_)?contact)/', $routeName, $matches)) {
$BreadCrumbs = [
1 => $this->__getBreadCrumbs_MyPageTop(),
];
}
return [
'BreadCrumbs' => $BreadCrumbs,
'isShowLeftMenu' => true,
];
}
/**
* @Route("/mail/question", name="mail_question", methods={"GET", "POST"})
* @Template("Mail/question.twig")
*/
public function question(Request $request)
{
$goodsId = $request->get('goods_id');
$goods = $this->loadGoods($goodsId);
if (empty($goods)) {
return $this->redirectToRoute('contact');
}
$builder = $this->formFactory->createBuilder(QuestionType::class);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->render('Mail/question_confirm.twig', [
'goods' => $goods,
'form' => $form->createView(),
'reCaptchaSiteKey' => $this->reCaptchaService->getReCaptchaSiteKey(),
'path_info' => $request->getPathInfo()
]);
}
return [
'goods' => $goods,
'form' => $form->createView(),
'reCaptchaSiteKey' => $this->reCaptchaService->getReCaptchaSiteKey()
];
}
/**
* @Route("/mail/question_confirm", name="question_confirm", methods={"POST"})
* @Template("Mail/question_confirm.twig")
*/
public function questionConfirm(Request $request)
{
$goodsId = $request->get('goods_id');
$goods = $this->loadGoods($goodsId);
if (empty($goods)) {
return $this->redirectToRoute('contact');
}
$builder = $this->formFactory->createBuilder(QuestionType::class);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->reCaptchaService->handleRequest($request);
$this->mailQuestionService->createQuestion($goodsId, $form->getData());
return $this->redirectToRoute('question_complete', ['goods_id' => $goodsId]);
}
return [
'goods' => $goods,
'form' => $form->createView(),
'reCaptchaSiteKey' => $this->reCaptchaService->getReCaptchaSiteKey()
];
}
/**
* @Route("/mail/question_complete/", name="question_complete", methods={"GET"})
* @Template("Mail/question_complete.twig")
*/
public function questionComplete(Request $request)
{
$goodsId = $request->get('goods_id');
$goods = $this->loadGoods($goodsId);
if (empty($goods)) {
return $this->redirectToRoute('contact');
}
return [
'goods' => $goods,
];
}
private function loadGoods($goodsId)
{
$goods = $this->mailQuestionService->getGoodsById($goodsId);
if (empty($goods)) {
return null;
}
$goods['gp_katabans'] = $this->mailQuestionService->getGoodsKatabansById($goodsId);
$displayPrice = $this->dynamicConverter->LM_displayPriceList3($goodsId);
if ($displayPrice['mi'] != $displayPrice['ma']) {
$goods['prices'] = number_format($displayPrice['mi']) . '円~' . number_format($displayPrice['ma']) . '円(税込)';
} else {
$goods['prices'] = number_format($displayPrice['mi']) . '円(税込)';
}
return $goods;
}
private function getNewPass()
{
$str = "";
for ($i = 0; $i < 32; $i++) {
list ($usec, $sec) = explode(' ', microtime());
$rnd = (float)$sec + ((float)$usec * 100000);
mt_srand($rnd);
$rand_val = mt_rand(0, 35);
$str .= substr("abcdefghijklmnopqrstuvwxyz1234567890", $rand_val, 1);
}
return $str;
}
/**
* マイページトップのパンくず定義
* @return Array マイページトップのパンくず href, label
*/
private function __getBreadCrumbs_MyPageTop()
{
return [
'href' => $this->generateUrl('mypage'),
'label' => $this->CommonService->GetPagename('mypage'),
];
}
}