app/Plugin/Shiro8Download42/Event.php line 301

Open in your IDE?
  1. <?php
  2. namespace Plugin\Shiro8Download42;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Eccube\Common\EccubeConfig;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Eccube\Event\EccubeEvents;
  7. use Eccube\Event\TemplateEvent;
  8. use Eccube\Event\EventArgs;
  9. use Plugin\Shiro8Download42\Repository\Shiro8ProductFileRepository;
  10. use Plugin\Shiro8Download42\Repository\Shiro8OrderDetailFileRepository;
  11. use Plugin\Shiro8Download42\Repository\ConfigRepository;
  12. use Plugin\Shiro8Download42\Entity\Shiro8ProductFile;
  13. use Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException;
  14. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  18. use Symfony\Component\Form\Extension\Core\Type\TextType;
  19. use Symfony\Component\Form\Extension\Core\Type\FileType;
  20. use Symfony\Component\Validator\Constraints as Assert;
  21. use Eccube\Service\CartService;
  22. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  23. use Symfony\Component\DependencyInjection\ContainerInterface;
  24. use Twig\Environment;
  25. use Symfony\Contracts\Translation\TranslatorInterface;
  26. class Event implements EventSubscriberInterface
  27. {
  28.     /**
  29.      * プラグインが追加するフォーム名.
  30.      */
  31.     const PRODUCT_DOWNLOAD_FILE 'plg_shiro8_product_file_file';
  32.     const PRODUCT_DOWNLOAD 'plg_shiro8_product_file';
  33.     const PRODUCT_DOWNLOAD_DEL_FLG 'plg_shiro8_product_file_del_flg';
  34.     
  35.     /**
  36.      * @var Environment
  37.      */
  38.     private $twig;
  39.     
  40.     /**
  41.      * @var ContainerInterface
  42.      */
  43.     protected $container;
  44.     
  45.     /**
  46.      * @var CartService
  47.      */
  48.     protected $cartService;
  49.     
  50.     /**
  51.      * @var EccubeConfig
  52.      */
  53.     private $eccubeConfig;
  54.     
  55.     /**
  56.      * @var TranslatorInterface
  57.      */
  58.     protected $translator;
  59.     
  60.     /**
  61.      * @var EntityManagerInterface
  62.      */
  63.     private $entityManager;
  64.     
  65.     /**
  66.      * @var Shiro8ProductFileRepository
  67.      */
  68.     private $shiro8ProductFileRepository;
  69.     
  70.     /**
  71.      * @var ConfigRepository
  72.      */
  73.     private $configRepository;
  74.     
  75.     /**
  76.      * @var Shiro8OrderDetailFileRepository
  77.      */
  78.     private $shiro8OrderDetailFileRepository;
  79.     
  80.     /**
  81.      *
  82.      * @param ContainerInterface $container
  83.      * @param CartService $cartService
  84.      * @param EccubeConfig $eccubeConfig
  85.      * @param EntityManagerInterface $entityManager
  86.      * @param Shiro8ProductFileRepository $shiro8ProductFileRepository
  87.      */
  88.     public function __construct(Environment $twigTranslatorInterface $translator
  89.         ContainerInterface $container
  90.         CartService $cartService
  91.         EccubeConfig $eccubeConfig
  92.         EntityManagerInterface $entityManager
  93.         Shiro8ProductFileRepository $shiro8ProductFileRepository
  94.         ConfigRepository $configRepository
  95.         Shiro8OrderDetailFileRepository $shiro8OrderDetailFileRepository)
  96.     {
  97.         $this->twig $twig;
  98.         $this->translator $translator;
  99.         $this->container $container;
  100.         $this->cartService $cartService;
  101.         $this->eccubeConfig $eccubeConfig;
  102.         $this->entityManager $entityManager;
  103.         $this->shiro8ProductFileRepository $shiro8ProductFileRepository;
  104.         $this->configRepository $configRepository;
  105.         $this->shiro8OrderDetailFileRepository $shiro8OrderDetailFileRepository;
  106.     }
  107.     
  108.     /**
  109.      * @return array
  110.      */
  111.     public static function getSubscribedEvents()
  112.     {
  113.         return [
  114.             EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE => 'onAdminProductFormInitialize',
  115.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete',
  116.             '@admin/Product/product.twig' => 'onRenderAdminProduct',
  117.             'Product/detail.twig' => 'onRenderProductDetail',
  118.             'Product/list.twig' => 'onRenderProductList',
  119.             EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE => 'onFrontProductCartAddComplete',
  120.             'Mypage/index.twig' => 'onRenderMyPageIndex',
  121.             '@user_data/history_list.twig' => 'onRenderMyPageIndex'//追加
  122.             'Mypage/history.twig' => 'onRenderMyPageHistory',
  123.             EccubeEvents::MAIL_ORDER => 'onOrderReplaceForMail',
  124.         ];
  125.     }
  126.     
  127.     /**
  128.      * 管理画面:商品登録画面に, 商品コンテンツのフォームを追加する.
  129.      *
  130.      * @param EventArgs $event
  131.      */
  132.     public function onAdminProductFormInitialize(EventArgs $event)
  133.     {
  134.         
  135.         /* @var Category $TargetCategory */
  136.         $Product $event->getArgument('Product');
  137.         $id $Product->getId();
  138.         $ProductClasses $Product->getProductClasses();
  139.         $ProductClass $ProductClasses[0];
  140.         //規格無しの場合
  141.         if (!$Product->hasProductClass()) {
  142.             $ProductFile null;
  143.             if ($ProductClass->getId()) {
  144.                 // 商品編集時は初期値を取得
  145.                 $ProductFile $this->shiro8ProductFileRepository->find($ProductClass->getId());
  146.             }
  147.             // 商品新規登録またはコンテンツが未登録の場合
  148.             if (!$ProductFile) {
  149.                 $ProductFile = new Shiro8ProductFile();
  150.             }
  151.             
  152.             // フォームの追加
  153.             /** @var FormInterface $builder */
  154.             // 初期値を設定
  155.             $builder $event->getArgument('builder');
  156.             if ($ProductFile->getFile() != '') {
  157.                 $builder->get(self::PRODUCT_DOWNLOAD)->setData($ProductFile->getFile());
  158.             } else {
  159.                 $builder->get(self::PRODUCT_DOWNLOAD)->setData(null);
  160.             }
  161.         
  162.         }
  163.         
  164.     }
  165.     
  166.     /**
  167.      * 管理画面:商品登録画面で、登録処理を行う.
  168.      *
  169.      * @param EventArgs $event
  170.      */
  171.     public function onAdminProductEditComplete(EventArgs $event)
  172.     {
  173.         
  174.         //イベント元からの値を取得
  175.         $Product $event->getArgument('Product');
  176.         $form $event->getArgument('form');
  177.         
  178.         //規格無しの場合
  179.         if (!$Product->hasProductClass()) {
  180.         
  181.             // 現在のエンティティを取得
  182.             $id $Product->getId();
  183.             $ProductClasses $Product->getProductClasses();
  184.             $ProductClass $ProductClasses[0];
  185.             
  186.             $ProductFile $this->shiro8ProductFileRepository->find($ProductClass->getId());
  187.             
  188.             if (!$ProductFile) {
  189.                 $ProductFile = new Shiro8ProductFile();
  190.             }
  191.             
  192.             // ファイルアップロード
  193.             $image $form[self::PRODUCT_DOWNLOAD_FILE]->getData();
  194.             $filename null;
  195.             if (isset($image)) {
  196.                 //ファイルフォーマット検証
  197.                 $mimeType $image->getMimeType();
  198.                 if (false !== strpos($mimeType'pdf') || $mimeType == 'application/zip' || $mimeType == 'application/x-gzip' 
  199.                     || false !== strpos($mimeType'image') || $mimeType == 'text/plain' || $mimeType == 'application/gzip') {
  200.                     //何もしない
  201.                 } else {
  202.                     throw new UnsupportedMediaTypeHttpException('ファイル形式が不正です');
  203.                 }
  204.                 
  205.                 $extension $image->guessExtension();
  206.                 $filename date('mdHis') . uniqid('_') . '.' $extension;
  207.                 $image->move($this->eccubeConfig['plugin_data_realdir'] . "/Shiro8Download42/Resource"$filename);
  208.             }
  209.             
  210.             $fileNameOld $form[self::PRODUCT_DOWNLOAD]->getData();
  211.             $fileDelFlg $form[self::PRODUCT_DOWNLOAD_DEL_FLG]->getData();
  212.             if ($fileDelFlg == || ($fileNameOld == "" && $filename == "")) {
  213.                 // エンティティを更新
  214.                 $ProductFile
  215.                     ->setId($ProductClass->getId())
  216.                     ->setFile(null);
  217.                 // DB更新
  218.                 $this->entityManager->persist($ProductFile);
  219.                 $this->entityManager->flush($ProductFile);
  220.             } else if ($filename != "") {
  221.                 //ファイルがアップロードされている
  222.                 // エンティティを更新
  223.                 $ProductFile
  224.                     ->setId($ProductClass->getId())
  225.                     ->setFile($filename);
  226.                 // DB更新
  227.                 $this->entityManager->persist($ProductFile);
  228.                 $this->entityManager->flush($ProductFile);
  229.             } else {
  230.                 // エンティティを更新
  231.                 $ProductFile
  232.                     ->setId($ProductClass->getId())
  233.                     ->setFile($fileNameOld);
  234.                 // DB更新
  235.                 $this->entityManager->persist($ProductFile);
  236.                 $this->entityManager->flush($ProductFile);
  237.             }
  238.         
  239.         }
  240.         
  241.     }
  242.     
  243.     /**
  244.      * 管理画面:商品登録画面にファイル編集フォームを表示する.
  245.      *
  246.      * @param TemplateEvent $event
  247.      */
  248.     public function onRenderAdminProduct(TemplateEvent $event)
  249.     {
  250.         $event->addSnippet('@Shiro8Download42/admin/Product/product.twig');
  251.     }
  252.     
  253.     /**
  254.      * 商品詳細画面に商品コンテンツを表示する.
  255.      *
  256.      * @param TemplateEvent $event
  257.      */
  258.     public function onRenderProductDetail(TemplateEvent $event)
  259.     {
  260.         $parameters $event->getParameters();
  261.         
  262.         // 商品がない場合、レンダリングしない
  263.         if (!$parameters['Product']) {
  264.             return;
  265.         }
  266.         
  267.         // twigパラメータにカテゴリコンテンツを追加
  268.         $loginFlg true;
  269.         $Product $parameters['Product'];
  270.         if (!$Product->hasProductClass()) {
  271.             $ProductClasses $Product->getProductClasses();
  272.             $ProductClass $ProductClasses[0];
  273.             $ProductFile null;
  274.             if ($ProductClass->getId()) {
  275.                 // 商品編集時は初期値を取得
  276.                 $ProductFile $this->shiro8ProductFileRepository->find($ProductClass->getId());
  277.             }
  278.             // 商品新規登録またはコンテンツが未登録の場合
  279.             if ($ProductFile && $ProductFile->getFile() != '') {
  280.                 //ログイン済みか判定
  281.                 $loginFlg $this->isGranted('ROLE_USER');
  282.             }
  283.             
  284.         }
  285.         
  286.         $parameters['hasProductFileAndSignIn'] = $loginFlg;
  287.         
  288.         
  289.         //ダウンロード販売規格商品判定用に配列を作る
  290.         $class_categories = array();
  291.         
  292.         foreach ($Product->getProductClasses() as $ProductClass) {
  293.             $ClassCategory1 $ProductClass->getClassCategory1();
  294.             $ClassCategory2 $ProductClass->getClassCategory2();
  295.             $ProductFile $this->shiro8ProductFileRepository->find($ProductClass->getId());
  296.             $dlFlg false;
  297.             if ($ProductFile && $ProductFile->getFile() != '') {
  298.                 $dlFlg true;
  299.             }
  300.             $class_category_id1 $ClassCategory1 ? (string) $ClassCategory1->getId() : '__unselected2';
  301.             $class_category_id2 $ClassCategory2 ? (string) $ClassCategory2->getId() : '';
  302.             
  303.             $class_categories[$class_category_id1]['#'.$class_category_id2] = array(
  304.                 'dl_find' => $dlFlg
  305.             );
  306.         }
  307.         
  308.         $parameters['product_class_categories'] = $class_categories;
  309.         
  310.         $event->setParameters($parameters);
  311.         
  312.         
  313.         $event->addSnippet('@Shiro8Download42/default/Product/product.twig');
  314.         
  315.     }
  316.     
  317.     /**
  318.      * 商品一覧画面に商品コンテンツを表示する.
  319.      *
  320.      * @param TemplateEvent $event
  321.      */
  322.     public function onRenderProductList(TemplateEvent $event)
  323.     {
  324.         $parameters $event->getParameters();
  325.         // 商品がない場合、レンダリングしない
  326.         if (!$parameters['pagination'] || count($parameters['pagination']) == 0) {
  327.             return;
  328.         }
  329.         
  330.         $loginFlgs = array();
  331.         foreach ($parameters['pagination'] as $k => $Product) {
  332.         
  333.             // twigパラメータにカテゴリコンテンツを追加
  334.             $loginFlg true;
  335.             if (!$Product->hasProductClass()) {
  336.                 $ProductClasses $Product->getProductClasses();
  337.                 $ProductClass $ProductClasses[0];
  338.                 $ProductFile null;
  339.                 if ($ProductClass->getId()) {
  340.                     // 商品編集時は初期値を取得
  341.                     $ProductFile $this->shiro8ProductFileRepository->find($ProductClass->getId());
  342.                 }
  343.                 // 商品新規登録またはコンテンツが未登録の場合
  344.                 if ($ProductFile && $ProductFile->getFile() != '') {
  345.                     //ログイン済みか判定
  346.                     $loginFlg $this->isGranted('ROLE_USER');
  347.                 }
  348.                 
  349.             }
  350.             
  351.             $loginFlgs[$k] = $loginFlg;
  352.         
  353.         }
  354.         
  355.         $parameters['hasProductFileAndSignIn'] = $loginFlgs;
  356.         
  357.         
  358.         //ダウンロード販売規格商品判定用に配列を作る
  359.         $class_categories = array();
  360.         
  361.         foreach ($parameters['pagination'] as $Product) {
  362.             foreach ($Product->getProductClasses() as $ProductClass) {
  363.                 $ClassCategory1 $ProductClass->getClassCategory1();
  364.                 $ClassCategory2 $ProductClass->getClassCategory2();
  365.                 $ProductFile $this->shiro8ProductFileRepository->find($ProductClass->getId());
  366.                 $dlFlg false;
  367.                 if ($ProductFile && $ProductFile->getFile() != '') {
  368.                     $dlFlg true;
  369.                 }
  370.                 $class_category_id1 $ClassCategory1 ? (string) $ClassCategory1->getId() : '__unselected2';
  371.                 $class_category_id2 $ClassCategory2 ? (string) $ClassCategory2->getId() : '';
  372.                 
  373.                 $class_categories[$Product->getId()][$class_category_id1]['#'.$class_category_id2] = array(
  374.                     'dl_find' => $dlFlg
  375.                 );
  376.             }
  377.         }
  378.         
  379.         $parameters['product_class_categories'] = $class_categories;
  380.         
  381.         $event->setParameters($parameters);
  382.         
  383.         
  384.         $event->addSnippet('@Shiro8Download42/default/Product/list.twig');
  385.         
  386.     }
  387.     
  388.     /**
  389.      * 管理画面:商品登録画面で、登録処理を行う.
  390.      *
  391.      * @param EventArgs $event
  392.      */
  393.     public function onFrontProductCartAddComplete(EventArgs $event)
  394.     {
  395.         
  396.         //イベント元からの値を取得
  397.         $Product $event->getArgument('Product');
  398.         $form $event->getArgument('form');
  399.         $addCartData $form->getData();
  400.         
  401.         $ProductFile $this->shiro8ProductFileRepository->find($addCartData['product_class_id']);
  402.         // 商品新規登録またはコンテンツが未登録の場合
  403.         $isDownload false;
  404.         if ($ProductFile && $ProductFile->getFile() != '') {
  405.             $isDownload true;
  406.         }
  407.         
  408.         // カスタマイズ開始 ゲストでもカートに入れられるように
  409.         // if ($isDownload && !$this->isGranted('ROLE_USER')) {
  410.             //カートの中身を削除
  411.             // $this->cartService->removeProduct($addCartData['product_class_id']);
  412.             
  413.             //エラーを返す
  414.             // throw new NotFoundHttpException();
  415.             
  416.         // }
  417.         // カスタマイズ終了
  418.         
  419.     }
  420.     
  421.     /**
  422.      * マイページの購入履歴にダウンロードリンクを表示する.
  423.      *
  424.      * @param TemplateEvent $event
  425.      */
  426.     public function onRenderMyPageIndex(TemplateEvent $event)
  427.     {
  428.         $parameters $event->getParameters();
  429.         // 商品がない場合、レンダリングしない
  430.         //if (!$parameters['pagination']) {
  431.         if (!$parameters['photos']) {
  432.             return;
  433.         }
  434.         // twigコードにコンテンツを挿入
  435.         $sourceOrigin $event->getSource();
  436.         //$search = '× {{ OrderItem.quantity }}</p> ';
  437.         $search '<a class="dl_btn"></a>';
  438.         
  439.         $snipet $this->twig->getLoader()->getSourceContext('@Shiro8Download42/default/Mypage/index.twig')->getCode();
  440.         $source str_replace($search$snipet$sourceOrigin);
  441.         $event->setSource($source);
  442.         
  443.         $addCartSetting $this->configRepository->find(1);
  444.         // twigパラメータにコンテンツを追加
  445.         $orderDetailFiles = array();
  446.         $orderDetailFlgs = array();
  447.         //$Orders = $parameters['pagination'];
  448.         $Orders $parameters['photos'];
  449.         foreach ($Orders as $Order) {
  450.         
  451.             //入金済みか判定
  452.             if ($Order->getPaymentDate() == '') {
  453.                 continue;
  454.             }
  455.             
  456.             $OrderDetails $Order->getOrderItems();
  457.             foreach ($OrderDetails as $v) {
  458.                 if ($v->isProduct()) {
  459.                     $OrderDetailFile $this->shiro8OrderDetailFileRepository->findOneBy(['order_item_id' => $v->getId()]);
  460.                     
  461.                     if ($OrderDetailFile && $OrderDetailFile->getRand() != '') {
  462.                         //ダウンロード可否の判定
  463.                         if ($addCartSetting->getUseFlg() == 1) {
  464.                             //回数
  465.                             if ($addCartSetting->getDlCount() > $OrderDetailFile->getDlCount()) {
  466.                                 $orderDetailFiles[$v->getId()] = $OrderDetailFile->getRand();
  467.                                 $orderDetailFlgs[$v->getId()] = true;
  468.                             } else {
  469.                                 $orderDetailFlgs[$v->getId()] = false;
  470.                             }
  471.                         } else if ($addCartSetting->getUseFlg() == 2) {
  472.                             //無制限
  473.                             $orderDetailFiles[$v->getId()] = $OrderDetailFile->getRand();
  474.                             $orderDetailFlgs[$v->getId()] = true;
  475.                         } else {
  476.                             //入金日からの日数
  477.                             if ($Order->getPaymentDate()->modify(" + " $addCartSetting->getDateCount() . " day")->getTimestamp() > time()) {
  478.                                 $orderDetailFiles[$v->getId()] = $OrderDetailFile->getRand();
  479.                                 $orderDetailFlgs[$v->getId()] = true;
  480.                             } else {
  481.                                 $orderDetailFlgs[$v->getId()] = false;
  482.                             }
  483.                         }
  484.                     }
  485.                 }
  486.             }
  487.             
  488.         }
  489.         
  490.         
  491.         $parameters['orderDetailFiles'] = $orderDetailFiles;
  492.         $parameters['orderDetailFlgs'] = $orderDetailFlgs;
  493.         $parameters['dateCount'] = $addCartSetting->getDateCount();
  494.         $event->setParameters($parameters);
  495.     }
  496.     
  497.     /**
  498.      * マイページの購入履歴詳細にダウンロードリンクを表示する.
  499.      *
  500.      * @param TemplateEvent $event
  501.      */
  502.     public function onRenderMyPageHistory(TemplateEvent $event)
  503.     {
  504.         $parameters $event->getParameters();
  505.         // 商品がない場合、レンダリングしない
  506.         if (!$parameters['Order']) {
  507.             return;
  508.         }
  509.         // twigコードにカテゴリコンテンツを挿入
  510.         $sourceOrigin $event->getSource();
  511.         $search '× {{ orderItem.quantity|number_format }}</p>';
  512.         
  513.         $snipet $this->twig->getLoader()->getSourceContext('@Shiro8Download42/default/Mypage/history.twig')->getCode();
  514.         $source str_replace($search$snipet$sourceOrigin);
  515.         
  516.         
  517.         $event->setSource($source);
  518.         
  519.         $addCartSetting $this->configRepository->find(1);
  520.         // twigパラメータにカテゴリコンテンツを追加
  521.         $orderDetailFiles = array();
  522.         $orderDetailFlgs = array();
  523.         $orderDetailMsgs = array();
  524.         $Order $parameters['Order'];
  525.         
  526.         //入金済みか判定
  527.         if ($Order->getPaymentDate() != '') {
  528.         
  529.             $paymentDateLimit $Order->getPaymentDate()->modify(" + " $addCartSetting->getDateCount() . " day");
  530.             
  531.             $OrderDetails $Order->getOrderItems();
  532.             foreach ($OrderDetails as $v) {
  533.                 if ($v->isProduct()) {
  534.                     $OrderDetailFile $this->shiro8OrderDetailFileRepository->findOneBy(['order_item_id' => $v->getId()]);
  535.                     
  536.                     
  537.                     if ($OrderDetailFile && $OrderDetailFile->getRand() != '') {
  538.                         //ダウンロード可否の判定
  539.                         if ($addCartSetting->getUseFlg() == 1) {
  540.                             //回数
  541.                             if ($addCartSetting->getDlCount() > $OrderDetailFile->getDlCount()) {
  542.                                 $orderDetailFiles[$v->getId()] = $OrderDetailFile->getRand();
  543.                                 $orderDetailFlgs[$v->getId()] = true;
  544.                                 $orderDetailMsgs[$v->getId()] = $this->translator->trans('plugin_shiro8_download42.mypage.button');
  545.                             } else {
  546.                                 $orderDetailFlgs[$v->getId()] = false;
  547.                                 $orderDetailMsgs[$v->getId()] = $this->translator->trans('plugin_shiro8_download42.mypage.button.alert1');
  548.                             }
  549.                         } else if ($addCartSetting->getUseFlg() == 2) {
  550.                             //無制限
  551.                             $orderDetailFiles[$v->getId()] = $OrderDetailFile->getRand();
  552.                             $orderDetailFlgs[$v->getId()] = true;
  553.                             $orderDetailMsgs[$v->getId()] = $this->translator->trans('plugin_shiro8_download42.mypage.button');
  554.                         } else {
  555.                             //入金日からの日数
  556.                             if ($paymentDateLimit->getTimestamp() > time()) {
  557.                                 $orderDetailFiles[$v->getId()] = $OrderDetailFile->getRand();
  558.                                 $orderDetailFlgs[$v->getId()] = true;
  559.                                 $orderDetailMsgs[$v->getId()] = $this->translator->trans('plugin_shiro8_download42.mypage.button');
  560.                             } else {
  561.                                 $orderDetailFlgs[$v->getId()] = false;
  562.                                 $orderDetailMsgs[$v->getId()] = $this->translator->trans('plugin_shiro8_download42.mypage.button.alert2');
  563.                             }
  564.                         }
  565.                     }
  566.                 }
  567.             }
  568.         
  569.         }
  570.         
  571.         $parameters['orderDetailFiles'] = $orderDetailFiles;
  572.         $parameters['orderDetailFlgs'] = $orderDetailFlgs;
  573.         $parameters['orderDetailMsgs'] = $orderDetailMsgs;
  574.         
  575.         $event->setParameters($parameters);
  576.     }
  577.     
  578.     /**
  579.      * 注文メールに文言を表示する.
  580.      *
  581.      * @param TemplateEvent $event
  582.      */
  583.     public function onOrderReplaceForMail(EventArgs $event)
  584.     {
  585.         $message $event->getArgument('message');
  586.         $Order $event->getArgument('Order');
  587.         $MailTemplate $event->getArgument('MailTemplate');
  588.         $BaseInfo $event->getArgument('BaseInfo');
  589.         
  590.         // レンダリング実行.
  591.         // twigファイルのソースコードを読み込み, 文字列化.
  592.         $view $MailTemplate->getFileName();
  593.         
  594.         $source $this->twig->getLoader()->getSourceContext($view)->getCode();
  595.         // イベントの実行.
  596.         // プラグインにはテンプレートファイル名、文字列化されたtwigファイル、パラメータを渡す
  597.         $TemplateEvent = new TemplateEvent($view$source, array(
  598.             'Order' => $Order,
  599.         ), null);
  600.         
  601.         $snipet $this->twig->getLoader()->getSourceContext('@Shiro8Download42/default/Mail/order.twig')->getCode();
  602.         $sourceOrigin $TemplateEvent->getSource();
  603.         $search '数量:{{ OrderItem.quantity|number_format }}';
  604.         $source str_replace($search$snipet$sourceOrigin);
  605.         
  606.         $parameters $TemplateEvent->getParameters();
  607.         // 商品がない場合、レンダリングしない
  608.         if (!$parameters['Order']) {
  609.             return;
  610.         }
  611.         // twigパラメータにカテゴリコンテンツを追加
  612.         $orderDetailFlgs = array();
  613.         $Order $parameters['Order'];
  614.         $OrderDetails $Order->getOrderItems();
  615.         foreach ($OrderDetails as $v) {
  616.             $OrderDetailFile $this->shiro8OrderDetailFileRepository->findOneBy(['order_item_id' => $v->getId()]);
  617.             
  618.             if ($OrderDetailFile && $OrderDetailFile->getRand() != '') {
  619.                 $orderDetailFlgs[$v->getId()] = true;
  620.             }
  621.         }
  622.         
  623.         $parameters['orderDetailFlgs'] = $orderDetailFlgs;
  624.         $TemplateEvent->setParameters($parameters);
  625.         
  626.         
  627.         $template $this->twig->createTemplate($source);
  628.         $content $template->render($TemplateEvent->getParameters());
  629.         
  630.         // HTMLテンプレートが存在する場合
  631.         $htmlFileName $this->getHtmlTemplate($MailTemplate->getFileName());
  632.         if (!is_null($htmlFileName)) {
  633.             
  634.             $source $this->twig->getLoader()->getSourceContext($htmlFileName)->getCode();
  635.             
  636.             $TemplateEvent = new TemplateEvent($view$source, array(
  637.                 'Order' => $Order,
  638.             ), null);
  639.             
  640.             $snipet $this->twig->getLoader()->getSourceContext('@Shiro8Download42/default/Mail/order.html.twig')->getCode();
  641.             $sourceOrigin $TemplateEvent->getSource();
  642.             $search '数量:{{ OrderItem.quantity|number_format }}<br/>';
  643.             $source str_replace($search$snipet$sourceOrigin);
  644.             
  645.             $parameters $TemplateEvent->getParameters();
  646.             // 商品がない場合、レンダリングしない
  647.             if (!$parameters['Order']) {
  648.                 return;
  649.             }
  650.             // twigパラメータにカテゴリコンテンツを追加
  651.             $orderDetailFlgs = array();
  652.             $Order $parameters['Order'];
  653.             $OrderDetails $Order->getOrderItems();
  654.             foreach ($OrderDetails as $v) {
  655.                 $OrderDetailFile $this->shiro8OrderDetailFileRepository->findOneBy(['order_item_id' => $v->getId()]);
  656.                 
  657.                 if ($OrderDetailFile && $OrderDetailFile->getRand() != '') {
  658.                     $orderDetailFlgs[$v->getId()] = true;
  659.                 }
  660.             }
  661.             
  662.             $parameters['orderDetailFlgs'] = $orderDetailFlgs;
  663.             $TemplateEvent->setParameters($parameters);
  664.             
  665.             
  666.             $template $this->twig->createTemplate($source);
  667.             $htmlBody $template->render($TemplateEvent->getParameters());
  668.             
  669.             $message
  670.                 ->text($content)
  671.                 ->html($htmlBody);
  672.         } else {
  673.             $message->text($content);
  674.         }
  675.         
  676.         $message->subject('[' $BaseInfo->getShopName() . '] ' $MailTemplate->getMailSubject());
  677.         
  678.     }
  679.     
  680.     /**
  681.      * @see Symfony\Bundle\FrameworkBundle\Controller\AbstractController
  682.      */
  683.     private function isGranted($attribute$subject null): bool
  684.     {
  685.         return $this->container->get('security.authorization_checker')->isGranted($attribute$subject);
  686.     }
  687.     
  688.     /**
  689.      * [getHtmlTemplate description]
  690.      *
  691.      * @param  string $templateName  プレーンテキストメールのファイル名
  692.      *
  693.      * @return string|null  存在する場合はファイル名を返す
  694.      */
  695.     private function getHtmlTemplate($templateName)
  696.     {
  697.         // メールテンプレート名からHTMLメール用テンプレート名を生成
  698.         $fileName explode('.'$templateName);
  699.         $suffix '.html';
  700.         $htmlFileName $fileName[0].$suffix.'.'.$fileName[1];
  701.         // HTMLメール用テンプレートの存在チェック
  702.         if ($this->twig->getLoader()->exists($htmlFileName)) {
  703.             return $htmlFileName;
  704.         } else {
  705.             return null;
  706.         }
  707.     }
  708.     
  709. }