app/Plugin/ProductPlus42/Event/AdminProductEvent.php line 96

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : ProductPlus
  4. *
  5. * Copyright (C) BraTech Co., Ltd. All Rights Reserved.
  6. * http://www.bratech.co.jp/
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Plugin\ProductPlus42\Event;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Eccube\Common\EccubeConfig;
  14. use Eccube\Event\EccubeEvents;
  15. use Eccube\Event\EventArgs;
  16. use Eccube\Event\TemplateEvent;
  17. use Plugin\ProductPlus42\Entity\ProductData;
  18. use Plugin\ProductPlus42\Entity\ProductDataDetail;
  19. use Plugin\ProductPlus42\Entity\ProductItem;
  20. use Plugin\ProductPlus42\Repository\ProductDataDetailRepository;
  21. use Plugin\ProductPlus42\Repository\ProductDataRepository;
  22. use Plugin\ProductPlus42\Repository\ProductItemRepository;
  23. use Plugin\ProductPlus42\Service\ProductPlusService;
  24. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  25. use Symfony\Component\Filesystem\Filesystem;
  26. use Symfony\Component\HttpFoundation\File\File;
  27. class AdminProductEvent implements EventSubscriberInterface
  28. {
  29.     private $entityManager;
  30.     private $eccubeConfig;
  31.     private $productItemRepository;
  32.     private $productDataRepository;
  33.     private $productDataDetailRepository;
  34.     private $productPlusService;
  35.     public function __construct(
  36.             EntityManagerInterface $entityManager,
  37.             EccubeConfig $eccubeConfig,
  38.             ProductItemRepository $productItemRepository,
  39.             ProductDataRepository $productDataRepository,
  40.             ProductDataDetailRepository $productDataDetailRepository,
  41.             ProductPlusService $productPlusService
  42.             )
  43.     {
  44.         $this->entityManager $entityManager;
  45.         $this->eccubeConfig $eccubeConfig;
  46.         $this->productItemRepository $productItemRepository;
  47.         $this->productDataRepository $productDataRepository;
  48.         $this->productDataDetailRepository $productDataDetailRepository;
  49.         $this->productPlusService $productPlusService;
  50.     }
  51.     /**
  52.      * @return array
  53.      */
  54.     public static function getSubscribedEvents()
  55.     {
  56.         return [
  57.             '@admin/Product/product.twig' => 'onTemplateAdminProductEdit',
  58.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'hookAdminProductEditComplete',
  59.             EccubeEvents::ADMIN_PRODUCT_COPY_COMPLETE => 'hookAdminProductCopyComplete',
  60.             EccubeEvents::ADMIN_PRODUCT_CSV_EXPORT => 'hookAdminProductCsvExport',
  61.         ];
  62.     }
  63.     public function onTemplateAdminProductEdit(TemplateEvent $event)
  64.     {
  65.         $parameters $event->getParameters();
  66.         $ProductItems $this->productItemRepository->getList();
  67.         $EnabledItems $this->productPlusService->getEnabledProductPlusForm();
  68.         foreach($ProductItems as $key => $ProductItem){
  69.             foreach($EnabledItems as $EnabledItem){
  70.                 if($ProductItem->getId() == $EnabledItem->getId())unset($ProductItems[$key]);
  71.             }
  72.         }
  73.         $parameters['ProductItems'] = $ProductItems;
  74.         $event->setParameters($parameters);
  75.         $source $event->getSource();
  76.         if(preg_match("/\{\%\sfor\sf\sin\sform(\sif|\|filter\(f\s\=\>)\sf\.vars\.eccube\_form\_options\.auto\_render/",$source$result)){
  77.             $search $result[0];
  78.             $replace "{{ include('@ProductPlus42/admin/Product/ext_edit.twig') }}" $search;
  79.             $source str_replace($search$replace$source);
  80.         }
  81.         $event->setSource($source);
  82.         $event->addSnippet('@ProductPlus42/admin/Product/upload_js.twig');
  83.     }
  84.     public function hookAdminProductEditComplete(EventArgs $event)
  85.     {
  86.         $Product $event->getArgument('Product');
  87.         $form $event->getArgument('form');
  88.         $request $event->getRequest();
  89.         $ProductItems $this->productItemRepository->getList();
  90.         foreach($ProductItems as $ProductItem){
  91.             if($form->has('productplus_'.$ProductItem->getId())){
  92.                 $ProductData $this->productDataRepository->findOneBy(['ProductItem' => $ProductItem'Product' => $Product]);
  93.                 if(!$ProductData){
  94.                     $ProductData = new ProductData();
  95.                     $ProductData->setProductItem($ProductItem);
  96.                     $ProductData->setProduct($Product);
  97.                 }
  98.                 if($ProductItem->getInputType() == ProductItem::IMAGE_TYPE) {
  99.                     $add_images $form->get('productplus_'.$ProductItem->getId().'_add_images')->getData();
  100.                     foreach ($add_images as $add_image) {
  101.                         $Detail = new ProductDataDetail();
  102.                         $Detail
  103.                             ->setValue($add_image)
  104.                             ->setProductData($ProductData)
  105.                             ->setSortNo(1);
  106.                         $ProductData->addDetail($Detail);
  107.                         $this->entityManager->persist($Detail);
  108.                         $file = new File($this->eccubeConfig['eccube_temp_image_dir'].'/'.$add_image);
  109.                         $file->move($this->eccubeConfig['eccube_save_image_dir']);
  110.                     }
  111.                     $delete_images $form->get('productplus_'.$ProductItem->getId().'_delete_images')->getData();
  112.                     $fs = new Filesystem();
  113.                     foreach ($delete_images as $delete_image) {
  114.                         $Detail $this->productDataDetailRepository->findOneBy(['value' => $delete_image]);
  115.                         if ($Detail instanceof ProductDataDetail) {
  116.                             $ProductData->removeDetail($Detail);
  117.                             $this->entityManager->remove($Detail);
  118.                             $fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);
  119.                         }else{
  120.                             $fs->remove($this->eccubeConfig['eccube_temp_image_dir'].'/'.$delete_image);
  121.                         }
  122.                         $this->entityManager->persist($ProductData);
  123.                     }
  124.                     $this->entityManager->persist($ProductData);
  125.                     $Product->addProductData($ProductData);
  126.                     $this->entityManager->flush();
  127.                     if ($image $request->request->all()['admin_product']['productplus_'.$ProductItem->getId().'_images'] ?? []) {
  128.                         foreach ($image as $sortNo => $filename) {
  129.                             $Detail $this->productDataDetailRepository
  130.                                 ->findOneBy([
  131.                                     'value' => pathinfo($filenamePATHINFO_BASENAME),
  132.                                     'ProductData' => $ProductData,
  133.                                 ]);
  134.                             if($Detail){
  135.                                 $Detail->setSortNo($sortNo);
  136.                                 $this->entityManager->persist($Detail);
  137.                             }
  138.                         }
  139.                         $this->entityManager->flush();
  140.                     }
  141.                 }else{
  142.                     $value $form->get('productplus_'.$ProductItem->getId())->getData();
  143.                     if ($value instanceof \DateTime){
  144.                         $value $value->format('Y-m-d');
  145.                     }elseif ($ProductItem->getInputType() == ProductItem::CHECKBOX_TYPE && is_array($value)) {
  146.                         $value implode(','$value);
  147.                     }
  148.                     $ProductData $this->productDataRepository->regist($ProductData$ProductItem$value);
  149.                     $Product->addProductData($ProductData);
  150.                 }
  151.             }
  152.         }
  153.     }
  154.     public function hookAdminProductCopyComplete(EventArgs $event)
  155.     {
  156.         $Product $event->getArgument('Product');
  157.         $CopyProduct $event->getArgument('CopyProduct');
  158.         foreach ($Product->getProductDatas() as $oldProductData) {
  159.             $newProductData = new ProductData();
  160.             $newProductData->setProduct($CopyProduct);
  161.             $newProductData->setProductItem($oldProductData->getProductItem());
  162.             if($newProductData->getProductItem()->getInputType() == ProductItem::IMAGE_TYPE){
  163.                 foreach($oldProductData->getDetails() as $oldDetail){
  164.                     // 画像ファイルを新規作成
  165.                     $extension pathinfo($oldDetail->getValue(), PATHINFO_EXTENSION);
  166.                     $filename date('mdHis').uniqid('_').'.'.$extension;
  167.                     try {
  168.                         $fs = new Filesystem();
  169.                         $fs->copy($this->eccubeConfig['eccube_save_image_dir'].'/'.$oldDetail->getValue(), $this->eccubeConfig['eccube_save_image_dir'].'/'.$filename);
  170.                     } catch (\Exception $e) {
  171.                         // エラーが発生しても無視する
  172.                     }
  173.                     $newDetail = new ProductDataDetail();
  174.                     $newDetail->setValue($filename)
  175.                             ->setSortNo($oldDetail->getSortNo())
  176.                             ->setProductData($newProductData);
  177.                     $newProductData->addDetail($newDetail);
  178.                 }
  179.             }else{
  180.                 foreach($oldProductData->getDetails() as $oldDetail){
  181.                     $newDetail = new ProductDataDetail();
  182.                     $newDetail->setValue($oldDetail->getValue())
  183.                             ->setNumValue($oldDetail->getNumValue())
  184.                             ->setDateValue($oldDetail->getDateValue())
  185.                             ->setProductData($newProductData);
  186.                     $newProductData->addDetail($newDetail);
  187.                 }
  188.             }
  189.             $CopyProduct->addProductData($newProductData);
  190.             $this->entityManager->persist($newProductData);
  191.         }
  192.         $this->entityManager->persist($CopyProduct);
  193.         $this->entityManager->flush();
  194.     }
  195.     public function hookAdminProductCsvExport(EventArgs $event)
  196.     {
  197.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  198.         if ($ExportCsvRow->isDataNull()) {
  199.             $ProductClass $event->getArgument('ProductClass');
  200.             $Product $ProductClass->getProduct();
  201.             $Csv $event->getArgument('Csv');
  202.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  203.             $value null;
  204.             if($csvEntityName == 'Plugin\ProductPlus42\Entity\ProductData'){
  205.                 $product_item_id $Csv->getReferenceFieldName();
  206.                 if($Csv->getFieldName() == 'product_item_id'){
  207.                     $value $Product->getIdData($product_item_id);
  208.                 }elseif($Csv->getFieldName() == 'product_item_value'){
  209.                     $value $Product->getValueData($product_item_id);
  210.                 }
  211.                 if(is_array($value))$value implode(','$value);
  212.                 $ExportCsvRow->setData($value);
  213.             }
  214.         }
  215.     }
  216. }