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

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