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

Open in your IDE?
  1. <?php
  2. namespace Plugin\ProductPlus42\Event;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Eccube\Common\EccubeConfig;
  5. use Eccube\Event\EccubeEvents;
  6. use Eccube\Event\EventArgs;
  7. use Eccube\Event\TemplateEvent;
  8. use Eccube\Repository\CustomerRepository;
  9. use Plugin\ProductPlus42\Entity\ProductData;
  10. use Plugin\ProductPlus42\Entity\ProductDataDetail;
  11. use Plugin\ProductPlus42\Entity\ProductItem;
  12. use Plugin\ProductPlus42\Repository\ProductDataDetailRepository;
  13. use Plugin\ProductPlus42\Repository\ProductDataRepository;
  14. use Plugin\ProductPlus42\Repository\ProductItemRepository;
  15. use Plugin\ProductPlus42\Service\ProductPlusService;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\Filesystem\Filesystem;
  18. use Symfony\Component\HttpFoundation\File\File;
  19. class AdminProductEvent implements EventSubscriberInterface
  20. {
  21.     private $entityManager;
  22.     private $eccubeConfig;
  23.     private $productItemRepository;
  24.     private $productDataRepository;
  25.     private $productDataDetailRepository;
  26.     private $productPlusService;
  27.     /**
  28.      * @var CustomerRepository
  29.      */
  30.     protected $customerRepository;
  31.     public function __construct(
  32.         EntityManagerInterface $entityManager,
  33.         EccubeConfig $eccubeConfig,
  34.         ProductItemRepository $productItemRepository,
  35.         ProductDataRepository $productDataRepository,
  36.         ProductDataDetailRepository $productDataDetailRepository,
  37.         ProductPlusService $productPlusService,
  38.         CustomerRepository $customerRepository
  39.     )
  40.     {
  41.         $this->entityManager $entityManager;
  42.         $this->eccubeConfig $eccubeConfig;
  43.         $this->productItemRepository $productItemRepository;
  44.         $this->productDataRepository $productDataRepository;
  45.         $this->productDataDetailRepository $productDataDetailRepository;
  46.         $this->productPlusService $productPlusService;
  47.         $this->customerRepository $customerRepository;
  48.     }
  49.     /**
  50.      * @return array
  51.      */
  52.     public static function getSubscribedEvents()
  53.     {
  54.         return [
  55.             '@admin/Product/product.twig' => 'onTemplateAdminProductEdit',
  56.             EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'hookAdminProductEditComplete',
  57.             EccubeEvents::ADMIN_PRODUCT_COPY_COMPLETE => 'hookAdminProductCopyComplete',
  58.             EccubeEvents::ADMIN_PRODUCT_CSV_EXPORT => 'hookAdminProductCsvExport',
  59.         ];
  60.     }
  61.     public function onTemplateAdminProductEdit(TemplateEvent $event)
  62.     {
  63.         $parameters $event->getParameters();
  64.         $ProductItems $this->productItemRepository->getList();
  65.         $EnabledItems $this->productPlusService->getEnabledProductPlusForm();
  66.         foreach ($ProductItems as $key => $ProductItem) {
  67.             foreach ($EnabledItems as $EnabledItem) {
  68.                 if ($ProductItem->getId() == $EnabledItem->getId())
  69.                     unset($ProductItems[$key]);
  70.             }
  71.         }
  72.         $htCust $this->customerRepository->getHash();
  73.         $parameters['htCustomer'] = $htCust;
  74.         $parameters['ProductItems'] = $ProductItems;
  75.         $event->setParameters($parameters);
  76.         $source $event->getSource();
  77.         if (preg_match("/\{\%\sfor\sf\sin\sform(\sif|\|filter\(f\s\=\>)\sf\.vars\.eccube\_form\_options\.auto\_render/"$source$result)) {
  78.             $search $result[0];
  79.             $replace "{{ include('@ProductPlus42/admin/Product/ext_edit.twig') }}" $search;
  80.             $source str_replace($search$replace$source);
  81.         }
  82.         // フォーム全体でエラーがある場合、ページ上部にエラーがあることを分かりやすく表示する
  83.         $errorBannerAnchor "{{ form_widget(form.return_link) }}";
  84.         $errorBanner $errorBannerAnchor "\n"
  85.             "{% if form.vars.submitted and not form.vars.valid %}\n"
  86.             "<div class=\"alert alert-danger\" role=\"alert\">\n"
  87.             "<i class=\"fa fa-exclamation-triangle me-1\"></i>入力内容にエラーがある項目があります。(<a href=\"#\" id=\"productplus-error-scroll-link\">ここ</a>をクリックすると該当箇所までスクロールします)\n"
  88.             "</div>\n"
  89.             "{% endif %}";
  90.         $source str_replace($errorBannerAnchor$errorBanner$source);
  91.         // 「商品説明(一覧)」に既存データがある場合は、折りたたみを開いた状態で表示する
  92.         $descriptionListCollapseAnchor '<div class="collapse ec-collapse" id="addComment">';
  93.         $descriptionListCollapseReplace '<div class="collapse ec-collapse{% if form.description_list.vars.value %} show{% endif %}" id="addComment">';
  94.         $source str_replace($descriptionListCollapseAnchor$descriptionListCollapseReplace$source);
  95.         $event->setSource($source);
  96.         $event->addSnippet('@ProductPlus42/admin/Product/upload_js.twig');
  97.         $event->addSnippet('@ProductPlus42/admin/Product/error_scroll.twig');
  98.     }
  99.     public function hookAdminProductEditComplete(EventArgs $event)
  100.     {
  101.         $Product $event->getArgument('Product');
  102.         $form $event->getArgument('form');
  103.         $request $event->getRequest();
  104.         $ProductItems $this->productItemRepository->getList();
  105.         foreach ($ProductItems as $ProductItem) {
  106.             if ($form->has('productplus_' $ProductItem->getId())) {
  107.                 $ProductData $this->productDataRepository->findOneBy(['ProductItem' => $ProductItem'Product' => $Product]);
  108.                 if (!$ProductData) {
  109.                     $ProductData = new ProductData();
  110.                     $ProductData->setProductItem($ProductItem);
  111.                     $ProductData->setProduct($Product);
  112.                 }
  113.                 if ($ProductItem->getInputType() == ProductItem::IMAGE_TYPE) {
  114.                     $add_images $form->get('productplus_' $ProductItem->getId() . '_add_images')->getData();
  115.                     foreach ($add_images as $add_image) {
  116.                         $Detail = new ProductDataDetail();
  117.                         $Detail
  118.                             ->setValue($add_image)
  119.                             ->setProductData($ProductData)
  120.                             ->setSortNo(1);
  121.                         $ProductData->addDetail($Detail);
  122.                         $this->entityManager->persist($Detail);
  123.                         $file = new File($this->eccubeConfig['eccube_temp_image_dir'] . '/' $add_image);
  124.                         $file->move($this->eccubeConfig['eccube_save_image_dir']);
  125.                     }
  126.                     $delete_images $form->get('productplus_' $ProductItem->getId() . '_delete_images')->getData();
  127.                     $fs = new Filesystem();
  128.                     foreach ($delete_images as $delete_image) {
  129.                         $Detail $this->productDataDetailRepository->findOneBy(['value' => $delete_image]);
  130.                         if ($Detail instanceof ProductDataDetail) {
  131.                             $ProductData->removeDetail($Detail);
  132.                             $this->entityManager->remove($Detail);
  133.                             $fs->remove($this->eccubeConfig['eccube_save_image_dir'] . '/' $delete_image);
  134.                         } else {
  135.                             $fs->remove($this->eccubeConfig['eccube_temp_image_dir'] . '/' $delete_image);
  136.                         }
  137.                         $this->entityManager->persist($ProductData);
  138.                     }
  139.                     $this->entityManager->persist($ProductData);
  140.                     $Product->addProductData($ProductData);
  141.                     $this->entityManager->flush();
  142.                     if ($image $request->request->all()['admin_product']['productplus_' $ProductItem->getId() . '_images'] ?? []) {
  143.                         foreach ($image as $sortNo => $filename) {
  144.                             $Detail $this->productDataDetailRepository
  145.                                 ->findOneBy([
  146.                                     'value' => pathinfo($filenamePATHINFO_BASENAME),
  147.                                     'ProductData' => $ProductData,
  148.                                 ]);
  149.                             if ($Detail) {
  150.                                 $Detail->setSortNo($sortNo);
  151.                                 $this->entityManager->persist($Detail);
  152.                             }
  153.                         }
  154.                         $this->entityManager->flush();
  155.                     }
  156.                 } else {
  157.                     $value $form->get('productplus_' $ProductItem->getId())->getData();
  158.                     if ($value instanceof \DateTime) {
  159.                         $value $value->format('Y-m-d');
  160.                     } elseif ($ProductItem->getInputType() == ProductItem::CHECKBOX_TYPE && is_array($value)) {
  161.                         $value implode(','$value);
  162.                     }
  163.                     $ProductData $this->productDataRepository->regist($ProductData$ProductItem$value);
  164.                     $Product->addProductData($ProductData);
  165.                 }
  166.             }
  167.         }
  168.     }
  169.     public function hookAdminProductCopyComplete(EventArgs $event)
  170.     {
  171.         $Product $event->getArgument('Product');
  172.         $CopyProduct $event->getArgument('CopyProduct');
  173.         foreach ($Product->getProductDatas() as $oldProductData) {
  174.             $newProductData = new ProductData();
  175.             $newProductData->setProduct($CopyProduct);
  176.             $newProductData->setProductItem($oldProductData->getProductItem());
  177.             if ($newProductData->getProductItem()->getInputType() == ProductItem::IMAGE_TYPE) {
  178.                 foreach ($oldProductData->getDetails() as $oldDetail) {
  179.                     // 画像ファイルを新規作成
  180.                     $extension pathinfo($oldDetail->getValue(), PATHINFO_EXTENSION);
  181.                     $filename date('mdHis') . uniqid('_') . '.' $extension;
  182.                     try {
  183.                         $fs = new Filesystem();
  184.                         $fs->copy($this->eccubeConfig['eccube_save_image_dir'] . '/' $oldDetail->getValue(), $this->eccubeConfig['eccube_save_image_dir'] . '/' $filename);
  185.                     } catch (\Exception $e) {
  186.                         // エラーが発生しても無視する
  187.                     }
  188.                     $newDetail = new ProductDataDetail();
  189.                     $newDetail->setValue($filename)
  190.                         ->setSortNo($oldDetail->getSortNo())
  191.                         ->setProductData($newProductData);
  192.                     $newProductData->addDetail($newDetail);
  193.                 }
  194.             } else {
  195.                 foreach ($oldProductData->getDetails() as $oldDetail) {
  196.                     $newDetail = new ProductDataDetail();
  197.                     $newDetail->setValue($oldDetail->getValue())
  198.                         ->setNumValue($oldDetail->getNumValue())
  199.                         ->setDateValue($oldDetail->getDateValue())
  200.                         ->setProductData($newProductData);
  201.                     $newProductData->addDetail($newDetail);
  202.                 }
  203.             }
  204.             $CopyProduct->addProductData($newProductData);
  205.             $this->entityManager->persist($newProductData);
  206.         }
  207.         $this->entityManager->persist($CopyProduct);
  208.         $this->entityManager->flush();
  209.     }
  210.     public function hookAdminProductCsvExport(EventArgs $event)
  211.     {
  212.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  213.         if ($ExportCsvRow->isDataNull()) {
  214.             $ProductClass $event->getArgument('ProductClass');
  215.             $Product $ProductClass->getProduct();
  216.             $Csv $event->getArgument('Csv');
  217.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  218.             $value null;
  219.             if ($csvEntityName == 'Plugin\ProductPlus42\Entity\ProductData') {
  220.                 $product_item_id $Csv->getReferenceFieldName();
  221.                 if ($Csv->getFieldName() == 'product_item_id') {
  222.                     $value $Product->getIdData($product_item_id);
  223.                 } elseif ($Csv->getFieldName() == 'product_item_value') {
  224.                     $value $Product->getValueData($product_item_id);
  225.                 }
  226.                 if (is_array($value))
  227.                     $value implode(','$value);
  228.                 $ExportCsvRow->setData($value);
  229.             }
  230.         }
  231.     }
  232. }