<?php
/*
* SendAllMails4 Plugin
*
* Copyright (c) 2021 Nobuhiko Kimoto
*
* @see LICENSE
*/
namespace Plugin\SendAllMails42\Controller\Admin;
use Eccube\Controller\AbstractController;
use Eccube\Entity\MailHistory;
use Eccube\Entity\MailTemplate;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\MailHistoryRepository;
use Eccube\Repository\OrderRepository;
use Eccube\Repository\ShippingRepository;
use Eccube\Service\MailService;
use Plugin\SendAllMails42\Form\Type\Admin\ConfigType;
use Plugin\SendAllMails42\Form\Type\Admin\OrderMailType;
use Plugin\SendAllMails42\Repository\ConfigRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Twig\Environment;
class ConfigController extends AbstractController
{
/**
* @var ConfigRepository
*/
protected $configRepository;
/**
* ConfigController constructor.
*
* @param ConfigRepository $configRepository
*/
public function __construct(
ConfigRepository $configRepository,
BaseInfoRepository $baseInfoRepository,
MailerInterface $mailer,
MailService $mailService,
MailHistoryRepository $mailHistoryRepository,
ShippingRepository $shippingRepository,
OrderRepository $orderRepository
)
{
$this->configRepository = $configRepository;
$this->BaseInfo = $baseInfoRepository->get();
$this->mailer = $mailer;
$this->mailService = $mailService;
$this->mailHistoryRepository = $mailHistoryRepository;
$this->shippingRepository = $shippingRepository;
$this->orderRepository = $orderRepository;
}
/**
* @Route("/%eccube_admin_route%/send_all_mails42/config", name="send_all_mails42_admin_config")
* @Template("@SendAllMails42/admin/config.twig")
*/
public function index(Request $request)
{
$Config = $this->configRepository->get();
$form = $this->createForm(ConfigType::class, $Config);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$Config = $form->getData();
$this->entityManager->persist($Config);
$this->entityManager->flush($Config);
$this->addSuccess('登録しました。', 'admin');
return $this->redirectToRoute('send_all_mails42_admin_config');
}
return [
'form' => $form->createView(),
];
}
/**
* @Route("/%eccube_admin_route%/send_all_mails42/mail/{ids}", name="send_all_mails42_admin_mail")
* @Template("@SendAllMails42/admin/mail.twig")
*/
public function mail(Request $request, Environment $twig, $ids)
{
// たぶん正しくはない
$Orders = [];
foreach(explode(',', $ids) as $id) {
$Shipping = $this->shippingRepository->find($id);
if (null === $Shipping) {
throw new NotFoundHttpException();
}
$Orders[] = $Shipping->getOrder();
}
$Order = $Orders[0];
$builder = $this->formFactory->createBuilder(OrderMailType::class);
$form = $builder->getForm();
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
$mode = $request->get('mode');
$body = null;
// テンプレート変更の場合は. バリデーション前に内容差し替え.
switch ($mode) {
case 'change':
if ($form->get('template')->isValid()) {
/** @var $data \Eccube\Entity\MailTemplate */
$MailTemplate = $form->get('template')->getData();
$data = $form->getData();
if ($MailTemplate) {
$htmlFileName = $MailTemplate ? $this->getHtmlFileName($MailTemplate->getFileName()) : null;
$form = $builder->getForm();
$form->get('template')->setData($MailTemplate);
$source = $twig->getLoader()
->getSourceContext($MailTemplate->getFileName())
->getCode();
$form->get('tpl_data')->setData($source);
$form->get('mail_subject')->setData($MailTemplate->getMailSubject());
/* htmlメールは後で考える
if ($twig->getLoader()->exists($htmlFileName)) {
$source = $twig->getLoader()
->getSourceContext($htmlFileName)
->getCode();
$form->get('html_tpl_data')->setData($source);
}*/
}
}
break;
case 'confirm':
if ($form->isValid()) {
$preview = $this->createBody($twig, $Order, $form->get('tpl_data')->getData());
return $this->render('@SendAllMails42/admin/mail_confirm.twig', [
'form' => $form->createView(),
'preview' => $preview,
'Orders' => $Orders,
'ids' => $ids,
]);
}
break;
case 'complete':
if ($form->isValid()) {
$data = $form->getData();
$success = 0;
$failedMail = [];
foreach($Orders as $Order) {
$body = $this->createBody($twig, $Order, $form->get('tpl_data')->getData());
$message = (new Email())
->subject('['.$this->BaseInfo->getShopName().'] '.$data['mail_subject'])
->from(new Address($this->BaseInfo->getEmail01(), $this->BaseInfo->getShopName()))
->to($this->mailService->convertRFCViolatingEmail($Order->getEmail()))
->bcc($this->BaseInfo->getEmail01())
->replyTo($this->BaseInfo->getEmail03())
->returnPath($this->BaseInfo->getEmail04())
;
// todo
$message->text($body);
try {
$this->mailer->send($message);
$MailHistory = new MailHistory();
$MailHistory->setMailSubject($message->getSubject())
->setMailBody($message->getTextBody())
->setOrder($Order)
->setSendDate(new \DateTime());
$this->entityManager->persist($MailHistory);
$this->entityManager->flush($MailHistory);
$success++;
} catch (TransportExceptionInterface $e) {
$failedMail[] = $Order->getEmail();
}
}
$this->addSuccess('メールを送信しました。' . $success . '/' . count($Orders) . "件", 'admin');
if (count($failedMail) > 0) {
$this->addError('[送信失敗アドレス]'.implode(',', $failedMail), 'admin');
}
return $this->redirectToRoute('admin_order', ['resume' => 1]);
}
break;
default:
break;
}
}
return [
'form' => $form->createView(),
'Orders' => $Orders,
'ids' => $ids,
//'MailHistories' => $MailHistories,
];
}
protected function createBody($twig, $Order, $content)
{
$tpl = $twig->createTemplate($content);
return $tpl->render([
'Order' => $Order,
]);
}
/**
* HTML用テンプレート名を取得する
*
* @param string $fileName
*
* @return string
*/
protected function getHtmlFileName($fileName)
{
// HTMLテンプレートファイルの取得
$targetTemplate = pathinfo($fileName);
$suffix = '.html';
return $targetTemplate['dirname'].DIRECTORY_SEPARATOR.$targetTemplate['filename'].$suffix.'.'.$targetTemplate['extension'];
}
}