custom/plugins/EconsorAtBitConfiguratorConnector/src/Subscriber/AtBitSessionCleaner.php line 48

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Econsor\Shopware\AtBitConfiguratorConnector\Subscriber;
  3. use Econsor\Shopware\AtBitConfiguratorConnector\AtBitSessionKeys;
  4. use Econsor\Shopware\AtBitConfiguratorConnector\Services\AtBitPriceCalculator;
  5. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  6. use Shopware\Core\Checkout\Cart\Event\LineItemQuantityChangedEvent;
  7. use Shopware\Core\Checkout\Cart\Event\LineItemRemovedEvent;
  8. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  9. use Shopware\Core\Framework\Struct\ArrayStruct;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\Session\Session;
  12. class AtBitSessionCleaner implements EventSubscriberInterface
  13. {
  14.     private $session;
  15.     private $priceCalculator;
  16.     public function __construct(Session $sessionAtBitPriceCalculator $priceCalculator)
  17.     {
  18.         $this->session         $session;
  19.         $this->priceCalculator $priceCalculator;
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             LineItemRemovedEvent::class          => 'onLineItemRemoved',
  25.             LineItemQuantityChangedEvent::class   => 'onQuantityChanged',
  26.             CheckoutOrderPlacedEvent::class       => 'onOrderPlaced',
  27.         ];
  28.     }
  29.     public function onLineItemRemoved(LineItemRemovedEvent $event): void
  30.     {
  31.         $id     $event->getLineItem()->getId();
  32.         $config $this->session->has(AtBitSessionKeys::CONFIGURATOR_PRODUCTS)
  33.             ? $this->session->get(AtBitSessionKeys::CONFIGURATOR_PRODUCTS)
  34.             : null;
  35.         if ($config && array_key_exists($id$config)) {
  36.             unset($config[$id]);
  37.             $this->session->set(AtBitSessionKeys::CONFIGURATOR_PRODUCTS$config);
  38.         }
  39.     }
  40.     public function onQuantityChanged(LineItemQuantityChangedEvent $event): void
  41.     {
  42.         if (!$configuratorProduct $this->getLineItemFromSession($event->getLineItem()->getId())) {
  43.             return;
  44.         }
  45.         /** @var ArrayStruct|null $extension */
  46.         $extension $configuratorProduct->getExtension('atbitConfiguration');
  47.         if (!$extension instanceof ArrayStruct) {
  48.             return;
  49.         }
  50.         $quantity $event->getLineItem()->getQuantity();
  51.         $configuratorProduct->setQuantity($quantity);
  52.         $configuratorProduct->setPrice($this->priceCalculator->calculate(
  53.             (float) $extension->get('GesamtpreisOhneMwSt'),
  54.             (float) $extension->get('MwSt'),
  55.             $quantity
  56.         ));
  57.         $this->setLineItemFromSession($configuratorProduct$event->getLineItem()->getId());
  58.     }
  59.     public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
  60.     {
  61.         $this->session->remove(AtBitSessionKeys::CONFIGURATOR_PRODUCTS);
  62.     }
  63.     private function getLineItemFromSession(string $id): ?LineItem
  64.     {
  65.         $lineItems $this->session->get(AtBitSessionKeys::CONFIGURATOR_PRODUCTS);
  66.         if ($lineItems && array_key_exists($id$lineItems)) {
  67.             return $lineItems[$id];
  68.         }
  69.         return null;
  70.     }
  71.     private function setLineItemFromSession(LineItem $lineItemstring $id): void
  72.     {
  73.         $lineItems $this->session->get(AtBitSessionKeys::CONFIGURATOR_PRODUCTS);
  74.         if ($lineItems) {
  75.             $lineItems[$id] = $lineItem;
  76.             $this->session->set(AtBitSessionKeys::CONFIGURATOR_PRODUCTS$lineItems);
  77.         }
  78.     }
  79. }