app/Plugin/ProductPlus/ProductPlusEvent.php line 228

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\ProductPlus;
  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\ProductPlus\Entity\ProductItem;
  18. use Plugin\ProductPlus\Entity\ProductData;
  19. use Plugin\ProductPlus\Entity\ProductDataDetail;
  20. use Plugin\ProductPlus\Repository\ProductItemRepository;
  21. use Plugin\ProductPlus\Repository\ProductDataRepository;
  22. use Plugin\ProductPlus\Repository\ProductDataDetailRepository;
  23. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  24. use Symfony\Component\Filesystem\Filesystem;
  25. use Symfony\Component\HttpFoundation\File\File;
  26. class ProductPlusEvent implements EventSubscriberInterface
  27. {
  28.     private $entityManager;
  29.     private $eccubeConfig;
  30.     private $productItemRepository;
  31.     private $productDataRepository;
  32.     private $productDataDetailRepository;
  33.     public function __construct(
  34.             EntityManagerInterface $entityManager,
  35.             EccubeConfig $eccubeConfig,
  36.             ProductItemRepository $productItemRepository,
  37.             ProductDataRepository $productDataRepository,
  38.             ProductDataDetailRepository $productDataDetailRepository
  39.             )
  40.     {
  41.         $this->entityManager $entityManager;
  42.         $this->eccubeConfig $eccubeConfig;
  43.         $this->productItemRepository $productItemRepository;
  44.         $this->productDataRepository $productDataRepository;
  45.         $this->productDataDetailRepository $productDataDetailRepository;
  46.     }
  47.     /**
  48.      * @return array
  49.      */
  50.     public static function getSubscribedEvents()
  51.     {
  52.         return [
  53.             '@admin/Product/product.twig' => 'onTemplateAdminProductEdit',
  54.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'hookAdminProductEditComplete',
  55.             EccubeEvents::ADMIN_PRODUCT_COPY_COMPLETE => 'hookAdminProductCopyComplete',
  56.             EccubeEvents::ADMIN_PRODUCT_CSV_EXPORT => 'hookAdminProductCsvExport',
  57.             'csvimportproductext.admin.product.csv.import.product.descriptions' => 'hookAdminProductCsvImportProductDescriptions',
  58.             'csvimportproductext.admin.product.csv.import.product.check'=> 'hookAdminProductCsvImportProductCheck',
  59.             'csvimportproductext.admin.product.csv.import.product.process' => 'hookAdminProductCsvImportProductProcess',
  60.         ];
  61.     }
  62.     public function onTemplateAdminProductEdit(TemplateEvent $event)
  63.     {
  64.         $parameters $event->getParameters();
  65.         $ProductItems $this->productItemRepository->getList();
  66.         $parameters['ProductItems'] = $ProductItems;
  67.         $event->setParameters($parameters);
  68.         $source $event->getSource();
  69.         if(preg_match("/\{\%\sfor\sf\sin\sform\sif\sf\.vars\.eccube\_form\_options\.auto\_render\s\%\}/",$source$result)){
  70.             $search $result[0];
  71.             $replace "{{ include('@ProductPlus/admin/Product/ext_edit.twig') }}" $search;
  72.             $source str_replace($search$replace$source);
  73.         }
  74.         $event->setSource($source);
  75.         $event->addSnippet('@ProductPlus/admin/Product/upload_js.twig');
  76.     }
  77.     public function hookAdminProductEditComplete(EventArgs $event)
  78.     {
  79.         $Product $event->getArgument('Product');
  80.         $form $event->getArgument('form');
  81.         $request $event->getRequest();
  82.         $ProductItems $this->productItemRepository->getList();
  83.         foreach($ProductItems as $ProductItem){
  84.             if($form->has('productplus_'.$ProductItem->getId())){
  85.                 $ProductData $this->productDataRepository->findOneBy(['ProductItem' => $ProductItem'Product' => $Product]);
  86.                 if(!$ProductData){
  87.                     $ProductData = new ProductData();
  88.                     $ProductData->setProductItem($ProductItem);
  89.                     $ProductData->setProduct($Product);
  90.                 }
  91.                 if($ProductItem->getInputType() == ProductItem::IMAGE_TYPE) {
  92.                     $add_images $form->get('productplus_'.$ProductItem->getId().'_add_images')->getData();
  93.                     foreach ($add_images as $add_image) {
  94.                         $Detail = new ProductDataDetail();
  95.                         $Detail
  96.                             ->setValue($add_image)
  97.                             ->setProductData($ProductData)
  98.                             ->setSortNo(1);
  99.                         $ProductData->addDetail($Detail);
  100.                         $this->entityManager->persist($Detail);
  101.                         $file = new File($this->eccubeConfig['eccube_temp_image_dir'].'/'.$add_image);
  102.                         $file->move($this->eccubeConfig['eccube_save_image_dir']);
  103.                     }
  104.                     $delete_images $form->get('productplus_'.$ProductItem->getId().'_delete_images')->getData();
  105.                     foreach ($delete_images as $delete_image) {
  106.                         $Detail $this->productDataDetailRepository->findOneBy(['value' => $delete_image]);
  107.                         if ($Detail instanceof ProductDataDetail) {
  108.                             $ProductData->removeDetail($Detail);
  109.                             $this->entityManager->remove($Detail);
  110.                         }
  111.                         $this->entityManager->persist($ProductData);
  112.                         $fs = new Filesystem();
  113.                         $fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);
  114.                     }
  115.                     $this->entityManager->persist($ProductData);
  116.                     $Product->addProductData($ProductData);
  117.                     $this->entityManager->flush();
  118.                     $sortNos $request->get('productplus_'.$ProductItem->getId().'_sort_no_images');
  119.                     if ($sortNos) {
  120.                         foreach ($sortNos as $sortNo) {
  121.                             list($filename$sortNo_val) = explode('//'$sortNo);
  122.                             $Detail $this->productDataDetailRepository
  123.                                 ->findOneBy([
  124.                                     'value' => $filename,
  125.                                     'ProductData' => $ProductData,
  126.                                 ]);
  127.                             if($Detail){
  128.                                 $Detail->setSortNo($sortNo_val);
  129.                                 $this->entityManager->persist($Detail);
  130.                             }
  131.                         }
  132.                     }
  133.                     $this->entityManager->flush();
  134.                 }else{
  135.                     $value $form->get('productplus_'.$ProductItem->getId())->getData();
  136.                     if ($ProductItem->getInputType() == ProductItem::CHECKBOX_TYPE && is_array($value)) {
  137.                         $value implode(','$value);
  138.                     }
  139.                     $ProductData $this->productDataRepository->regist($ProductData$ProductItem$value);
  140.                     $Product->addProductData($ProductData);
  141.                 }
  142.             }
  143.         }
  144.     }
  145.     public function hookAdminProductCopyComplete(EventArgs $event)
  146.     {
  147.         $Product $event->getArgument('Product');
  148.         $CopyProduct $event->getArgument('CopyProduct');
  149.         foreach ($Product->getProductDatas() as $oldProductData) {
  150.             $newProductData = new ProductData();
  151.             $newProductData->setProduct($CopyProduct);
  152.             $newProductData->setProductItem($oldProductData->getProductItem());
  153.             foreach($oldProductData->getDetails() as $oldDetail){
  154.                 $newDetail = new ProductDataDetail();
  155.                 $newDetail->setValue($oldDetail->getValue())
  156.                           ->setNumValue($oldDetail->getNumValue())
  157.                           ->setProductData($newProductData);
  158.                 $newProductData->addDetail($newDetail);
  159.             }
  160.             $CopyProduct->addProductData($newProductData);
  161.             $this->entityManager->persist($newProductData);
  162.         }
  163.         $this->entityManager->persist($CopyProduct);
  164.         $this->entityManager->flush();
  165.     }
  166.     public function hookAdminProductCsvExport(EventArgs $event)
  167.     {
  168.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  169.         if ($ExportCsvRow->isDataNull()) {
  170.             $ProductClass $event->getArgument('ProductClass');
  171.             $Product $ProductClass->getProduct();
  172.             $Csv $event->getArgument('Csv');
  173.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  174.             $value null;
  175.             if($csvEntityName == 'Plugin\ProductPlus\Entity\ProductData'){
  176.                 $product_item_id $Csv->getReferenceFieldName();
  177.                 if($Csv->getFieldName() == 'product_item_id'){
  178.                     $value $Product->getIdData($product_item_id);
  179.                 }elseif($Csv->getFieldName() == 'product_item_value'){
  180.                     $value $Product->getValueData($product_item_id);
  181.                 }
  182.                 if(is_array($value))$value implode(','$value);
  183.                 $ExportCsvRow->setData($value);
  184.             }
  185.         }
  186.     }
  187.     public function hookAdminProductCsvImportProductDescriptions(EventArgs $event)
  188.     {
  189.         $header $event->getArgument('header');
  190.         $key $event->getArgument('key');
  191.         $ProductItems $this->productItemRepository->getList();
  192.         foreach($ProductItems as $ProductItem){
  193.             if($key == $ProductItem->getName() . trans('productplus.csv.common.id')){
  194.                 $header['description'] = trans('productplus.admin.product.product_csv.product_plus.id_description');
  195.                 $header['required'] = false;
  196.             }elseif($key == $ProductItem->getName() && $ProductItem->getInputType() == ProductItem::IMAGE_TYPE){
  197.                 $header['description'] = trans('productplus.admin.product.product_csv.product_plus.image_description');
  198.                 $header['required'] = false;
  199.             }
  200.         }
  201.         $event->setArgument('header',$header);
  202.     }
  203.     public function hookAdminProductCsvImportProductCheck(EventArgs $event)
  204.     {
  205.         $row $event->getArgument('row');
  206.         $data $event->getArgument('data');
  207.         $errors $event->getArgument('errors');
  208.         $ProductItems $this->productItemRepository->getList();
  209.         foreach($ProductItems as $ProductItem){
  210.             if(isset($row[$ProductItem->getName() . trans('productplus.csv.common.id')])){
  211.                 if($row[$ProductItem->getName() . trans('productplus.csv.common.id')] !== '' && preg_match("/[^0-9,]/"$row[$ProductItem->getName() . trans('productplus.csv.common.id')])){
  212.                     $message trans('productplus.admin.product.product_csv.not_correct', [
  213.                         '%line%' => $data->key() + 1,
  214.                         '%name%' => $ProductItem->getName() . trans('productplus.csv.common.id'),
  215.                     ]);
  216.                     $errors[] = $message;
  217.                 }
  218.             }
  219.         }
  220.         $event->setArgument('errors',$errors);
  221.     }
  222.     public function hookAdminProductCsvImportProductProcess(EventArgs $event)
  223.     {
  224.         $row $event->getArgument('row');
  225.         $data $event->getArgument('data');
  226.         $ProductClass $event->getArgument('ProductClass');
  227.         $Product $ProductClass->getProduct();
  228.         $ProductItems $this->productItemRepository->getList();
  229.         foreach($ProductItems as $ProductItem){
  230.             if(isset($row[$ProductItem->getName() . trans('productplus.csv.common.id')])
  231.              || isset($row[$ProductItem->getName()])){
  232.                 $ProductData $this->productDataRepository->findOneBy(['ProductItem' => $ProductItem'Product' => $Product]);
  233.                 if(!$ProductData){
  234.                     $ProductData = new ProductData();
  235.                     $ProductData->setProductItem($ProductItem);
  236.                     $ProductData->setProduct($Product);
  237.                 }
  238.                 if(isset($row[$ProductItem->getName() . trans('productplus.csv.common.id')])){
  239.                     $value $row[$ProductItem->getName() . trans('productplus.csv.common.id')];
  240.                     if (is_array($value)) {
  241.                         $value implode(','$value);
  242.                     }
  243.                 }
  244.                 if(isset($row[$ProductItem->getName()])){
  245.                     $value $row[$ProductItem->getName()];
  246.                 }
  247.                 if($ProductItem->getInputType() == ProductItem::IMAGE_TYPE) {
  248.                     foreach($ProductData->getDetails() as $removeDetail){
  249.                         $ProductData->removeDetail($removeDetail);
  250.                         $this->entityManager->remove($removeDetail);
  251.                     }
  252.                     $arrValue explode(',',$value);
  253.                     $sortNo 0;
  254.                     foreach($arrValue as $value){
  255.                         $Detail = new ProductDataDetail();
  256.                         $Detail
  257.                             ->setValue($value)
  258.                             ->setProductData($ProductData)
  259.                             ->setSortNo(++$sortNo);
  260.                         $ProductData->addDetail($Detail);
  261.                         $this->entityManager->persist($Detail);
  262.                     }
  263.                     $this->entityManager->persist($ProductData);
  264.                     $Product->addProductData($ProductData);
  265.                     $this->entityManager->flush();
  266.                 }else{
  267.                     $ProductData $this->productDataRepository->regist($ProductData$ProductItem$value);
  268.                     $Product->addProductData($ProductData);
  269.                 }
  270.             }else{
  271.             }
  272.         }
  273.     }
  274. }