<?php
namespace Plugin\PiaHistory\EventSubscriber;
use Eccube\Entity\Product;
use Eccube\Repository\ProductRepository;
use Eccube\Repository\MemberRepository;
use Doctrine\ORM\EntityManagerInterface;
use Plugin\PiaHistory\Entity\PiaHistory;
use Plugin\PiaHistory\Entity\PiaHisProduct;
use Plugin\PiaHistory\Entity\PiaHisProductClass;
use Plugin\PiaHistory\Entity\PiaHisProductCategory;
use Plugin\PiaHistory\Entity\PiaHisProductImage;
use Plugin\PiaHistory\Entity\PiaHisProductStock;
use Plugin\PiaHistory\Entity\PiaHisProductTag;
use Plugin\PiaHistory\Entity\PiaHisProductAdd;
use Plugin\PiaHistory\Entity\PiaHisRankPrice;
use Plugin\PiaHistory\Entity\PiaHisCustomerClass;
use Plugin\PiaHistory\Entity\PiaHisPoint;
use Plugin\PiaHistory\Entity\PiaHisMeyasu;
use Plugin\PiaHistory\Repository\PiaHistoryRepository;
use Plugin\PiaHistory\Repository\PiaHisProductRepository;
use Plugin\PiaHistory\Repository\PiaHisProductClassRepository;
use Plugin\PiaHistory\Repository\PiaHisProductCategoryRepository;
use Plugin\PiaHistory\Repository\PiaHisProductImageRepository;
use Plugin\PiaHistory\Repository\PiaHisProductStockRepository;
use Plugin\PiaHistory\Repository\PiaHisProductTagRepository;
use Plugin\PiaHistory\Repository\PiaHisProductAddRepository;
use Plugin\PiaHistory\Repository\PiaHisRankPriceRepository;
use Plugin\PiaHistory\Repository\PiaHisCustomerClassRepository;
use Plugin\PiaHistory\Repository\PiaHisPointRepository;
use Plugin\PiaHistory\Repository\PiaHisMeyasuRepository;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Plugin\PiaProductDisp\Entity\ProductDisplayPeriod;
class ProductEditEventSubscriber implements EventSubscriberInterface
{
/**
* @var PiaHistoryRepository
*/
private $piaHistoryRepository;
/**
* @var PiaHisProductRepository
*/
private $piaHisProductRepository;
/**
* @var PiaHisProductClassRepository
*/
private $piaHisProductClassRepository;
/**
* @var PiaHisProductCategoryRepository
*/
private $piaHisProductCategoryRepository;
/**
* @var PiaHisProductImageRepository
*/
private $piaHisProductImageRepository;
/**
* @var PiaHisProductStockRepository
*/
private $piaHisProductStockRepository;
/**
* @var PiaHisProductTagRepository
*/
private $piaHisProductTagRepository;
/**
* @var PiaHisProductAddRepository
*/
private $piaHisProductAddRepository;
/**
* @var PiaHisRankPriceRepository
*/
private $piaHisRankPriceRepository;
/**
* @var PiaHisCustomerClassRepository
*/
private $piaHisCustomerClassRepository;
/**
* @var PiaHisPointRepository
*/
private $piaHisPointRepository;
/**
* @var PiaHisMeyasuRepository
*/
private $piaHisMeyasuRepository;
/**
* @var ProductRepository
*/
private $productRepository;
/**
* @var MemberRepository
*/
private $memberRepository;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var RequestStack
*/
private $requestStack;
/**
* ProductEditEventSubscriber constructor.
*/
public function __construct(
PiaHistoryRepository $piaHistoryRepository,
PiaHisProductRepository $piaHisProductRepository,
PiaHisProductClassRepository $piaHisProductClassRepository,
PiaHisProductCategoryRepository $piaHisProductCategoryRepository,
PiaHisProductImageRepository $piaHisProductImageRepository,
PiaHisProductStockRepository $piaHisProductStockRepository,
PiaHisProductTagRepository $piaHisProductTagRepository,
PiaHisProductAddRepository $piaHisProductAddRepository,
PiaHisRankPriceRepository $piaHisRankPriceRepository,
PiaHisCustomerClassRepository $piaHisCustomerClassRepository,
PiaHisPointRepository $piaHisPointRepository,
PiaHisMeyasuRepository $piaHisMeyasuRepository,
ProductRepository $productRepository,
MemberRepository $memberRepository,
TokenStorageInterface $tokenStorage,
EntityManagerInterface $entityManager,
RequestStack $requestStack
) {
$this->piaHistoryRepository = $piaHistoryRepository;
$this->piaHisProductRepository = $piaHisProductRepository;
$this->piaHisProductClassRepository = $piaHisProductClassRepository;
$this->piaHisProductCategoryRepository = $piaHisProductCategoryRepository;
$this->piaHisProductImageRepository = $piaHisProductImageRepository;
$this->piaHisProductStockRepository = $piaHisProductStockRepository;
$this->piaHisProductTagRepository = $piaHisProductTagRepository;
$this->piaHisProductAddRepository = $piaHisProductAddRepository;
$this->piaHisRankPriceRepository = $piaHisRankPriceRepository;
$this->piaHisCustomerClassRepository = $piaHisCustomerClassRepository;
$this->piaHisPointRepository = $piaHisPointRepository;
$this->piaHisMeyasuRepository = $piaHisMeyasuRepository;
$this->productRepository = $productRepository;
$this->memberRepository = $memberRepository;
$this->tokenStorage = $tokenStorage;
$this->entityManager = $entityManager;
$this->requestStack = $requestStack;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'kernel.request' => ['onKernelRequest', 0],
EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => ['onProductEditComplete', -1000], // 優先度をさらに下げる
];
}
/**
* 商品編集画面のリクエストを検知して変更前の値を保存
*
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
// 商品編集画面のPOSTリクエストのみ処理
if ($request->isMethod('POST') &&
$request->attributes->get('_route') === 'admin_product_product_edit') {
$productId = $request->get('id');
error_log('PiaHistory: onKernelRequest - Product ID: ' . $productId);
if ($productId) {
$this->saveProductBeforeData($productId);
error_log('PiaHistory: Before data saved for Product ID: ' . $productId);
}
}
}
/**
* @param EventArgs $event
*/
public function onProductEditComplete(EventArgs $event)
{
error_log('PiaHistory: onProductEditComplete called');
$Product = $event->getArgument('Product');
if ($Product && $Product->getId()) {
error_log('PiaHistory: Product ID: ' . $Product->getId());
$this->saveProductHistory($Product->getId());
} else {
error_log('PiaHistory: No product or product ID found');
}
}
/**
* リクエスト終了時の処理
*
* @param \Symfony\Component\HttpKernel\Event\TerminateEvent $event
*/
public function onKernelTerminate(\Symfony\Component\HttpKernel\Event\TerminateEvent $event)
{
$request = $event->getRequest();
// デバッグログ
error_log('PiaHistory: onKernelTerminate called - Route: ' . $request->attributes->get('_route') . ', Method: ' . $request->getMethod());
// 商品編集画面のPOSTリクエストの場合のみ処理
if ($request->isMethod('POST') &&
$request->attributes->get('_route') === 'admin_product_product_edit') {
$productId = $request->get('id');
error_log('PiaHistory: Product edit detected - Product ID: ' . $productId);
if ($productId) {
$this->saveProductHistory($productId);
}
}
}
/**
* 商品編集前のデータをセッションに保存
*
* @param int $productId
*/
private function saveProductBeforeData($productId)
{
try {
$product = $this->productRepository->find($productId);
if (!$product) {
return;
}
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return;
}
$session = $request->getSession();
// 変更前の商品データをセッションに保存
$beforeData = [
'product' => [
'id' => $product->getId(),
'name' => $product->getName(),
'note' => $product->getNote(),
'description_list' => $product->getDescriptionList(),
'description_detail' => $product->getDescriptionDetail(),
'search_word' => $product->getSearchWord(),
'free_area' => $product->getFreeArea(),
'status' => $product->getStatus() ? $product->getStatus()->getId() : null,
'datetime_start' => $this->getDisplayStartDate($product),
'datetime_end' => $this->getDisplayEndDate($product),
],
'product_classes' => [],
'product_categories' => [],
'product_images' => [],
'product_tags' => [],
];
// 商品規格データ
foreach ($product->getProductClasses() as $productClass) {
$beforeData['product_classes'][] = [
'id' => $productClass->getId(),
'product_type_id' => null, // EC-CUBE4では商品規格タイプが存在しない
'class_category_id1' => $productClass->getClassCategory1() ? $productClass->getClassCategory1()->getId() : null,
'class_category_id2' => $productClass->getClassCategory2() ? $productClass->getClassCategory2()->getId() : null,
'delivery_date_id' => $productClass->getDeliveryDuration() ? $productClass->getDeliveryDuration()->getId() : null,
'code' => $productClass->getCode(),
'stock' => $productClass->getStock(),
'stock_unlimited' => $productClass->isStockUnlimited(),
'sale_limit' => $productClass->getSaleLimit(),
'price01' => $productClass->getPrice01(),
'price02' => $productClass->getPrice02(),
'delivery_fee' => $productClass->getDeliveryFee(),
];
}
// 商品カテゴリーデータ
foreach ($product->getProductCategories() as $index => $productCategory) {
$beforeData['product_categories'][] = [
'category_id' => $productCategory->getCategory()->getId(),
'rank' => $index + 1, // EC-CUBE4では順序を配列のインデックスで管理
];
}
// 商品画像データ
foreach ($product->getProductImage() as $index => $productImage) {
$beforeData['product_images'][] = [
'file_name' => $productImage->getFileName(),
'rank' => $productImage->getSortNo() ?: ($index + 1), // EC-CUBE4ではgetSortNo()を使用
];
}
// 商品タグデータ
foreach ($product->getProductTag() as $productTag) {
$beforeData['product_tags'][] = [
'tag_id' => $productTag->getTag()->getId(),
];
}
$session->set('pia_history_before_data_' . $productId, $beforeData);
} catch (\Exception $e) {
error_log('PiaHistory: 変更前データ保存エラー - ' . $e->getMessage());
}
}
/**
* 商品履歴を保存
*
* @param int $productId
*/
private function saveProductHistory($productId)
{
try {
error_log('PiaHistory: saveProductHistory called for Product ID: ' . $productId);
// EntityManagerの状態をチェック
if (!$this->entityManager->isOpen()) {
error_log('PiaHistory: EntityManager is closed, skipping history save');
return;
}
error_log('PiaHistory: EntityManager is open, proceeding with history save');
$product = $this->productRepository->find($productId);
if (!$product) {
return;
}
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return;
}
$session = $request->getSession();
$beforeData = $session->get('pia_history_before_data_' . $productId);
// 変更前のデータがない場合はスキップ
if (!$beforeData) {
return;
}
// 変更があったかチェック
$hasChanges = $this->checkProductChanges($product, $beforeData);
error_log('PiaHistory: Changes detected: ' . ($hasChanges ? 'YES' : 'NO'));
if (!$hasChanges) {
// 変更がない場合はセッションをクリアして終了
error_log('PiaHistory: No changes detected, skipping history save');
$session->remove('pia_history_before_data_' . $productId);
return;
}
// トランザクション開始
$this->entityManager->beginTransaction();
// 管理者情報を取得
$adminId = 1;
$adminName = '管理者';
$adminDepartment = '未設定';
if ($this->tokenStorage->getToken() && $this->tokenStorage->getToken()->getUser()) {
$admin = $this->tokenStorage->getToken()->getUser();
$adminId = $admin->getId();
$adminName = $admin->getUsername();
// 管理者の詳細情報を取得
$member = $this->memberRepository->find($adminId);
if ($member) {
$adminName = $member->getName();
// 所属情報を取得(Memberエンティティに所属フィールドがある場合)
if (method_exists($member, 'getDepartment')) {
$adminDepartment = $member->getDepartment() ?: '未設定';
}
}
}
// 履歴メイン情報を作成
$history = new PiaHistory();
$history->setProductId($productId);
$history->setUpdateId($adminId);
$history->setUpdateName($adminName);
$history->setUpdateDepartment($adminDepartment);
$history->setUpdateNum(1); // 更新回数(仮)
$history->setUpdateNote('商品情報を更新しました');
$history->setCreateDate(new \DateTime());
$history->setUpdateDate(new \DateTime());
$history->setDelFlg(0);
$this->entityManager->persist($history);
$this->entityManager->flush();
$historyId = $history->getId();
// 変更箇所を詳細に検知
$changes = $this->detectDetailedChanges($product, $beforeData);
// 変更があった項目のみ履歴を保存
if (isset($changes['product'])) {
$this->saveProductBasicHistory($historyId, $product, $beforeData['product'], $changes['product']);
}
if (isset($changes['product_classes'])) {
$this->saveProductClassHistory($historyId, $product, $beforeData['product_classes'], $changes['product_classes']);
}
if (isset($changes['product_categories'])) {
$this->saveProductCategoryHistory($historyId, $product, $beforeData['product_categories'], $changes['product_categories']);
}
if (isset($changes['product_images'])) {
$this->saveProductImageHistory($historyId, $product, $beforeData['product_images'], $changes['product_images']);
}
if (isset($changes['product_tags'])) {
$this->saveProductTagHistory($historyId, $product, $beforeData['product_tags'], $changes['product_tags']);
}
// その他の履歴保存(変更検知は別途実装)
$this->saveProductStockHistory($historyId, $product);
$this->saveProductAddHistory($historyId, $product);
$this->saveRankPriceHistory($historyId, $product);
$this->saveCustomerClassHistory($historyId, $product);
$this->savePointHistory($historyId, $product);
$this->saveMeyasuHistory($historyId, $product);
// 最後にまとめてflush
$this->entityManager->flush();
// トランザクションコミット
$this->entityManager->commit();
// セッションをクリア
$session->remove('pia_history_before_data_' . $productId);
} catch (\Exception $e) {
// トランザクションロールバック
if ($this->entityManager->getConnection()->isTransactionActive()) {
$this->entityManager->rollback();
}
// エラーログを出力
error_log('PiaHistory: 商品履歴保存エラー - ' . $e->getMessage());
}
}
/**
* 商品の変更をチェック
*
* @param Product $product
* @param array $beforeData
* @return bool
*/
private function checkProductChanges(Product $product, array $beforeData)
{
$beforeProduct = $beforeData['product'];
// 基本情報の変更チェック
if ($product->getName() !== $beforeProduct['name'] ||
$product->getNote() !== $beforeProduct['note'] ||
$product->getDescriptionList() !== $beforeProduct['description_list'] ||
$product->getDescriptionDetail() !== $beforeProduct['description_detail'] ||
$product->getSearchWord() !== $beforeProduct['search_word'] ||
$product->getFreeArea() !== $beforeProduct['free_area'] ||
($product->getStatus() ? $product->getStatus()->getId() : null) !== $beforeProduct['status']) {
return true;
}
// 日時の変更チェック(PiaProductDispプラグインとの連携)
$currentStart = $this->getDisplayStartDate($product);
$currentEnd = $this->getDisplayEndDate($product);
if ($currentStart !== $beforeProduct['datetime_start'] || $currentEnd !== $beforeProduct['datetime_end']) {
return true;
}
// 商品規格の変更チェック
$currentClasses = [];
foreach ($product->getProductClasses() as $productClass) {
$currentClasses[] = [
'id' => $productClass->getId(),
'code' => $productClass->getCode(),
'stock' => $productClass->getStock(),
'price01' => $productClass->getPrice01(),
'price02' => $productClass->getPrice02(),
];
}
if ($currentClasses !== $beforeData['product_classes']) {
return true;
}
return false;
}
/**
* 変更箇所を詳細に検知
*
* @param Product $product
* @param array $beforeData
* @return array
*/
private function detectDetailedChanges(Product $product, array $beforeData)
{
$changes = [];
$beforeProduct = $beforeData['product'];
// 基本情報の変更検知
if ($product->getName() !== $beforeProduct['name']) {
$changes['product']['name'] = [
'before' => $beforeProduct['name'],
'after' => $product->getName()
];
}
if ($product->getNote() !== $beforeProduct['note']) {
$changes['product']['note'] = [
'before' => $beforeProduct['note'],
'after' => $product->getNote()
];
}
if ($product->getDescriptionList() !== $beforeProduct['description_list']) {
$changes['product']['description_list'] = [
'before' => $beforeProduct['description_list'],
'after' => $product->getDescriptionList()
];
}
if ($product->getDescriptionDetail() !== $beforeProduct['description_detail']) {
$changes['product']['description_detail'] = [
'before' => $beforeProduct['description_detail'],
'after' => $product->getDescriptionDetail()
];
}
if ($product->getSearchWord() !== $beforeProduct['search_word']) {
$changes['product']['search_word'] = [
'before' => $beforeProduct['search_word'],
'after' => $product->getSearchWord()
];
}
if ($product->getFreeArea() !== $beforeProduct['free_area']) {
$changes['product']['free_area'] = [
'before' => $beforeProduct['free_area'],
'after' => $product->getFreeArea()
];
}
$currentStatus = $product->getStatus() ? $product->getStatus()->getId() : null;
if ($currentStatus !== $beforeProduct['status']) {
$changes['product']['status'] = [
'before' => $beforeProduct['status'],
'after' => $currentStatus
];
}
// 日時の変更検知
$currentStart = $this->getDisplayStartDate($product);
$currentEnd = $this->getDisplayEndDate($product);
if ($currentStart !== $beforeProduct['datetime_start']) {
$changes['product']['datetime_start'] = [
'before' => $beforeProduct['datetime_start'],
'after' => $currentStart
];
}
if ($currentEnd !== $beforeProduct['datetime_end']) {
$changes['product']['datetime_end'] = [
'before' => $beforeProduct['datetime_end'],
'after' => $currentEnd
];
}
// 商品規格の変更検知
$currentClasses = [];
foreach ($product->getProductClasses() as $productClass) {
$currentClasses[] = [
'id' => $productClass->getId(),
'code' => $productClass->getCode(),
'stock' => $productClass->getStock(),
'price01' => $productClass->getPrice01(),
'price02' => $productClass->getPrice02(),
];
}
if ($currentClasses !== $beforeData['product_classes']) {
$changes['product_classes'] = [
'before' => $beforeData['product_classes'],
'after' => $currentClasses
];
}
// 商品カテゴリーの変更検知
$currentCategories = [];
foreach ($product->getProductCategories() as $index => $productCategory) {
$currentCategories[] = [
'category_id' => $productCategory->getCategory()->getId(),
'rank' => $index + 1,
];
}
if ($currentCategories !== $beforeData['product_categories']) {
$changes['product_categories'] = [
'before' => $beforeData['product_categories'],
'after' => $currentCategories
];
}
// 商品画像の変更検知
$currentImages = [];
foreach ($product->getProductImage() as $index => $productImage) {
$currentImages[] = [
'file_name' => $productImage->getFileName(),
'rank' => $productImage->getSortNo() ?: ($index + 1),
];
}
if ($currentImages !== $beforeData['product_images']) {
$changes['product_images'] = [
'before' => $beforeData['product_images'],
'after' => $currentImages
];
}
// 商品タグの変更検知
$currentTags = [];
foreach ($product->getProductTag() as $productTag) {
$currentTags[] = [
'tag_id' => $productTag->getTag()->getId(),
];
}
if ($currentTags !== $beforeData['product_tags']) {
$changes['product_tags'] = [
'before' => $beforeData['product_tags'],
'after' => $currentTags
];
}
return $changes;
}
/**
* 商品基本情報履歴を保存
*
* @param int $historyId
* @param Product $product
* @param array $beforeProduct
* @param array $changes
*/
private function saveProductBasicHistory($historyId, Product $product, array $beforeProduct, array $changes = [])
{
$productHistory = new PiaHisProduct();
$productHistory->setHisId($historyId);
$productHistory->setProductId($product->getId());
$productHistory->setStatus($product->getStatus()->getId());
$productHistory->setName($product->getName());
$productHistory->setNote($product->getNote());
$productHistory->setDescriptionList($product->getDescriptionList());
$productHistory->setDescriptionDetail($product->getDescriptionDetail());
$productHistory->setSearchWord($product->getSearchWord());
$productHistory->setFreeArea($product->getFreeArea());
$productHistory->setDatetimeStart($this->getDisplayStartDate($product));
$productHistory->setDatetimeEnd($this->getDisplayEndDate($product));
$productHistory->setDelFlg(0);
// 変更情報をJSONで保存
if (!empty($changes)) {
$productHistory->setChangeData(json_encode($changes, JSON_UNESCAPED_UNICODE));
}
$this->entityManager->persist($productHistory);
}
/**
* 商品規格履歴を保存
*
* @param int $historyId
* @param Product $product
* @param array $beforeClasses
*/
private function saveProductClassHistory($historyId, Product $product, array $beforeClasses)
{
foreach ($product->getProductClasses() as $productClass) {
$classHistory = new PiaHisProductClass();
$classHistory->setHisId($historyId);
$classHistory->setProductId($product->getId());
$classHistory->setProductTypeId(null); // EC-CUBE4では商品規格タイプが存在しない
$classHistory->setClassCategoryId1($productClass->getClassCategory1() ? $productClass->getClassCategory1()->getId() : null);
$classHistory->setClassCategoryId2($productClass->getClassCategory2() ? $productClass->getClassCategory2()->getId() : null);
$classHistory->setDeliveryDateId($productClass->getDeliveryDuration() ? $productClass->getDeliveryDuration()->getId() : null);
$classHistory->setProductCode($productClass->getCode());
$classHistory->setStock($productClass->getStock());
$classHistory->setStockUnlimited($productClass->isStockUnlimited());
$classHistory->setSaleLimit($productClass->getSaleLimit());
$classHistory->setPrice01($productClass->getPrice01());
$classHistory->setPrice02($productClass->getPrice02());
$classHistory->setDeliveryFee($productClass->getDeliveryFee());
$this->entityManager->persist($classHistory);
}
}
/**
* 商品カテゴリー履歴を保存
*
* @param int $historyId
* @param Product $product
* @param array $beforeCategories
*/
private function saveProductCategoryHistory($historyId, Product $product, array $beforeCategories)
{
foreach ($product->getProductCategories() as $index => $productCategory) {
$categoryHistory = new PiaHisProductCategory();
$categoryHistory->setHisId($historyId);
$categoryHistory->setProductId($product->getId());
$categoryHistory->setCategoryId($productCategory->getCategory()->getId());
$categoryHistory->setRank($index + 1); // EC-CUBE4では順序を配列のインデックスで管理
$this->entityManager->persist($categoryHistory);
}
}
/**
* 商品画像履歴を保存
*
* @param int $historyId
* @param Product $product
* @param array $beforeImages
*/
private function saveProductImageHistory($historyId, Product $product, array $beforeImages)
{
foreach ($product->getProductImage() as $index => $productImage) {
$imageHistory = new PiaHisProductImage();
$imageHistory->setHisId($historyId);
$imageHistory->setProductId($product->getId());
$imageHistory->setFileName($productImage->getFileName());
$imageHistory->setRank($productImage->getSortNo() ?: ($index + 1)); // EC-CUBE4ではgetSortNo()を使用
$this->entityManager->persist($imageHistory);
}
}
/**
* 商品在庫履歴を保存
*
* @param int $historyId
* @param Product $product
*/
private function saveProductStockHistory($historyId, Product $product)
{
foreach ($product->getProductClasses() as $productClass) {
$stockHistory = new PiaHisProductStock();
$stockHistory->setHisId($historyId);
$stockHistory->setProductClassId($productClass->getId());
$stockHistory->setStock($productClass->getStock());
$this->entityManager->persist($stockHistory);
}
}
/**
* 商品タグ履歴を保存
*
* @param int $historyId
* @param Product $product
* @param array $beforeTags
*/
private function saveProductTagHistory($historyId, Product $product, array $beforeTags)
{
foreach ($product->getProductTag() as $productTag) {
$tagHistory = new PiaHisProductTag();
$tagHistory->setHisId($historyId);
$tagHistory->setProductId($product->getId());
$tagHistory->setTag($productTag->getTag()->getId());
$this->entityManager->persist($tagHistory);
}
}
/**
* 商品追加項目履歴を保存
*
* @param int $historyId
* @param Product $product
*/
private function saveProductAddHistory($historyId, Product $product)
{
// 商品追加項目の履歴保存処理
// 他のプラグインとの連携が必要な場合はここで実装
}
/**
* 商品ランク価格履歴を保存
*
* @param int $historyId
* @param Product $product
*/
private function saveRankPriceHistory($historyId, Product $product)
{
// 商品ランク価格の履歴保存処理
// 他のプラグインとの連携が必要な場合はここで実装
foreach ($product->getProductClasses() as $productClass) {
// ランク価格の取得と保存処理
// 例: CustomerRankプラグインとの連携
}
}
/**
* 閲覧可能会員種別履歴を保存
*
* @param int $historyId
* @param Product $product
*/
private function saveCustomerClassHistory($historyId, Product $product)
{
// EC-CUBE4では閲覧可能会員種別の管理が削除されているためスキップ
// 必要に応じて他のプラグインとの連携で実装
return;
}
/**
* ポイント付与率履歴を保存
*
* @param int $historyId
* @param Product $product
*/
private function savePointHistory($historyId, Product $product)
{
// ポイント付与率の履歴保存処理
// 他のプラグインとの連携が必要な場合はここで実装
}
/**
* 目安価格履歴を保存
*
* @param int $historyId
* @param Product $product
*/
private function saveMeyasuHistory($historyId, Product $product)
{
// PiaMeyasuプラグインとの連携
try {
// PiaMeyasuプラグインのEntityが存在するかチェック
if (class_exists('Plugin\PiaMeyasu\Entity\PiaMeyasu')) {
$meyasuRepository = $this->entityManager->getRepository('Plugin\PiaMeyasu\Entity\PiaMeyasu');
$meyasuData = $meyasuRepository->findOneBy(['product_id' => $product->getId()]);
if ($meyasuData) {
$meyasuHistory = new PiaHisMeyasu();
$meyasuHistory->setHisId($historyId);
$meyasuHistory->setProductId($product->getId());
$meyasuHistory->setCoinCost($meyasuData->getCoinCost());
$meyasuHistory->setExTypeId($meyasuData->getExTypeId());
$meyasuHistory->setCommission($meyasuData->getCommission());
$meyasuHistory->setEsDispPrice($meyasuData->getEsDispPrice());
$this->entityManager->persist($meyasuHistory);
}
}
} catch (\Exception $e) {
// エラーログを出力
error_log('PiaHistory: 目安価格履歴保存エラー - ' . $e->getMessage());
}
}
/**
* PiaProductDispプラグインから表示開始日を取得
*
* @param Product $product
* @return string|null
*/
private function getDisplayStartDate(Product $product)
{
try {
if (class_exists('Plugin\PiaProductDisp\Entity\ProductDisplayPeriod')) {
$displayPeriodRepository = $this->entityManager->getRepository('Plugin\PiaProductDisp\Entity\ProductDisplayPeriod');
$displayPeriod = $displayPeriodRepository->findOneBy(['Product' => $product]);
if ($displayPeriod && $displayPeriod->getDisplayStartDate()) {
return $displayPeriod->getDisplayStartDate()->format('Y-m-d H:i:s');
}
}
} catch (\Exception $e) {
error_log('PiaHistory: 表示開始日取得エラー - ' . $e->getMessage());
}
return null;
}
/**
* PiaProductDispプラグインから表示終了日を取得
*
* @param Product $product
* @return string|null
*/
private function getDisplayEndDate(Product $product)
{
try {
if (class_exists('Plugin\PiaProductDisp\Entity\ProductDisplayPeriod')) {
$displayPeriodRepository = $this->entityManager->getRepository('Plugin\PiaProductDisp\Entity\ProductDisplayPeriod');
$displayPeriod = $displayPeriodRepository->findOneBy(['Product' => $product]);
if ($displayPeriod && $displayPeriod->getDisplayEndDate()) {
return $displayPeriod->getDisplayEndDate()->format('Y-m-d H:i:s');
}
}
} catch (\Exception $e) {
error_log('PiaHistory: 表示終了日取得エラー - ' . $e->getMessage());
}
return null;
}
}