app/Plugin/ProductOption42/Event/AdminProductSaveEvent.php line 46

Open in your IDE?
  1. <?php
  2. /*
  3.  * Plugin Name : ProductOption42
  4.  * Admin Product Save Event
  5.  */
  6. namespace Plugin\ProductOption42\Event;
  7. use Eccube\Event\EventArgs;
  8. use Plugin\ProductOption42\Entity\ProductOptionConfig;
  9. use Plugin\ProductOption42\Repository\ProductOptionConfigRepository;
  10. use Plugin\ProductOption42\Repository\OptionCategoryRepository;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. /**
  15.  * 商品保存時にオプション設定を保存
  16.  */
  17. class AdminProductSaveEvent implements EventSubscriberInterface
  18. {
  19.     private $productOptionConfigRepository;
  20.     private $entityManager;
  21.     private $requestStack;
  22.     private $optionCategoryRepository;
  23.     public function __construct(
  24.         ProductOptionConfigRepository $productOptionConfigRepository,
  25.         EntityManagerInterface $entityManager,
  26.         RequestStack $requestStack,
  27.         OptionCategoryRepository $optionCategoryRepository
  28.     ) {
  29.         $this->productOptionConfigRepository $productOptionConfigRepository;
  30.         $this->entityManager $entityManager;
  31.         $this->requestStack $requestStack;
  32.         $this->optionCategoryRepository $optionCategoryRepository;
  33.     }
  34.     public static function getSubscribedEvents()
  35.     {
  36.         return [
  37.             'admin.product.edit.complete' => 'onAdminProductEditComplete',
  38.         ];
  39.     }
  40.     public function onAdminProductEditComplete(EventArgs $event)
  41.     {
  42.         $product $event->getArgument('Product');
  43.         $request $this->requestStack->getCurrentRequest();
  44.         if (!$request) {
  45.             error_log('AdminProductSaveEvent: No request found');
  46.             return;
  47.         }
  48.         $optionConfigData $request->request->all('option_config');
  49.         if (empty($optionConfigData)) {
  50.             error_log('AdminProductSaveEvent: No option_config data');
  51.             return;
  52.         }
  53.         error_log('AdminProductSaveEvent: Saving option configs for product ' $product->getId());
  54.         error_log('AdminProductSaveEvent: Data = ' print_r($optionConfigDatatrue));
  55.         // 既存の設定を削除
  56.         $existingConfigs $this->entityManager
  57.             ->getRepository(ProductOptionConfig::class)
  58.             ->findBy(['product_id' => $product->getId()]);
  59.         foreach ($existingConfigs as $config) {
  60.             $this->entityManager->remove($config);
  61.         }
  62.         $this->entityManager->flush();
  63.         // 新しい設定を保存
  64.         foreach ($optionConfigData as $optionId => $categories) {
  65.             $basePriceCategoryId $categories['base_price'] ?? null;
  66.             error_log("AdminProductSaveEvent: Option {$optionId} - Base price category: {$basePriceCategoryId}");
  67.             // オプションに属するすべてのカテゴリを取得
  68.             $allCategories $this->optionCategoryRepository->findBy(['Option' => $optionId]);
  69.             foreach ($allCategories as $optionCategory) {
  70.                 $categoryId $optionCategory->getId();
  71.                 
  72.                 // visible チェックの状態を取得(チェックがあれば true、なければ false)
  73.                 $isVisible = isset($categories[$categoryId]['visible']) && $categories[$categoryId]['visible'] == '1';
  74.                 
  75.                 // 基準価格かどうか
  76.                 $isBasePrice = ($categoryId == $basePriceCategoryId);
  77.                 $config = new ProductOptionConfig();
  78.                 $config->setProductId($product->getId());
  79.                 $config->setOptionId($optionId);
  80.                 $config->setOptionCategoryId($categoryId);
  81.                 $config->setVisible($isVisible);
  82.                 $config->setIsBasePrice($isBasePrice);
  83.                 $config->setCreateDate(new \DateTime());
  84.                 $config->setUpdateDate(new \DateTime());
  85.                 $this->entityManager->persist($config);
  86.                 
  87.                 error_log("AdminProductSaveEvent: Saved config for category {$categoryId} - visible: " . ($isVisible 'true' 'false') . ", is_base: " . ($isBasePrice 'true' 'false'));
  88.             }
  89.         }
  90.         $this->entityManager->flush();
  91.         error_log('AdminProductSaveEvent: All configs saved successfully');
  92.     }
  93. }