app/Plugin/ApgVideoInsert42/Event.php line 104

Open in your IDE?
  1. <?php
  2. namespace Plugin\ApgVideoInsert42;
  3. use Eccube\Entity\Product;
  4. use Eccube\Event\TemplateEvent;
  5. use Plugin\ApgVideoInsert42\Domain\VideoInsertType;
  6. use Plugin\ApgVideoInsert42\Repository\ConfigRepository;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Twig\Environment;
  9. class Event implements EventSubscriberInterface
  10. {
  11.     const TEMPLATE_NAMESPACE '@ApgVideoInsert42';
  12.     /**
  13.      * @var ConfigRepository
  14.      */
  15.     protected $apgVideoInsertConfig;
  16.     /**
  17.      */
  18.     protected $twig;
  19.     public function __construct(
  20.         ConfigRepository $apgVideoInsertConfig,
  21.         Environment $twig
  22.     )
  23.     {
  24.         $this->apgVideoInsertConfig $apgVideoInsertConfig;
  25.         $this->twig $twig;
  26.     }
  27.     /**
  28.      * @return array
  29.      */
  30.     public static function getSubscribedEvents()
  31.     {
  32.         return [
  33.             'Product/detail.twig' => 'detail',
  34.         ];
  35.     }
  36.     /**
  37.      * @param TemplateEvent $event
  38.      * @throws \Twig_Error_Loader
  39.      */
  40.     public function detail(TemplateEvent $event)
  41.     {
  42.         $parameters $event->getParameters();
  43.         $source $event->getSource();
  44.         /** @var Product $Product */
  45.         $Product $event->getParameter('Product');
  46.         $videoId $this->getYoutubeVideoId($Product->getVideoUrl());
  47.         if (!empty($videoId)) {
  48.             $parameters['youtubeVideoId'] = $videoId;
  49.             $Config $this->apgVideoInsertConfig->getOrNew();
  50.             $videoInsertType $Config->getVideoInsertType();
  51.             $videoInsertType = empty($videoInsertType) ? VideoInsertType::SLIDE $Config->getVideoInsertType();
  52.             $parameters['videoInsertType'] = $videoInsertType;
  53.             if ($videoInsertType === VideoInsertType::NONE) {
  54.                 // ignore
  55.             } elseif ($videoInsertType === VideoInsertType::SLIDE) {
  56.                 // メイン画像挿入用
  57.                 $pattern '|<div class="item_visual">|';
  58.                 $addRow $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE '/front/render_product_detail_insert_youtube.twig')->getCode();
  59.                 if (preg_match($pattern$source$matchesPREG_OFFSET_CAPTURE)) {
  60.                     $replacement $matches[0][0] . $addRow;
  61.                     $source preg_replace($pattern$replacement$source);
  62.                 }
  63.                 // ナビ挿入用
  64.                 $pattern '|<div class="item_nav">|';
  65.                 $addRow $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE '/front/render_product_detail_insert_slider_nav.twig')->getCode();
  66.                 if (preg_match($pattern$source$matchesPREG_OFFSET_CAPTURE)) {
  67.                     $replacement $matches[0][0] . $addRow;
  68.                     $source preg_replace($pattern$replacement$source);
  69.                 }
  70.                 // slickの順番を変更
  71.                 $pattern '|<div class="slideThumb" data-index="{{ loop.index0 }}">|';
  72.                 $replacement '<div class="slideThumb" data-index="{{ loop.index }}">';
  73.                 if (preg_match($pattern$source$matchesPREG_OFFSET_CAPTURE)) {
  74.                     $source preg_replace($pattern$replacement$source);
  75.                 }
  76.             } elseif ($videoInsertType === VideoInsertType::PRODUCT_DESCRIPTION) {
  77.                 $pattern '|<div class="ec-productRole__description"|';
  78.                 $addRow $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE '/front/render_product_detail_insert_youtube.twig')->getCode();
  79.                 if (preg_match($pattern$source$matchesPREG_OFFSET_CAPTURE)) {
  80.                     $replacement $addRow $matches[0][0];
  81.                     $source preg_replace($pattern$replacement$source);
  82.                 }
  83.             }
  84.         }
  85.         $event->setParameters($parameters);
  86.         $event->setSource($source);
  87.         $event->addAsset(self::TEMPLATE_NAMESPACE '/front/render_product_detail_css.twig');
  88.         $event->addSnippet(self::TEMPLATE_NAMESPACE '/front/render_product_detail_js.twig');
  89.     }
  90.     public function getYoutubeVideoId($youtubeUrl)
  91.     {
  92.         $patter '/(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/u';
  93.         $matches = array();
  94.         if (preg_match($patter$youtubeUrl$matches)) {
  95.             return $matches[1];
  96.         }
  97.         return null;
  98.     }
  99. }