<?php
namespace Plugin\ApgProductClassImage42;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use Eccube\Log\Logger;
use Plugin\ApgProductClassImage42\Domain\ClassImageInsertType;
use Plugin\ApgProductClassImage42\Domain\ClassImageListType;
use Plugin\ApgProductClassImage42\Entity\Config;
use Plugin\ApgProductClassImage42\Repository\ConfigRepository;
use Plugin\ApgProductClassImage42\Util\Paths;
use Plugin\ApgProductClassImage42\Util\ViewHelper;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException;
class Event implements EventSubscriberInterface
{
const TEMPLATE_NAMESPACE = '@ApgProductClassImage42';
/**
* @var ConfigRepository
*/
protected $configRepository;
/**
* @var \Twig\Environment
*/
protected $twig;
/**
* @var Logger
*/
protected $logger;
/**
* @var EntityManagerInterface
*/
protected $em;
/**
* @var Paths
*/
protected $path;
public function __construct(
ConfigRepository $configRepository,
EntityManagerInterface $em,
\Twig\Environment $twig,
LoggerInterface $logger,
Paths $path
)
{
$this->configRepository = $configRepository;
$this->twig = $twig;
$this->logger = $logger;
$this->em = $em;
$this->path = $path;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/Product/product_class.twig' => 'onRenderAdminProductProductClass',
'Product/detail.twig' => 'onRenderFrontProductDetail',
'Product/list.twig' => 'onRenderFrontProductList',
'Cart/index.twig' => 'onRenderFrontCartIndex',
'Block/cart.twig' => 'onRenderFrontBlockCart',
'Block/header.twig' => 'onRenderFrontBlockHeader',
'Shopping/index.twig' => 'onRenderFrontShoppingIndex',
'Shopping/shipping_multiple.twig' => 'onRenderFrontShoppingShippingMultiple',
'Shopping/confirm.twig' => 'onRenderFrontShoppingConfirm',
// 'Mypage/index.twig' => 'onRenderFrontMypageIndex',
// 'Mypage/history.twig' => 'onRenderFrontMypageHistory',
];
}
/**
* [Front]商品詳細情報表示
* @param EventArgs $event
*/
public function onRenderFrontProductDetail(TemplateEvent $event)
{
$parameters = $event->getParameters();
$source = $event->getSource();
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
/** @var Config $config */
try {
if ($config->getImageInsertType() === ClassImageInsertType::UNDER_SELECT_CLASS) {
// js
$insertSource = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images_js1.twig')->getCode();
$source = ViewHelper::insertJs($source, $insertSource);
// twig
$pattern = '|<div class="ec-numberInput">|s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images1.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow . $matches[0][0];
$source = preg_replace($pattern, $replacement, $source);
}
} elseif ($config->getImageInsertType() === ClassImageInsertType::SLIDERS) {
// js
$insertSource = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images_js2.twig')->getCode();
$source = ViewHelper::insertJs($source, $insertSource);
// twig
$pattern = '/<div class="item_visual">(.*?){% endfor %}/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images2.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">(.*?){% endfor %}/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images3.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
/**
* [Front]商品一覧表示
* @param EventArgs $event
*/
public function onRenderFrontProductList(TemplateEvent $event)
{
$parameters = $event->getParameters();
$source = $event->getSource();
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
if ($config->getImageListType() == ClassImageListType::ENABLED) {
// js
$insertSource = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images_list_js.twig')->getCode();
$source = ViewHelper::insertJs($source, $insertSource);
// twig
$pattern = '/<p class="ec-shelfGrid__item-image">(.*?)<\/p>/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_product_class_images_list.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
}
$event->setParameters($parameters);
$event->setSource($source);
}
/**
* [Admin]商品規格ページ表示
* @param TemplateEvent $event
* @return void
* @throws \Twig\Error\LoaderError
*/
public function onRenderAdminProductProductClass(TemplateEvent $event)
{
$source = $event->getSource();
// data
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['ApgRichEditorConfig'] = $config;
$loader = $this->twig->getLoader();
// js
$insertSource = $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE . '/admin/product_class_image_js.twig')->getCode();
$source = ViewHelper::insertJs($source, $insertSource);
// css
$insertSource = $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE . '/admin/product_class_image_css.twig')->getCode();
$source = ViewHelper::insertCss($source, $insertSource);
// header
$pattern = '|<div id="ex-product_class" class="card-body p-0">(.*?){% endfor %}|s';
$addRow = '<th class="pt-2 pb-2">画像</th>';
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
// data
$pattern = '|<tr id="ex-product_class-(.*?){% endfor %}|s';
$addRow = $this->twig->getLoader()->getSourceContext(self::TEMPLATE_NAMESPACE . '/admin/product_class_image.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
$event->setSource($source);
$event->setParameters($parameters);
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
}
public function onRenderFrontCartIndex(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
$pattern = '/<img src="{{ asset\(Product.MainListImage\|no_image_product, \'save_image\'\) }}" alt="{{ Product.name }}"\/>/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_item_images.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
public function onRenderFrontBlockCart(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
$pattern = '/<img src="{{ asset\(Product.MainListImage\|no_image_product, \'save_image\'\) }}" alt="{{ Product.name }}">/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_item_images.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
public function onRenderFrontBlockHeader(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
$pattern = '/{{ include\(\'Block\/cart.twig\'\) }}/s';
$addRow = $this->twig->getLoader()->getSourceContext('Block/cart.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
$pattern = '/<img src="{{ asset\(Product.MainListImage\|no_image_product, \'save_image\'\) }}" alt="{{ Product.name }}">/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_item_images.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
public function onRenderFrontShoppingIndex(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
$pattern = '/<img src="{{ asset\(\(orderItem.product is null \? null : orderItem.product.MainListImage\)\|no_image_product, \'save_image\'\) }}" alt="{{ orderItem.productName }}">/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_order_item_images.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
public function onRenderFrontShoppingShippingMultiple(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
$pattern = '/<img src="{{ asset\(orderItem.product.MainListImage\|no_image_product, \'save_image\'\) }}">/';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_order_item_images.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
public function onRenderFrontShoppingConfirm(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// setting
try {
$config = $this->configRepository->getOrNew();
$parameters['apgProductClassConfig'] = $config;
$pattern = '/<img src="{{ asset\(\(orderItem.product is null \? null : orderItem.product.MainListImage\)\|no_image_product, \'save_image\'\) }}" alt="{{ orderItem.productName }}">/s';
$addRow = $this->twig->getLoader()->getSourceContext('@user_data/Plugin/ApgProductClassImage/render_order_item_images.twig')->getCode();
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
} catch (NonUniqueResultException $e) {
$this->logger->warning("[" . self::class . "]plg_apg_product_class_image_config にデータが存在しません。");
}
$event->setParameters($parameters);
$event->setSource($source);
}
public function onRenderFrontMypageIndex(TemplateEvent $event)
{
// もしやる場合は、Mypage.index.twig自体を変更しないと厳しいので、対応しない。
// お客様でどうしても必要な場合は、説明をした上で個別対応が必要。
throw new NotAcceptableHttpException();
}
public function onRenderFrontMypageHistory(TemplateEvent $event)
{
// もしやる場合は、Mypage.index.twig自体を変更しないと厳しいので、対応しない。
// お客様でどうしても必要な場合は、説明をした上で個別対応が必要。
throw new NotAcceptableHttpException();
}
}