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

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.         $twig '@ProductPlus42/admin/Product/datepicker_js.twig';
  84.         $event->addAsset($twig);
  85.     }
  86.     public function hookAdminProductEditComplete(EventArgs $event)
  87.     {
  88.         $Product $event->getArgument('Product');
  89.         $form $event->getArgument('form');
  90.         $request $event->getRequest();
  91.         $ProductItems $this->productItemRepository->getList();
  92.         foreach($ProductItems as $ProductItem){
  93.             if($form->has('productplus_'.$ProductItem->getId())){
  94.                 $ProductData $this->productDataRepository->findOneBy(['ProductItem' => $ProductItem'Product' => $Product]);
  95.                 if(!$ProductData){
  96.                     $ProductData = new ProductData();
  97.                     $ProductData->setProductItem($ProductItem);
  98.                     $ProductData->setProduct($Product);
  99.                 }
  100.                 if($ProductItem->getInputType() == ProductItem::IMAGE_TYPE) {
  101.                     $add_images $form->get('productplus_'.$ProductItem->getId().'_add_images')->getData();
  102.                     foreach ($add_images as $add_image) {
  103.                         $Detail = new ProductDataDetail();
  104.                         $Detail
  105.                             ->setValue($add_image)
  106.                             ->setProductData($ProductData)
  107.                             ->setSortNo(1);
  108.                         $ProductData->addDetail($Detail);
  109.                         $this->entityManager->persist($Detail);
  110.                         $file = new File($this->eccubeConfig['eccube_temp_image_dir'].'/'.$add_image);
  111.                         $file->move($this->eccubeConfig['eccube_save_image_dir']);
  112.                     }
  113.                     $delete_images $form->get('productplus_'.$ProductItem->getId().'_delete_images')->getData();
  114.                     $fs = new Filesystem();
  115.                     foreach ($delete_images as $delete_image) {
  116.                         $Detail $this->productDataDetailRepository->findOneBy(['value' => $delete_image]);
  117.                         if ($Detail instanceof ProductDataDetail) {
  118.                             $ProductData->removeDetail($Detail);
  119.                             $this->entityManager->remove($Detail);
  120.                             $fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);
  121.                         }else{
  122.                             $fs->remove($this->eccubeConfig['eccube_temp_image_dir'].'/'.$delete_image);
  123.                         }
  124.                         $this->entityManager->persist($ProductData);
  125.                     }
  126.                     $this->entityManager->persist($ProductData);
  127.                     $Product->addProductData($ProductData);
  128.                     $this->entityManager->flush();
  129.                     if (array_key_exists('productplus_'.$ProductItem->getId().'_images'$request->request->get('admin_product'))) {
  130.                         $image $request->request->get('admin_product')['productplus_'.$ProductItem->getId().'_images'];
  131.                         foreach ($image as $sortNo => $filename) {
  132.                             $Detail $this->productDataDetailRepository
  133.                                 ->findOneBy([
  134.                                     'value' => pathinfo($filenamePATHINFO_BASENAME),
  135.                                     'ProductData' => $ProductData,
  136.                                 ]);
  137.                             if($Detail){
  138.                                 $Detail->setSortNo($sortNo);
  139.                                 $this->entityManager->persist($Detail);
  140.                             }
  141.                         }
  142.                     }
  143.                     $this->entityManager->flush();
  144.                 }else{
  145.                     $value $form->get('productplus_'.$ProductItem->getId())->getData();
  146.                     if ($value instanceof \DateTime){
  147.                         $value $value->format('Y-m-d');
  148.                     }elseif ($ProductItem->getInputType() == ProductItem::CHECKBOX_TYPE && is_array($value)) {
  149.                         $value implode(','$value);
  150.                     }
  151.                     $ProductData $this->productDataRepository->regist($ProductData$ProductItem$value);
  152.                     $Product->addProductData($ProductData);
  153.                 }
  154.             }
  155.         }
  156.     }
  157.     public function hookAdminProductCopyComplete(EventArgs $event)
  158.     {
  159.         $Product $event->getArgument('Product');
  160.         $CopyProduct $event->getArgument('CopyProduct');
  161.         foreach ($Product->getProductDatas() as $oldProductData) {
  162.             $newProductData = new ProductData();
  163.             $newProductData->setProduct($CopyProduct);
  164.             $newProductData->setProductItem($oldProductData->getProductItem());
  165.             if($newProductData->getProductItem()->getInputType() == ProductItem::IMAGE_TYPE){
  166.                 foreach($oldProductData->getDetails() as $oldDetail){
  167.                     // 画像ファイルを新規作成
  168.                     $extension pathinfo($oldDetail->getValue(), PATHINFO_EXTENSION);
  169.                     $filename date('mdHis').uniqid('_').'.'.$extension;
  170.                     try {
  171.                         $fs = new Filesystem();
  172.                         $fs->copy($this->eccubeConfig['eccube_save_image_dir'].'/'.$oldDetail->getValue(), $this->eccubeConfig['eccube_save_image_dir'].'/'.$filename);
  173.                     } catch (\Exception $e) {
  174.                         // エラーが発生しても無視する
  175.                     }
  176.                     $newDetail = new ProductDataDetail();
  177.                     $newDetail->setValue($filename)
  178.                             ->setSortNo($oldDetail->getSortNo())
  179.                             ->setProductData($newProductData);
  180.                     $newProductData->addDetail($newDetail);
  181.                 }
  182.             }else{
  183.                 foreach($oldProductData->getDetails() as $oldDetail){
  184.                     $newDetail = new ProductDataDetail();
  185.                     $newDetail->setValue($oldDetail->getValue())
  186.                             ->setNumValue($oldDetail->getNumValue())
  187.                             ->setDateValue($oldDetail->getDateValue())
  188.                             ->setProductData($newProductData);
  189.                     $newProductData->addDetail($newDetail);
  190.                 }
  191.             }
  192.             $CopyProduct->addProductData($newProductData);
  193.             $this->entityManager->persist($newProductData);
  194.         }
  195.         $this->entityManager->persist($CopyProduct);
  196.         $this->entityManager->flush();
  197.     }
  198.     public function hookAdminProductCsvExport(EventArgs $event)
  199.     {
  200.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  201.         if ($ExportCsvRow->isDataNull()) {
  202.             $ProductClass $event->getArgument('ProductClass');
  203.             $Product $ProductClass->getProduct();
  204.             $Csv $event->getArgument('Csv');
  205.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  206.             $value null;
  207.             if($csvEntityName == 'Plugin\ProductPlus42\Entity\ProductData'){
  208.                 $product_item_id $Csv->getReferenceFieldName();
  209.                 if($Csv->getFieldName() == 'product_item_id'){
  210.                     $value $Product->getIdData($product_item_id);
  211.                 }elseif($Csv->getFieldName() == 'product_item_value'){
  212.                     $value $Product->getValueData($product_item_id);
  213.                 }
  214.                 if(is_array($value))$value implode(','$value);
  215.                 $ExportCsvRow->setData($value);
  216.             }
  217.         }
  218.     }
  219. }