<?php
/*
* This file is part of CategoryContentConfig Plugin
*
* Copyright(c) https://beststore.tokyo/ All Rights Reserved.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\CategoryContentConfig;
use Eccube\Event\TemplateEvent;
use Eccube\Event\EccubeEvents;
use Eccube\Common\EccubeConfig;
use Eccube\Event\EventArgs;
use Eccube\Repository\CategoryRepository;
use Plugin\CategoryContentConfig\Entity\Config;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Plugin\CategoryContentConfig\Util\ViewHelper;
use Symfony\Component\Filesystem\Filesystem;
class Event implements EventSubscriberInterface
{
protected $twig;
protected $eccubeConfig;
protected $categoryRepository;
public function __construct(
\Twig\Environment $twig,
EccubeConfig $eccubeConfig,
CategoryRepository $categoryRepository
)
{
$this->twig = $twig;
$this->eccubeConfig = $eccubeConfig;
$this->categoryRepository = $categoryRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/Product/category.twig' => 'onRenderAdminProductCategoryTwig',
'Product/list.twig' => 'onRenderProductListTwig',
EccubeEvents::ADMIN_PRODUCT_CATEGORY_INDEX_COMPLETE => 'onAdminProductCategoryIndexComplete'
];
}
public function onRenderAdminProductCategoryTwig(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// js
$insertSource = $this->twig->getLoader()->getSourceContext('@CategoryContentConfig/admin/category_image_js.twig')->getCode();
$source = ViewHelper::insertJs($source, $insertSource);
$pattern = '|<div class="row mb-3">(.*?){% endfor %}|s';
$addRow = $this->twig->getLoader()->getSourceContext('@CategoryContentConfig/admin/category_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);
}
$pattern = '|<form class="row(.*?){% endfor %}|s';
$addRow = $this->twig->getLoader()->getSourceContext('@CategoryContentConfig/admin/child_category_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->setSource($source);
$event->setParameters($parameters);
}
public function onRenderProductListTwig(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
if(!$event->hasParameter('Category')){
if(preg_match("|{{ eccube_plg_category_list }}|s",$source, $result)){
$search = $result[0];
$replace = "";
$source = str_replace($search, $replace, $source);
}
} else {
if(preg_match("|eccube_plg_category_list|s",$source, $result)){
$search = $result[0];
$replace = "include('@CategoryContentConfig/Category/list.twig')";
$source = str_replace($search, $replace, $source);
}else{
$pattern = '|<div class="ec-searchnavRole__topicpath(.*?)</div>|s';
$addRow = $this->twig->getLoader()->getSourceContext('@CategoryContentConfig/Category/list.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="ec-searchnavRole__counter(.*?)</div>|s';
$addRow = "{% if Category.page_display_mode == " . Config::PRODUCT_AND_CATEGORY_KEY ." or Category.page_display_mode == " . Config::PRODUCT_KEY ." %}";
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $addRow . $matches[0][0];
$source = preg_replace($pattern, $replacement, $source);
}
$pattern = '|<div class="ec-searchnavRole__counter(.*?)</div>|s';
$addRow = '{% endif %}';
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
$pattern = '|{% if pagination.totalItemCount > 0 |s';
$addRow = "and (Category.page_display_mode == " . Config::PRODUCT_AND_CATEGORY_KEY ." or Category.page_display_mode == " . Config::PRODUCT_KEY . ") ";
if (preg_match($pattern, $source, $matches, PREG_OFFSET_CAPTURE)) {
$replacement = $matches[0][0] . $addRow;
$source = preg_replace($pattern, $replacement, $source);
}
$Category = $parameters['Category'];
$Parent = $this->categoryRepository->find($Category->getId());
$ChildCategories = $this->categoryRepository->getList($Parent);
$parameters['ChildCategories'] = $ChildCategories;
}
$event->setSource($source);
$event->setParameters($parameters);
}
public function onAdminProductCategoryIndexComplete(EventArgs $eventArgs)
{
$form = $eventArgs->getArgument('form');
if($eventArgs->hasArgument('editForm')){
$form = $eventArgs->getArgument('editForm');
}
$file = $form['category_image']->getData();
$fs = new Filesystem();
if ($file && strpos($file, '..') === false && $fs->exists($this->eccubeConfig['eccube_temp_image_dir'].'/'.$file)) {
$fs->rename(
$this->eccubeConfig['eccube_temp_image_dir'].'/'.$file,
$this->eccubeConfig['eccube_save_image_dir'].'/'.$file
);
}
}
}