<?php
/*
* Plugin Name : ProductOption
*
* Copyright (C) BraTech Co., Ltd. All Rights Reserved.
* http://www.bratech.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\ProductOption42\Event;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Event\TemplateEvent;
use Plugin\ProductOption42\Entity\Option;
use Plugin\ProductOption42\Entity\ProductOption;
use Plugin\ProductOption42\Repository\ProductOptionRepository;
use Plugin\ProductOption42\Repository\ProductOptionConfigRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AdminProductEvent implements EventSubscriberInterface
{
private $productOptionRepository;
private $productOptionConfigRepository;
public function __construct(
ProductOptionRepository $productOptionRepository,
ProductOptionConfigRepository $productOptionConfigRepository = null
)
{
$this->productOptionRepository = $productOptionRepository;
$this->productOptionConfigRepository = $productOptionConfigRepository;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'@admin/Product/index.twig' => 'onTemplateAdminProduct',
'@admin/Product/product.twig' => 'onTemplateAdminProductEdit',
EccubeEvents::ADMIN_PRODUCT_COPY_COMPLETE => 'hookAdminProductCopyComplete',
EccubeEvents::ADMIN_PRODUCT_CSV_EXPORT => 'hookAdminProductCsvExport',
];
}
public function onTemplateAdminProduct(TemplateEvent $event)
{
$twig = '@ProductOption42/admin/Product/product_list.twig';
$event->addSnippet($twig);
$js = '@ProductOption42/admin/Product/product_list.js';
$event->addAsset($js);
}
public function onTemplateAdminProductEdit(TemplateEvent $event)
{
$source = $event->getSource();
if(preg_match("/\<\/div\>[\n|\r\n|\r]\s*\{\%\sif\sid\sis\snot\snull\s\%\}[\n|\r\n|\r]/",$source, $result)){
$search = $result[0];
$replace_parts = trim($search, '</div>');
$replace = "</div>{{ include('@ProductOption42/admin/Product/product_edit.twig') }}" . $replace_parts;
$source = str_replace($search, $replace, $source);
}
$event->setSource($source);
$parameters = $event->getParameters();
$arrType[Option::SELECT_TYPE] = trans("productoption.option.type.select");
$arrType[Option::RADIO_TYPE] = trans("productoption.option.type.radio");
$arrType[Option::CHECKBOX_TYPE] = trans("productoption.option.type.checkbox");
$arrType[Option::TEXT_TYPE] = trans("productoption.option.type.text");
$arrType[Option::TEXTAREA_TYPE] = trans("productoption.option.type.textarea");
$arrType[Option::DATE_TYPE] = trans("productoption.option.type.date");
$arrType[Option::NUMBER_TYPE] = trans("productoption.option.type.number");
$parameters['arrType'] = $arrType;
// ========== 商品別オプション設定機能を追加 ==========
if ($this->productOptionConfigRepository && isset($parameters['Product'])) {
$product = $parameters['Product'];
// 商品が存在し、オプションがある場合のみ処理
if ($product && $product->getId() && $product->getProductOptions()->count() > 0) {
error_log('AdminProductEvent: Loading option configs for product ' . $product->getId());
// この商品のオプション設定を取得
$optionConfigs = [];
foreach ($product->getProductOptions() as $productOption) {
$option = $productOption->getOption();
$configs = $this->productOptionConfigRepository->findByProductAndOption(
$product->getId(),
$option->getId()
);
foreach ($configs as $config) {
$optionConfigs[$option->getId()][$config->getOptionCategoryId()] = [
'visible' => $config->getVisible(),
'is_base_price' => $config->getIsBasePrice(),
];
}
}
// テンプレートに渡す
$parameters['option_configs_by_product'] = [
$product->getId() => $optionConfigs
];
error_log('AdminProductEvent: Loaded ' . count($optionConfigs) . ' option configs');
}
}
// ========== 商品別オプション設定機能 ここまで ==========
$event->setParameters($parameters);
}
public function hookAdminProductCopyComplete(EventArgs $event)
{
$Product = $event->getArgument('Product');
$CopyProduct = $event->getArgument('CopyProduct');
foreach ($Product->getProductOptions() as $oldProductOption) {
$newProductOption = new ProductOption();
$newProductOption->setProduct($CopyProduct);
$newProductOption->setOption($oldProductOption->getOption());
$newProductOption->setSortNo($oldProductOption->getSortNo());
$this->productOptionRepository->saveProductOption($newProductOption);
}
}
public function hookAdminProductCsvExport(EventArgs $event)
{
$ExportCsvRow = $event->getArgument('ExportCsvRow');
if ($ExportCsvRow->isDataNull()) {
$ProductClass = $event->getArgument('ProductClass');
$Product = $ProductClass->getProduct();
$Csv = $event->getArgument('Csv');
$csvEntityName = str_replace('\\\\', '\\', $Csv->getEntityName());
if($csvEntityName == 'Plugin\ProductOption42\Entity\ProductOption'){
$array = [];
foreach($Product->getProductOptions() as $ProductOption){
if($Csv->getFieldName() == 'product_option_id'){
$array[] = $ProductOption->getOption()->getId();
}elseif($Csv->getFieldName() == 'product_option_name'){
$array[] = $ProductOption->getOption()->getBackendName();
}
}
$ExportCsvRow->setData(implode(',', $array));
}
}
}
}