<?php
namespace Plugin\HigashiyamaForProduct\EventSubscriber\Controller\Admin;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Eccube\Entity\Product;
use Eccube\Entity\Member;
use Eccube\Repository\ProductRepository;
use Eccube\Event\TemplateEvent;
use Eccube\Event\EventArgs;
use Eccube\Event\EccubeEvents;
use Eccube\Common\EccubeConfig;
use Plugin\HigashiyamaForProduct\Entity\StandReadingImage;
use Plugin\HigashiyamaForProduct\Repository\StandReadingImageRepository;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\File;
class ProductControllerSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
protected $entityManager;
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var StandReadingImageRepository
*/
protected $standReadingImageRepository;
/**
* ProductController constructor.
*
* @param EccubeConfig $eccubeConfig
*/
public function __construct(
EntityManagerInterface $entityManager,
EccubeConfig $eccubeConfig,
ProductRepository $productRepository,
StandReadingImageRepository $standReadingImageRepository
) {
$this->entityManager = $entityManager;
$this->eccubeConfig = $eccubeConfig;
$this->productRepository = $productRepository;
$this->standReadingImageRepository = $standReadingImageRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/Product/product.twig' => ['HigashiyamaForProduct', 1],
EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'AdminProductEditComplete',
];
}
/**
* @param TemplateEvent $event
*/
public function HigashiyamaForProduct(TemplateEvent $event)
{
$event->addSnippet('@HigashiyamaForProduct/admin/Product/higashiyama_for_product.twig');
$event->addSnippet('@HigashiyamaForProduct/admin/Product/admin_product_stand_reading_image.twig');
}
public function AdminProductEditComplete(EventArgs $event)
{
$form = $event->getArgument('form');
$Product = $event->getArgument('Product');
// 画像の登録
$add_stand_reading_images = $form->get('add_stand_reading_images')->getData();
foreach ($add_stand_reading_images as $add_stand_reading_image) {
$StandReadingImage = new StandReadingImage();
$StandReadingImage
->setFileName($add_stand_reading_image)
->setProduct($Product)
->setCreator($Product->getCreator())
->setSortNo(1);
$Product->addStandReadingImage($StandReadingImage);
$this->entityManager->persist($StandReadingImage);
// 移動
$file = new File($this->eccubeConfig['eccube_temp_image_dir'] . '/' . $add_stand_reading_image);
$file->move($this->eccubeConfig['eccube_save_image_dir']);
}
// 画像の削除
$delete_stand_reading_images = $form->get('delete_stand_reading_images')->getData();
$fs = new Filesystem();
foreach ($delete_stand_reading_images as $delete_stand_reading_image) {
$StandReadingImage = $this->standReadingImageRepository->findOneBy([
'Product' => $Product,
'file_name' => $delete_stand_reading_image,
]);
if ($StandReadingImage instanceof StandReadingImage) {
$Product->removeStandReadingImage($StandReadingImage);
$this->entityManager->remove($StandReadingImage);
$this->entityManager->flush();
// 他に同じ画像を参照する商品がなければ画像ファイルを削除
if (!$this->standReadingImageRepository->findOneBy(['file_name' => $delete_stand_reading_image])) {
$fs->remove($this->eccubeConfig['eccube_save_image_dir'] . '/' . $delete_stand_reading_image);
}
} else {
// 追加してすぐに削除した画像は、Entityに追加されない
$fs->remove($this->eccubeConfig['eccube_temp_image_dir'] . '/' . $delete_stand_reading_image);
}
}
$this->entityManager->flush();
if (array_key_exists('stand_reading_image', $event->getRequest()->request->get('admin_product'))) {
$stand_reading_image = $event->getRequest()->request->get('admin_product')['stand_reading_image'];
foreach ($stand_reading_image as $sortNo => $filename) {
$StandReadingImage = $this->standReadingImageRepository
->findOneBy([
'file_name' => pathinfo($filename, PATHINFO_BASENAME),
'Product' => $Product,
]);
if ($StandReadingImage !== null) {
$StandReadingImage->setSortNo($sortNo);
$this->entityManager->persist($StandReadingImage);
}
}
$this->entityManager->flush();
}
}
}