app/Plugin/SendAllMails42/Controller/Admin/ConfigController.php line 98

Open in your IDE?
  1. <?php
  2. /*
  3.  * SendAllMails4 Plugin
  4.  *
  5.  * Copyright (c) 2021 Nobuhiko Kimoto
  6.  *
  7.  * @see LICENSE
  8.  */
  9. namespace Plugin\SendAllMails42\Controller\Admin;
  10. use Eccube\Controller\AbstractController;
  11. use Eccube\Entity\MailHistory;
  12. use Eccube\Entity\MailTemplate;
  13. use Eccube\Repository\BaseInfoRepository;
  14. use Eccube\Repository\MailHistoryRepository;
  15. use Eccube\Repository\OrderRepository;
  16. use Eccube\Repository\ShippingRepository;
  17. use Eccube\Service\MailService;
  18. use Plugin\SendAllMails42\Form\Type\Admin\ConfigType;
  19. use Plugin\SendAllMails42\Form\Type\Admin\OrderMailType;
  20. use Plugin\SendAllMails42\Repository\ConfigRepository;
  21. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Mailer\MailerInterface;
  26. use Symfony\Component\Mime\Address;
  27. use Symfony\Component\Mime\Email;
  28. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  29. use Twig\Environment;
  30. class ConfigController extends AbstractController
  31. {
  32.     /**
  33.      * @var ConfigRepository
  34.      */
  35.     protected $configRepository;
  36.     /**
  37.      * ConfigController constructor.
  38.      *
  39.      * @param ConfigRepository $configRepository
  40.      */
  41.     public function __construct(
  42.         ConfigRepository $configRepository,
  43.         BaseInfoRepository $baseInfoRepository,
  44.         MailerInterface $mailer,
  45.         MailService $mailService,
  46.         MailHistoryRepository $mailHistoryRepository,
  47.         ShippingRepository $shippingRepository,
  48.         OrderRepository $orderRepository
  49.     )
  50.     {
  51.         $this->configRepository $configRepository;
  52.         $this->BaseInfo $baseInfoRepository->get();
  53.         $this->mailer $mailer;
  54.         $this->mailService $mailService;
  55.         $this->mailHistoryRepository $mailHistoryRepository;
  56.         $this->shippingRepository $shippingRepository;
  57.         $this->orderRepository $orderRepository;
  58.     }
  59.     /**
  60.      * @Route("/%eccube_admin_route%/send_all_mails42/config", name="send_all_mails42_admin_config")
  61.      * @Template("@SendAllMails42/admin/config.twig")
  62.      */
  63.     public function index(Request $request)
  64.     {
  65.         $Config $this->configRepository->get();
  66.         $form $this->createForm(ConfigType::class, $Config);
  67.         $form->handleRequest($request);
  68.         if ($form->isSubmitted() && $form->isValid()) {
  69.             $Config $form->getData();
  70.             $this->entityManager->persist($Config);
  71.             $this->entityManager->flush($Config);
  72.             $this->addSuccess('登録しました。''admin');
  73.             return $this->redirectToRoute('send_all_mails42_admin_config');
  74.         }
  75.         return [
  76.             'form' => $form->createView(),
  77.         ];
  78.     }
  79.     /**
  80.      * @Route("/%eccube_admin_route%/send_all_mails42/mail/{ids}", name="send_all_mails42_admin_mail")
  81.      * @Template("@SendAllMails42/admin/mail.twig")
  82.      */
  83.     public function mail(Request $requestEnvironment $twig$ids)
  84.     {
  85.         // たぶん正しくはない
  86.         $Orders = [];
  87.         foreach(explode(','$ids) as $id) {
  88.             $Shipping $this->shippingRepository->find($id);
  89.             if (null === $Shipping) {
  90.                 throw new NotFoundHttpException();
  91.             }
  92.             $Orders[] = $Shipping->getOrder();
  93.         }
  94.         $Order $Orders[0];
  95.         $builder $this->formFactory->createBuilder(OrderMailType::class);
  96.         $form $builder->getForm();
  97.         if ('POST' === $request->getMethod()) {
  98.             $form->handleRequest($request);
  99.             $mode $request->get('mode');
  100.             $body null;
  101.             // テンプレート変更の場合は. バリデーション前に内容差し替え.
  102.             switch ($mode) {
  103.                 case 'change':
  104.                     if ($form->get('template')->isValid()) {
  105.                         /** @var $data \Eccube\Entity\MailTemplate */
  106.                         $MailTemplate $form->get('template')->getData();
  107.                         $data $form->getData();
  108.                         if ($MailTemplate) {
  109.                             $htmlFileName $MailTemplate $this->getHtmlFileName($MailTemplate->getFileName()) : null;
  110.                             $form $builder->getForm();
  111.                             $form->get('template')->setData($MailTemplate);
  112.                             $source $twig->getLoader()
  113.                                            ->getSourceContext($MailTemplate->getFileName())
  114.                                            ->getCode();
  115.                             $form->get('tpl_data')->setData($source);
  116.                             $form->get('mail_subject')->setData($MailTemplate->getMailSubject());
  117.                             /* htmlメールは後で考える
  118.                             if ($twig->getLoader()->exists($htmlFileName)) {
  119.                                 $source = $twig->getLoader()
  120.                                                ->getSourceContext($htmlFileName)
  121.                                                ->getCode();
  122.                                 $form->get('html_tpl_data')->setData($source);
  123.                             }*/
  124.                         }
  125.                     }
  126.                     break;
  127.                 case 'confirm':
  128.                     if ($form->isValid()) {
  129.                         $preview $this->createBody($twig$Order$form->get('tpl_data')->getData());
  130.                         return $this->render('@SendAllMails42/admin/mail_confirm.twig', [
  131.                             'form' => $form->createView(),
  132.                             'preview' => $preview,
  133.                             'Orders' => $Orders,
  134.                             'ids' => $ids,
  135.                         ]);
  136.                     }
  137.                     break;
  138.                 case 'complete':
  139.                     if ($form->isValid()) {
  140.                         $data $form->getData();
  141.                         $success 0;
  142.                         $failedMail = [];
  143.                         foreach($Orders as $Order) {
  144.                             $body $this->createBody($twig$Order$form->get('tpl_data')->getData());
  145.                             $message = (new Email())
  146.                                 ->subject('['.$this->BaseInfo->getShopName().'] '.$data['mail_subject'])
  147.                                 ->from(new Address($this->BaseInfo->getEmail01(), $this->BaseInfo->getShopName()))
  148.                                 ->to($this->mailService->convertRFCViolatingEmail($Order->getEmail()))
  149.                                 ->bcc($this->BaseInfo->getEmail01())
  150.                                 ->replyTo($this->BaseInfo->getEmail03())
  151.                                 ->returnPath($this->BaseInfo->getEmail04())
  152.                             ;
  153.                             // todo
  154.                             $message->text($body);
  155.                             try {
  156.                                 $this->mailer->send($message);
  157.                                 $MailHistory = new MailHistory();
  158.                                 $MailHistory->setMailSubject($message->getSubject())
  159.                                             ->setMailBody($message->getTextBody())
  160.                                             ->setOrder($Order)
  161.                                             ->setSendDate(new \DateTime());
  162.                                 $this->entityManager->persist($MailHistory);
  163.                                 $this->entityManager->flush($MailHistory);
  164.                                 $success++;
  165.                             } catch (TransportExceptionInterface $e) {
  166.                                 $failedMail[] = $Order->getEmail();
  167.                             }
  168.                         }
  169.                         $this->addSuccess('メールを送信しました。' $success '/' count($Orders) . "件"'admin');
  170.                         if (count($failedMail) > 0) {
  171.                             $this->addError('[送信失敗アドレス]'.implode(','$failedMail), 'admin');
  172.                         }
  173.                         return $this->redirectToRoute('admin_order', ['resume' => 1]);
  174.                     }
  175.                     break;
  176.                 default:
  177.                     break;
  178.             }
  179.         }
  180.         return [
  181.             'form' => $form->createView(),
  182.             'Orders' => $Orders,
  183.             'ids' => $ids,
  184.             //'MailHistories' => $MailHistories,
  185.         ];
  186.     }
  187.     protected function createBody($twig$Order$content)
  188.     {
  189.         $tpl $twig->createTemplate($content);
  190.         return $tpl->render([
  191.             'Order' => $Order,
  192.         ]);
  193.     }
  194.     /**
  195.      * HTML用テンプレート名を取得する
  196.      *
  197.      * @param  string $fileName
  198.      *
  199.      * @return string
  200.      */
  201.     protected function getHtmlFileName($fileName)
  202.     {
  203.         // HTMLテンプレートファイルの取得
  204.         $targetTemplate pathinfo($fileName);
  205.         $suffix '.html';
  206.         return $targetTemplate['dirname'].DIRECTORY_SEPARATOR.$targetTemplate['filename'].$suffix.'.'.$targetTemplate['extension'];
  207.     }
  208. }