custom/plugins/ZeobvAbandonedCart/src/Subscriber/PageSubscriber.php line 102

Open in your IDE?
  1. <?php declare(strict_types 1);
  2. namespace Zeobv\AbandonedCart\Subscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\RequestStack;
  6. use Shopware\Core\Checkout\Cart\Cart;
  7. use Shopware\Core\Checkout\Cart\Event\LineItemAddedEvent;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\Framework\Uuid\Uuid;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  13. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  14. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  15. use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
  16. use Zeobv\AbandonedCart\Service\AbandonedCartService;
  17. use Zeobv\AbandonedCart\Service\CartService;
  18. class PageSubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * @var EntityRepositoryInterface
  22.      */
  23.     protected $abandonedCartRepository;
  24.     /**
  25.      * @var AbandonedCartService
  26.      */
  27.     protected $abandonedCartService;
  28.     /**
  29.      * @var EntityRepositoryInterface
  30.      */
  31.     protected $salesChannelDomainRepository;
  32.     /**
  33.      * @var Request|null
  34.      */
  35.     protected $currentRequest;
  36.     /**
  37.      * @var CartService
  38.      */
  39.     protected $cartService;
  40.     /**
  41.      * PageSubscriber constructor.
  42.      *
  43.      * @param RequestStack              $requestStack
  44.      * @param EntityRepositoryInterface $abandonedCartRepository
  45.      * @param EntityRepositoryInterface $salesChannelDomainRepository
  46.      * @param AbandonedCartService      $abandonedCartService
  47.      * @param CartService               $cartService
  48.      */
  49.     public function __construct(
  50.         RequestStack $requestStack,
  51.         EntityRepositoryInterface $abandonedCartRepository,
  52.         EntityRepositoryInterface $salesChannelDomainRepository,
  53.         AbandonedCartService $abandonedCartService,
  54.         CartService $cartService
  55.     )
  56.     {
  57.         $this->currentRequest $requestStack->getCurrentRequest();
  58.         $this->abandonedCartRepository $abandonedCartRepository;
  59.         $this->abandonedCartService $abandonedCartService;
  60.         $this->cartService $cartService;
  61.         $this->salesChannelDomainRepository $salesChannelDomainRepository;
  62.     }
  63.     /**
  64.      * @return array
  65.      */
  66.     public static function getSubscribedEvents(): array
  67.     {
  68.         return [
  69.             LineItemAddedEvent::class => 'onLineItemAdded',
  70.             CheckoutRegisterPageLoadedEvent::class => 'onCheckoutRegisterPageLoaded',
  71.             CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmPageLoaded',
  72.             CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoaded',
  73.         ];
  74.     }
  75.     /**
  76.      * @param LineItemAddedEvent $event
  77.      */
  78.     public function onLineItemAdded(LineItemAddedEvent $event)
  79.     {
  80.         $cart $event->getCart();
  81.         $salesChannelContext $event->getContext();
  82.         if ($this->currentRequest->attributes->get('sw-domain-id')) {
  83.             $this->upsertAbandonedCart($cart$salesChannelContext);
  84.         }
  85.     }
  86.     /**
  87.      * @param CheckoutConfirmPageLoadedEvent $event
  88.      */
  89.     public function onCheckoutConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event)
  90.     {
  91.         $cart $event->getPage()->getCart();
  92.         $this->abandonedCartService->saveCart($cart$event->getSalesChannelContext());
  93.         $this->upsertAbandonedCart($cart$event->getSalesChannelContext());
  94.     }
  95.     /**
  96.      * @param CheckoutRegisterPageLoadedEvent $event
  97.      */
  98.     public function onCheckoutRegisterPageLoaded(CheckoutRegisterPageLoadedEvent $event)
  99.     {
  100.         $cart $event->getPage()->getCart();
  101.         $this->abandonedCartService->saveCart($cart$event->getSalesChannelContext());
  102.         $this->upsertAbandonedCart($cart$event->getSalesChannelContext());
  103.     }
  104.     public function onCheckoutFinishPageLoaded(CheckoutFinishPageLoadedEvent $event)
  105.     {
  106.         $cartToken $event->getSalesChannelContext()->getToken();
  107.         $criteria = new Criteria();
  108.         $criteria->addFilter(new EqualsFilter('cartToken'$cartToken));
  109.         $abandonedCart $this->abandonedCartRepository->search($criteria$event->getContext())->first();
  110.         if (is_null($abandonedCart)) {
  111.             return;
  112.         }
  113.         $this->abandonedCartService->resolveAbandonedCart($abandonedCart$event->getContext());
  114.     }
  115.     protected function upsertAbandonedCart(Cart $cartSalesChannelContext $context)
  116.     {
  117.         $criteria = new Criteria();
  118.         $criteria->addFilter(new EqualsFilter('cartToken'$cart->getToken()));
  119.         $cartResult $this->abandonedCartRepository->search($criteria$context->getContext());
  120.         $data = [
  121.             'id' => $cartResult->first() ? $cartResult->first()->getId() : Uuid::randomHex(),
  122.             'cartToken' => $cart->getToken(),
  123.             'lineItems' => $cart->getLineItems()->getElements(),
  124.             'currencyId' => $context->getCurrency()->getId(),
  125.             'paymentMethodId' => $context->getPaymentMethod()->getId(),
  126.             'shippingMethodId' => $context->getShippingMethod()->getId(),
  127.             'countryId' => $context->getShippingLocation()->getCountry()->getId(),
  128.             'salesChannelId' => $context->getSalesChannel()->getId(),
  129.             'salesChannelDomainId' => $this->currentRequest->attributes->get('sw-domain-id')
  130.         ];
  131.         if ( $customer $context->getCustomer() ) {
  132.             $data['customerId'] = $customer->getId();
  133.             $data['email'] = $customer->getEmail();
  134.             $this->abandonedCartRepository->upsert([$data], $context->getContext());
  135.         }
  136.     }
  137. }