<?php
namespace Customize\EventSubscriber\Default;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\{
EccubeEvents,
EventArgs
};
use \Symfony\Component\Form\FormInterface;
use \Eccube\Entity\{
Product,
CartItem
};
use \Eccube\Service\CartService;
use \Symfony\Component\HttpFoundation\Session\SessionInterface;
/**
* カート追加時のイベントを購読
*/
class ProductCartAddSubscriber implements EventSubscriberInterface
{
/**
* @var CartService
*/
protected $cartService;
/** @var SessionInterface */
private $session;
public function __construct(CartService $cartService, SessionInterface $session)
{
$this->cartService = $cartService;
$this->session = $session;
}
/**
* サブスクライブするイベントを返す
*
* @return array<string, string>
*/
public static function getSubscribedEvents(): array
{
return [
EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE => 'setIntroductionCodeIntoCartItem',
];
}
/**
* カートへの商品追加完了後のイベント
*
* @param EventArgs $event
* @return void
*/
public function setIntroductionCodeIntoCartItem(EventArgs $event): void
{
/** @var FormInterface */
$form = $event->getArgument('form');
$addCartData = $form->getData();
/** @var Product */
$Product = $event->getArgument('Product');
// セッションから紹介コードを取得
$productIntroductionCodes = $this->session->get('product_introduction_codes', []);
$introductionCode = $productIntroductionCodes[$Product->getId()] ?? null;
if (!$introductionCode) {
return;
}
/** @var FormInterface */
$form = $event->getArgument('form');
$addCartData = $form->getData();
$productClassId = $addCartData['product_class_id'];
$Cart = $this->cartService->getCart();
if (!$Cart) {
log_info('カートが存在しません');
return;
}
/** @var CartItem */
$CartItem = $Cart->getCartItems()->filter(function ($CartItem) use ($productClassId) {
return $CartItem->getProductClass()->getId() === $productClassId;
})->first();
$CartItem->setIntroductionCode($introductionCode);
$this->cartService->save();
}
}