<?php
namespace Plugin\CustomPrice;
use Eccube\Event\TemplateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Plugin\CustomPrice\Entity\CustomPriceConfig;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Plugin\CustomPrice\Entity\CustomProductPrice;
use Plugin\CustomPrice\Entity\CustomPrice;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class Event implements EventSubscriberInterface
{
private $entityManager;
public function __construct(
EntityManagerInterface $entityManager
) {
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents()
{
return [
'Product/detail.twig' => 'onProductdetail',
'@admin/Product/product.twig' => 'onTemplateAdminProduct',
'@admin/Order/edit.twig' => 'onTemplateAdminOrderEdit',
'@admin/Order/shipping.twig' => 'onTemplateAdminOrderEdit',
'@admin/Setting/System/masterdata.twig' => 'onTemplateAdminMasterdata',
EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete'
];
}
public function onProductdetail(TemplateEvent $event)
{
$twig = '@CustomPrice/Product/detail.twig';
// $Product = $event->getParameter('Product');
// $minPrice = null;
// $maxPrice = null;
// $maxTotal = null;
// $minTotal = null;
// if ($Product->getCustomProductPrice() !== null && !empty($Product->getCustomProductPrice()->getPrices())) {
// $customPriceRepo = $this->entityManager->getRepository(CustomPrice::class);
// $minPrice = $customPriceRepo->findMinPrice($Product->getCustomProductPrice()->getPrices());
// $maxPrice = $customPriceRepo->findMaxPrice($Product->getCustomProductPrice()->getPrices());
// $maxTotal = $customPriceRepo->findMaxTotal($Product->getCustomProductPrice()->getPrices());
// $minTotal = $customPriceRepo->findMinTotal($Product->getCustomProductPrice()->getPrices());
// }
// // 計算された価格をテンプレート変数として設定
// $event->setParameter('minPrice', $minPrice);
// $event->setParameter('maxPrice', $maxPrice);
// $event->setParameter('maxTotal', $maxTotal);
// $event->setParameter('minTotal', $minTotal);
$event->addSnippet($twig);
}
public function onTemplateAdminProduct(TemplateEvent $event)
{
$customPriceConfigs = $this->entityManager->getRepository(CustomPriceConfig::class)->findAll();
$event->setParameter('customPriceConfigs', $customPriceConfigs);
$event->addSnippet('@CustomPrice/admin/Product/product_add_price.twig');
}
public function onTemplateAdminOrderEdit(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
if (preg_match('/<p\sclass="mb-0\sfw-bold">(.*?\{\{\sOrderItem\.product_name\s\}\}.*?)<\/p>/s', $source, $result)) {
$search = $result[0];
$replace = $search . "{{ include('@CustomPrice/admin/Order/orderitem_option.twig') }}";
$source = str_replace($search, $replace, $source);
}
$event->setSource($source);
}
public function onAdminProductEditComplete(EventArgs $event)
{
$form = $event->getArgument('form');
$product = $event->getArgument('Product');
$customPriceConfigId = $form->get('customPriceConfig')->getData();
if ($customPriceConfigId) {
$customPriceConfig = $this->entityManager->getRepository(CustomPriceConfig::class)->find($customPriceConfigId);
// 製品IDとカスタム価格設定IDに基づいて、既存のCustomProductPriceエンティティを検索します。
$customProductPrice = $this->entityManager->getRepository(CustomProductPrice::class)->findOneBy([
'Product' => $product,
//'CustomPriceConfig' => $customPriceConfig
]);
// 既存のエンティティが見つからなければ新規作成
if (!$customProductPrice) {
$customProductPrice = new CustomProductPrice();
$customProductPrice->setProduct($product);
}
// フォームから受け取ったその他のデータでエンティティを更新します。
$customProductPrice->setCustomPriceConfig($customPriceConfig)
->setHangmanFlag($form->get('hangmanFlag')->getData())
->setMountings($form->get('mountings')->getData());
if (!empty($customPriceConfigId)) {
$customPriceTotal = $form->get('customPriceTotal' . $customPriceConfigId)->getData();
$customProductPrice->setPrices($customPriceTotal);
} else {
$customProductPrice->setPrices([]);
}
// ここで$customProductPriceを永続化し、フラッシュする必要があります。
$this->entityManager->persist($customProductPrice);
$this->entityManager->flush();
} else {
$CustomProductPrice = $this->entityManager->getRepository(CustomProductPrice::class)->findOneBy(["Product" => $product->getId()]);
if ($CustomProductPrice) {
$this->entityManager->remove($CustomProductPrice);
$this->entityManager->flush();
}
}
}
public function onTemplateAdminMasterdata(TemplateEvent $event)
{
$source = $event->getSource();
$parameters = $event->getParameters();
// 特定の<td>要素にマッチするパターンを定義
$pattern = '/<td\sclass="align-middle text-center">\s*{{\s*form_widget\(data\.name\)\s*}}\s*{{\s*form_errors\(data\.name\)\s*}}\s*<\/td>/s';
if (preg_match($pattern, $source, $result)) {
$search = $result[0];
// 挿入したい内容を定義
$insertContent = "{{ include('@CustomPrice/admin/Setting/System/masterdata.twig') }}";
// マッチした内容に新しい内容を追加して変更
$replace = $search . $insertContent;
// ソース内の元のマッチを変更されたバージョンに置き換え
$source = str_replace($search, $replace, $source);
$event->setSource($source);
}
$event->addSnippet('@CustomPrice/admin/Setting/System/masterdata_js.twig');
}
}