custom/static-plugins/CioBusinesscards/src/Subscriber/BusinesscardDataSubscriber.php line 55

Open in your IDE?
  1. <?php
  2. namespace CioBusinesscards\Subscriber;
  3. use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
  4. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  5. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  6. use Shopware\Core\Framework\Struct\ArrayEntity;
  7. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpFoundation\RequestStack;
  11. class BusinesscardDataSubscriber implements EventSubscriberInterface
  12. {
  13.     private RequestStack $requestStack;
  14.     private CartService $cartService;
  15.     public function __construct(RequestStack $requestStackCartService $cartService)
  16.     {
  17.         $this->requestStack $requestStack;
  18.         $this->cartService $cartService;
  19.     }
  20.     public static function getSubscribedEvents(): array
  21.     {
  22.         return [
  23.             BeforeLineItemAddedEvent::class => 'onLineItemAdded',
  24.             ProductPageLoadedEvent::class => 'onProductPageLoaded',
  25.         ];
  26.     }
  27.     public function onLineItemAdded(BeforeLineItemAddedEvent $event): void
  28.     {
  29.         $requestLineItems $this->requestStack->getCurrentRequest()->get('lineItems');
  30.         if (is_array($requestLineItems)) {
  31.             foreach ($event->getCart()->getLineItems() as $lineItem) {
  32.                 $requestLineItem current(array_filter($requestLineItems, function ($requestLineItem) use ($lineItem) {
  33.                     return $requestLineItem['id'] == $lineItem->getId();
  34.                 }));
  35.                 if ($requestLineItem && isset($requestLineItem['payload'])) {
  36.                     foreach ($requestLineItem['payload'] as $key => $value) {
  37.                         $lineItem->setPayloadValue($key$value);
  38.                     }
  39.                     if ($event->isMerged() && is_array($lineItem->getPayload()) && (key_exists('businesscard_data'$lineItem->getPayload()) || key_exists('recommendation_card_data'$lineItem->getPayload()))) {
  40.                         $lineItem->setQuantity($lineItem->getQuantity() - 1);
  41.                     }
  42.                 }
  43.             }
  44.         }
  45.     }
  46.     public function onProductPageLoaded(ProductPageLoadedEvent $event): SalesChannelProductEntity
  47.     {
  48.         $product $event->getPage()->getProduct();
  49.         $lineItemId $event->getRequest()->get('lineItemId');
  50.         if (!is_null($lineItemId)) {
  51.             if (!$this->cartService->getCart($event->getSalesChannelContext()->getToken(), $event->getSalesChannelContext())->has($lineItemId)) {
  52.                 $request $event->getRequest();
  53.                 $response = new RedirectResponse($request->getRequestUri());
  54.                 $response->send();
  55.             } else {
  56.                 $lineItem $this->cartService->getCart($event->getSalesChannelContext()->getToken(), $event->getSalesChannelContext())->getLineItems()->get($lineItemId);
  57.                 if (isset($lineItem->getPayload()['businesscard_data']) && strlen($lineItem->getPayload()['businesscard_data'])) {
  58.                     $product->addExtension('businesscard_data', new ArrayEntity(json_decode($lineItem->getPayload()['businesscard_data'], true)));
  59.                 }
  60.                 if (isset($lineItem->getPayload()['recommendation_card_data']) && strlen($lineItem->getPayload()['recommendation_card_data'])) {
  61.                     $product->addExtension('recommendation_card_data', new ArrayEntity(json_decode($lineItem->getPayload()['recommendation_card_data'], true)));
  62.                 }
  63.             }
  64.         }
  65.         return $product;
  66.     }
  67. }