<?php/* * Plugin Name : ProductOption42 * Admin Product Save Event */namespace Plugin\ProductOption42\Event;use Eccube\Event\EventArgs;use Plugin\ProductOption42\Entity\ProductOptionConfig;use Plugin\ProductOption42\Repository\ProductOptionConfigRepository;use Plugin\ProductOption42\Repository\OptionCategoryRepository;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpFoundation\RequestStack;/** * 商品保存時にオプション設定を保存 */class AdminProductSaveEvent implements EventSubscriberInterface{ private $productOptionConfigRepository; private $entityManager; private $requestStack; private $optionCategoryRepository; public function __construct( ProductOptionConfigRepository $productOptionConfigRepository, EntityManagerInterface $entityManager, RequestStack $requestStack, OptionCategoryRepository $optionCategoryRepository ) { $this->productOptionConfigRepository = $productOptionConfigRepository; $this->entityManager = $entityManager; $this->requestStack = $requestStack; $this->optionCategoryRepository = $optionCategoryRepository; } public static function getSubscribedEvents() { return [ 'admin.product.edit.complete' => 'onAdminProductEditComplete', ]; } public function onAdminProductEditComplete(EventArgs $event) { $product = $event->getArgument('Product'); $request = $this->requestStack->getCurrentRequest(); if (!$request) { error_log('AdminProductSaveEvent: No request found'); return; } $optionConfigData = $request->request->all('option_config'); if (empty($optionConfigData)) { error_log('AdminProductSaveEvent: No option_config data'); return; } error_log('AdminProductSaveEvent: Saving option configs for product ' . $product->getId()); error_log('AdminProductSaveEvent: Data = ' . print_r($optionConfigData, true)); // 既存の設定を削除 $existingConfigs = $this->entityManager ->getRepository(ProductOptionConfig::class) ->findBy(['product_id' => $product->getId()]); foreach ($existingConfigs as $config) { $this->entityManager->remove($config); } $this->entityManager->flush(); // 新しい設定を保存 foreach ($optionConfigData as $optionId => $categories) { $basePriceCategoryId = $categories['base_price'] ?? null; error_log("AdminProductSaveEvent: Option {$optionId} - Base price category: {$basePriceCategoryId}"); // オプションに属するすべてのカテゴリを取得 $allCategories = $this->optionCategoryRepository->findBy(['Option' => $optionId]); foreach ($allCategories as $optionCategory) { $categoryId = $optionCategory->getId(); // visible チェックの状態を取得(チェックがあれば true、なければ false) $isVisible = isset($categories[$categoryId]['visible']) && $categories[$categoryId]['visible'] == '1'; // 基準価格かどうか $isBasePrice = ($categoryId == $basePriceCategoryId); $config = new ProductOptionConfig(); $config->setProductId($product->getId()); $config->setOptionId($optionId); $config->setOptionCategoryId($categoryId); $config->setVisible($isVisible); $config->setIsBasePrice($isBasePrice); $config->setCreateDate(new \DateTime()); $config->setUpdateDate(new \DateTime()); $this->entityManager->persist($config); error_log("AdminProductSaveEvent: Saved config for category {$categoryId} - visible: " . ($isVisible ? 'true' : 'false') . ", is_base: " . ($isBasePrice ? 'true' : 'false')); } } $this->entityManager->flush(); error_log('AdminProductSaveEvent: All configs saved successfully'); }}