<?php
namespace Plugin\ProductOption\Doctrine\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\CartItemLog;
use Eccube\Event\CartItemChangedEvent;
use Eccube\Repository\CartRepository;
use Eccube\Service\CartService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CartItemLogSubscriberEvent implements EventSubscriberInterface
{
protected $entityManager;
protected $cartRepository;
protected $cartService;
public function __construct(EntityManagerInterface $entityManager, CartRepository $cartRepository, CartService $cartService)
{
$this->entityManager = $entityManager;
$this->cartRepository = $cartRepository;
$this->cartService = $cartService;
}
public static function getSubscribedEvents()
{
return [
CartItemChangedEvent::ADDED => 'onCartItemAdded',
CartItemChangedEvent::REMOVED => 'onCartItemRemoved',
];
}
public function onCartItemAdded(CartItemChangedEvent $event)
{
$CartItem = $event->getCartItem();
$Customer = $event->getCustomer();
$ProductClass = $CartItem->getProductClass();
if (!$Customer || !$ProductClass) {
return;
}
$repo = $this->entityManager->getRepository(CartItemLog::class);
$exists = $repo->findOneBy([
'Customer' => $Customer,
'ProductClass' => $ProductClass,
]);
if (!$exists) {
$Log = new CartItemLog();
$Log->setCustomer($Customer);
$Log->setProductClass($ProductClass);
$this->entityManager->persist($Log);
$this->entityManager->flush($Log);
}
}
public function onCartItemRemoved(CartItemChangedEvent $event)
{
$CartItem = $event->getCartItem();
$Customer = $event->getCustomer();
$ProductClass = $CartItem->getProductClass();
if (!$Customer || !$ProductClass) {
return;
}
$carts = $this->cartService->getCarts($Customer);
foreach ($carts as $cart) {
foreach ($cart->getCartItems() as $item) {
if (
$item->getProductClass()
&& $item->getProductClass()->getId() === $ProductClass->getId()
) {
return;
}
}
}
$repo = $this->entityManager->getRepository(CartItemLog::class);
$Log = $repo->findOneBy([
'Customer' => $Customer,
'ProductClass' => $ProductClass,
]);
if ($Log) {
$this->entityManager->remove($Log);
$this->entityManager->flush($Log);
}
}
}