<?php
namespace Plugin\ApgVideoInsert42;
use Eccube\Entity\Product;
use Eccube\Event\TemplateEvent;
use Plugin\ApgVideoInsert42\Domain\VideoInsertType;
use Plugin\ApgVideoInsert42\Repository\ConfigRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Twig\Environment;
class Event implements EventSubscriberInterface
{
const TEMPLATE_NAMESPACE = '@ApgVideoInsert42';
/**
* @var ConfigRepository
*/
protected $apgVideoInsertConfig;
/**
*/
protected $twig;
public function __construct(
ConfigRepository $apgVideoInsertConfig,
Environment $twig
)
{
$this->apgVideoInsertConfig = $apgVideoInsertConfig;
$this->twig = $twig;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'Product/detail.twig' => 'detail',
];
}
/**
* @param TemplateEvent $event
* @throws \Twig_Error_Loader
*/
public function detail(TemplateEvent $event)
{
$parameters = $event->getParameters();
$source = $event->getSource();
/** @var Product $Product */
$Product = $event->getParameter('Product');
$videoId = $this->getYoutubeVideoId($Product->getVideoUrl());
if (!empty($videoId)) {
$parameters['youtubeVideoId'] = $videoId;
$Config = $this->apgVideoInsertConfig->getOrNew();
$videoInsertType = $Config->getVideoInsertType();
$videoInsertType = empty($videoInsertType) ? VideoInsertType::SLIDE : $Config->getVideoInsertType();
$parameters['videoInsertType'] = $videoInsertType;
if ($videoInsertType === VideoInsertType::NONE) {
// ignore
} elseif ($videoInsertType === VideoInsertType::SLIDE) {
// メイン画像挿入用
$pattern = '|<div class="item_visual">|';
$addRow = $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE . '/front/render_product_detail_insert_youtube.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
// ナビ挿入用
$pattern = '|<div class="item_nav">|';
$addRow = $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE . '/front/render_product_detail_insert_slider_nav.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
// slickの順番を変更
$pattern = '|<div class="slideThumb" data-index="{{ loop.index0 }}">|';
$replacement = '<div class="slideThumb" data-index="{{ loop.index }}">';
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$source = preg_replace($pattern, $replacement, $source);
}
} elseif ($videoInsertType === VideoInsertType::PRODUCT_DESCRIPTION) {
$pattern = '|<div class="ec-productRole__description"|';
$addRow = $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE . '/front/render_product_detail_insert_youtube.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow . $matches[0][0];
$source = preg_replace($pattern, $replacement, $source);
}
}
}
$event->setParameters($parameters);
$event->setSource($source);
$event->addAsset(self::TEMPLATE_NAMESPACE . '/front/render_product_detail_css.twig');
$event->addSnippet(self::TEMPLATE_NAMESPACE . '/front/render_product_detail_js.twig');
}
public function getYoutubeVideoId($youtubeUrl)
{
$patter = '/(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/u';
$matches = array();
if (preg_match($patter, $youtubeUrl, $matches)) {
return $matches[1];
}
return null;
}
}