app/Plugin/ProductOption42/Event/AdminProductEvent.php line 119

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : ProductOption
  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\ProductOption42\Event;
  12. use Eccube\Event\EccubeEvents;
  13. use Eccube\Event\EventArgs;
  14. use Eccube\Event\TemplateEvent;
  15. use Plugin\ProductOption42\Entity\Option;
  16. use Plugin\ProductOption42\Entity\ProductOption;
  17. use Plugin\ProductOption42\Repository\ProductOptionRepository;
  18. use Plugin\ProductOption42\Repository\ProductOptionConfigRepository;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. class AdminProductEvent implements EventSubscriberInterface
  21. {
  22.     private $productOptionRepository;
  23.     private $productOptionConfigRepository;
  24.     public function __construct(
  25.             ProductOptionRepository $productOptionRepository,
  26.             ProductOptionConfigRepository $productOptionConfigRepository null
  27.             )
  28.     {
  29.         $this->productOptionRepository $productOptionRepository;
  30.         $this->productOptionConfigRepository $productOptionConfigRepository;
  31.     }
  32.     /**
  33.      * @return array
  34.      */
  35.     public static function getSubscribedEvents()
  36.     {
  37.         return [
  38.             '@admin/Product/index.twig' => 'onTemplateAdminProduct',
  39.             '@admin/Product/product.twig' => 'onTemplateAdminProductEdit',
  40.             EccubeEvents::ADMIN_PRODUCT_COPY_COMPLETE => 'hookAdminProductCopyComplete',
  41.             EccubeEvents::ADMIN_PRODUCT_CSV_EXPORT => 'hookAdminProductCsvExport',
  42.         ];
  43.     }
  44.     public function onTemplateAdminProduct(TemplateEvent $event)
  45.     {
  46.         $twig '@ProductOption42/admin/Product/product_list.twig';
  47.         $event->addSnippet($twig);
  48.         $js '@ProductOption42/admin/Product/product_list.js';
  49.         $event->addAsset($js);
  50.     }
  51.     public function onTemplateAdminProductEdit(TemplateEvent $event)
  52.     {
  53.         $source $event->getSource();
  54.         if(preg_match("/\<\/div\>[\n|\r\n|\r]\s*\{\%\sif\sid\sis\snot\snull\s\%\}[\n|\r\n|\r]/",$source$result)){
  55.             $search $result[0];
  56.             $replace_parts trim($search'</div>');
  57.             $replace "</div>{{ include('@ProductOption42/admin/Product/product_edit.twig') }}" $replace_parts;
  58.             $source str_replace($search$replace$source);
  59.         }
  60.         $event->setSource($source);
  61.         $parameters $event->getParameters();
  62.         $arrType[Option::SELECT_TYPE] = trans("productoption.option.type.select");
  63.         $arrType[Option::RADIO_TYPE] = trans("productoption.option.type.radio");
  64.         $arrType[Option::CHECKBOX_TYPE] = trans("productoption.option.type.checkbox");
  65.         $arrType[Option::TEXT_TYPE] = trans("productoption.option.type.text");
  66.         $arrType[Option::TEXTAREA_TYPE] = trans("productoption.option.type.textarea");
  67.         $arrType[Option::DATE_TYPE] = trans("productoption.option.type.date");
  68.         $arrType[Option::NUMBER_TYPE] = trans("productoption.option.type.number");
  69.         $parameters['arrType'] = $arrType;
  70.         
  71.         // ========== 商品別オプション設定機能を追加 ==========
  72.         if ($this->productOptionConfigRepository && isset($parameters['Product'])) {
  73.             $product $parameters['Product'];
  74.             
  75.             // 商品が存在し、オプションがある場合のみ処理
  76.             if ($product && $product->getId() && $product->getProductOptions()->count() > 0) {
  77.                 error_log('AdminProductEvent: Loading option configs for product ' $product->getId());
  78.                 
  79.                 // この商品のオプション設定を取得
  80.                 $optionConfigs = [];
  81.                 foreach ($product->getProductOptions() as $productOption) {
  82.                     $option $productOption->getOption();
  83.                     $configs $this->productOptionConfigRepository->findByProductAndOption(
  84.                         $product->getId(),
  85.                         $option->getId()
  86.                     );
  87.                     
  88.                     foreach ($configs as $config) {
  89.                         $optionConfigs[$option->getId()][$config->getOptionCategoryId()] = [
  90.                             'visible' => $config->getVisible(),
  91.                             'is_base_price' => $config->getIsBasePrice(),
  92.                         ];
  93.                     }
  94.                 }
  95.                 
  96.                 // テンプレートに渡す
  97.                 $parameters['option_configs_by_product'] = [
  98.                     $product->getId() => $optionConfigs
  99.                 ];
  100.                 
  101.                 error_log('AdminProductEvent: Loaded ' count($optionConfigs) . ' option configs');
  102.             }
  103.         }
  104.         // ========== 商品別オプション設定機能 ここまで ==========
  105.         
  106.         $event->setParameters($parameters);
  107.     }
  108.     public function hookAdminProductCopyComplete(EventArgs $event)
  109.     {
  110.         $Product $event->getArgument('Product');
  111.         $CopyProduct $event->getArgument('CopyProduct');
  112.         foreach ($Product->getProductOptions() as $oldProductOption) {
  113.             $newProductOption = new ProductOption();
  114.             $newProductOption->setProduct($CopyProduct);
  115.             $newProductOption->setOption($oldProductOption->getOption());
  116.             $newProductOption->setSortNo($oldProductOption->getSortNo());
  117.             $this->productOptionRepository->saveProductOption($newProductOption);
  118.         }
  119.     }
  120.     public function hookAdminProductCsvExport(EventArgs $event)
  121.     {
  122.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  123.         if ($ExportCsvRow->isDataNull()) {
  124.             $ProductClass $event->getArgument('ProductClass');
  125.             $Product $ProductClass->getProduct();
  126.             $Csv $event->getArgument('Csv');
  127.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  128.             if($csvEntityName == 'Plugin\ProductOption42\Entity\ProductOption'){
  129.                 $array = [];
  130.                 foreach($Product->getProductOptions() as $ProductOption){
  131.                     if($Csv->getFieldName() == 'product_option_id'){
  132.                         $array[] = $ProductOption->getOption()->getId();
  133.                     }elseif($Csv->getFieldName() == 'product_option_name'){
  134.                         $array[] = $ProductOption->getOption()->getBackendName();
  135.                     }
  136.                 }
  137.                 $ExportCsvRow->setData(implode(','$array));
  138.             }
  139.         }
  140.     }
  141. }