app/Customize/EventSubscriber/Default/ProductCartAddSubscriber.php line 57

Open in your IDE?
  1. <?php
  2. namespace Customize\EventSubscriber\Default;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Eccube\Event\{
  5.     EccubeEvents,
  6.     EventArgs
  7. };
  8. use \Symfony\Component\Form\FormInterface;
  9. use \Eccube\Entity\{
  10.     Product,
  11.     CartItem
  12. };
  13. use \Eccube\Service\CartService;
  14. use \Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. /**
  16.  * カート追加時のイベントを購読
  17.  */
  18. class ProductCartAddSubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * @var CartService
  22.      */
  23.     protected $cartService;
  24.     /** @var SessionInterface */
  25.     private $session;
  26.     public function __construct(CartService $cartServiceSessionInterface $session)
  27.     {
  28.         $this->cartService $cartService;
  29.         $this->session $session;
  30.     }
  31.     /**
  32.      * サブスクライブするイベントを返す
  33.      *
  34.      * @return array<string, string>
  35.      */
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE => 'setIntroductionCodeIntoCartItem',
  40.         ];
  41.     }
  42.     /**
  43.      * カートへの商品追加完了後のイベント
  44.      *
  45.      * @param EventArgs $event
  46.      * @return void
  47.      */
  48.     public function setIntroductionCodeIntoCartItem(EventArgs $event): void
  49.     {
  50.         /** @var FormInterface */
  51.         $form $event->getArgument('form');
  52.         $addCartData $form->getData();
  53.         /** @var Product */
  54.         $Product $event->getArgument('Product');
  55.         // セッションから紹介コードを取得
  56.         $productIntroductionCodes $this->session->get('product_introduction_codes', []);
  57.         $introductionCode $productIntroductionCodes[$Product->getId()] ?? null;
  58.         if (!$introductionCode) {
  59.             return;
  60.         }
  61.         /** @var FormInterface */
  62.         $form $event->getArgument('form');
  63.         $addCartData $form->getData();
  64.         $productClassId $addCartData['product_class_id'];
  65.         $Cart $this->cartService->getCart();
  66.         if (!$Cart) {
  67.             log_info('カートが存在しません');
  68.             return;
  69.         }
  70.         /** @var CartItem */
  71.         $CartItem $Cart->getCartItems()->filter(function ($CartItem) use ($productClassId) {
  72.             return $CartItem->getProductClass()->getId() === $productClassId;
  73.         })->first();
  74.         $CartItem->setIntroductionCode($introductionCode);
  75.         $this->cartService->save();
  76.     }
  77. }