custom/plugins/KilbShopwareProductDesigner/src/Subscriber/CartSubscriber.php line 29

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Kilb\KilbShopwareProductDesigner\Subscriber;
  3. use Kilb\KilbShopwareProductDesigner\Constants;
  4. use Shopware\Core\Checkout\Cart\Event\BeforeLineItemAddedEvent;
  5. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. class CartSubscriber implements EventSubscriberInterface
  9. {
  10.     private const POST_KEY_LINE_ITEMS 'lineItems';
  11.     /**
  12.      * @return string[]
  13.      */
  14.     public static function getSubscribedEvents(): array
  15.     {
  16.         return[
  17.             BeforeLineItemAddedEvent::class => 'onBeforeLineItemAdded',
  18.         ];
  19.     }
  20.     /**
  21.      * @param BeforeLineItemAddedEvent $event
  22.      * @throws \Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException
  23.      */
  24.     public function onBeforeLineItemAdded(BeforeLineItemAddedEvent $event): void
  25.     {
  26.         $cart $event->getCart();
  27.         $lineItemAdded $event->getLineItem();
  28.         $lineItemIds $this->getLineItemIds($lineItemAdded);
  29.         $requestLineItems $this->getRequestLineItems();
  30.         $requestLineItem $this->getRequestLineItem($lineItemIds$requestLineItems);
  31.         $groupSecret $requestLineItem[Constants::LINE_ITEM_PAYLOAD_KEY_GROUP_SECRET] ?? null;
  32.         $basketImageUrl $requestLineItem[Constants::LINE_ITEM_PAYLOAD_KEY_BASKET_IMAGE_URL] ?? null;
  33.         if (empty($groupSecret) || empty($basketImageUrl)) {
  34.             return;
  35.         }
  36.         $cart->remove($lineItemAdded->getId());
  37.         $this->setPayloadRecursively($lineItemAdded$groupSecret$basketImageUrl);
  38.         $this->updateLineItemId($lineItemAdded$basketImageUrl);
  39.         $cart->add($lineItemAdded);
  40.     }
  41.     /**
  42.      * @param LineItem $lineItem
  43.      * @param string $groupSecret
  44.      * @param string $basketImageUrl
  45.      * @return void
  46.      */
  47.     private function setPayloadRecursively(LineItem $lineItemstring $groupSecretstring $basketImageUrl): void
  48.     {
  49.         $lineItem->setPayloadValue(Constants::LINE_ITEM_PAYLOAD_KEY_GROUP_SECRET$groupSecret);
  50.         $lineItem->setPayloadValue(Constants::LINE_ITEM_PAYLOAD_KEY_BASKET_IMAGE_URL$basketImageUrl);
  51.         foreach ($lineItem->getChildren() as $child) {
  52.             $this->setPayloadRecursively($child$groupSecret$basketImageUrl);
  53.         }
  54.     }
  55.     /**
  56.      * @param LineItem $lineItem
  57.      * @param string $basketImageUrl
  58.      *
  59.      * @return void
  60.      */
  61.     private function updateLineItemId(LineItem $lineItemstring $basketImageUrl): void
  62.     {
  63.         $lineItemId md5($lineItem->getId() . '-' $basketImageUrl);
  64.         $lineItem->setId($lineItemId);
  65.     }
  66.     /**
  67.      * @param string[] $lineItemIds
  68.      * @param array<string,array<string,string>> $requestLineItems
  69.      *
  70.      * @return array<string,string>
  71.      */
  72.     private function getRequestLineItem(array $lineItemIds, array $requestLineItems): array
  73.     {
  74.         foreach ($requestLineItems as $lineItemId => $lineItem) {
  75.             if (in_array($lineItemId$lineItemIds)) {
  76.                 return $lineItem;
  77.             }
  78.         }
  79.         return [];
  80.     }
  81.     /**
  82.      * @return array<string,array<string,string>>
  83.      */
  84.     private function getRequestLineItems(): array
  85.     {
  86.         $request Request::createFromGlobals();
  87.         $requestParams $request->request->all();
  88.         if (empty($requestParams[self::POST_KEY_LINE_ITEMS])) {
  89.             return [];
  90.         }
  91.         return (array)$requestParams[self::POST_KEY_LINE_ITEMS];
  92.     }
  93.     /**
  94.      * @return string[]
  95.      */
  96.     private function getLineItemIds(LineItem $lineItem): array
  97.     {
  98.         $lineItemIds = [];
  99.         $lineItemIds[] = $lineItem->getId();
  100.         if ($lineItem->getReferencedId()) {
  101.             $lineItemIds[] = $lineItem->getReferencedId();
  102.         }
  103.         foreach ($lineItem->getChildren() as $child) {
  104.             $lineItemIds array_merge($lineItemIds$this->getLineItemIds($child));
  105.         }
  106.         return array_unique($lineItemIds);
  107.     }
  108. }