custom/plugins/CioRentalProductsCheckoutValidation/src/Subscriber/CheckoutValidationSubscriber.php line 32

Open in your IDE?
  1. <?php
  2. namespace CioRentalProductsCheckoutValidation\Subscriber;
  3. use CioRentalProductsCheckoutValidation\Error\DifferentRentalDurationsError;
  4. use Rhiem\RhiemRentalProducts\Components\RentalTime\RentalTime;
  5. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  6. use Shopware\Core\Checkout\Cart\LineItem\LineItemCollection;
  7. use Shopware\Storefront\Event\StorefrontRenderEvent;
  8. use Symfony\Component\DependencyInjection\ContainerInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Shopware\Core\Checkout\Cart\Cart;
  11. class CheckoutValidationSubscriber implements EventSubscriberInterface
  12. {
  13.     private ContainerInterface $container;
  14.     public function __construct(ContainerInterface $container)
  15.     {
  16.         $this->container $container;
  17.     }
  18.     public static function getSubscribedEvents() : array
  19.     {
  20.         return [
  21.             StorefrontRenderEvent::class => 'onStorefrontRender'
  22.         ];
  23.     }
  24.     public function onStorefrontRender(StorefrontRenderEvent $event)
  25.     {
  26.         $route $event->getRequest()->get('_route');
  27.         if ($route == 'frontend.checkout.confirm.page') {
  28.             /** @var Cart $cart */
  29.             $cart $event->getParameters()['page']->getCart();
  30.             /** @var LineItemCollection $lineItemCollection */
  31.             $lineItemCollection $cart->getLineItems();
  32.             $rentDurationStartFirstLineItem $this->getRentalDurationStart($lineItemCollection->first());
  33.             $rentDurationEndFirstLineItem $this->getRentalDurationEnd($lineItemCollection->first());
  34.             $rentDurationStartFirstLineItem $rentDurationStartFirstLineItem instanceof \DateTime $rentDurationStartFirstLineItem->format('Y-m-d H:i') : null;
  35.             $rentDurationEndFirstLineItem $rentDurationEndFirstLineItem instanceof \DateTime $rentDurationEndFirstLineItem->format('Y-m-d H:i') : null;
  36.             /** @var LineItem $lineItem */
  37.             foreach ($lineItemCollection as $lineItem) {
  38.                 $rentDurationStartCurrentLineItem $this->getRentalDurationStart($lineItem);
  39.                 $rentDurationEndCurrentLineItem $this->getRentalDurationEnd($lineItem);
  40.                 $rentDurationStartCurrentLineItem $rentDurationStartCurrentLineItem instanceof \DateTime $rentDurationStartCurrentLineItem->format('Y-m-d H:i') : null;
  41.                 $rentDurationEndCurrentLineItem $rentDurationEndCurrentLineItem instanceof \DateTime $rentDurationEndCurrentLineItem->format('Y-m-d H:i') : null;
  42.                 if ($rentDurationStartCurrentLineItem !== $rentDurationStartFirstLineItem || $rentDurationEndCurrentLineItem !== $rentDurationEndFirstLineItem) {
  43.                     $cart->addErrors(new DifferentRentalDurationsError());
  44.                     $event->getRequest()->getSession()->getFlashBag()->add('danger''Um die Bestellung bestätigen zu können muss für alle Mietartikel der identische Mietzeitraum ausgewählt sein.');
  45.                     return;
  46.                 }
  47.             }
  48.         }
  49.     }
  50.     protected function getRentalDurationStart(LineItem $lineItem)
  51.     {
  52.         if (key_exists('rentalProduct'$lineItem->getPayload()) && is_array($lineItem->getPayload()['rentalProduct']) && key_exists('rentalTime'$lineItem->getPayload()['rentalProduct']) && $lineItem->getPayload()['rentalProduct']['rentalTime'] instanceof RentalTime) {
  53.             /** @var RentalTime $rentalTime */
  54.             $rentalTime $lineItem->getPayload()['rentalProduct']['rentalTime'];
  55.             return $rentalTime->getStartDate();
  56.         }
  57.         return null;
  58.     }
  59.     protected function getRentalDurationEnd(LineItem $lineItem)
  60.     {
  61.         if (key_exists('rentalProduct'$lineItem->getPayload()) && is_array($lineItem->getPayload()['rentalProduct']) && key_exists('rentalTime'$lineItem->getPayload()['rentalProduct']) && $lineItem->getPayload()['rentalProduct']['rentalTime'] instanceof RentalTime) {
  62.             /** @var RentalTime $rentalTime */
  63.             $rentalTime $lineItem->getPayload()['rentalProduct']['rentalTime'];
  64.             return $rentalTime->getEndDate();
  65.         }
  66.         return null;
  67.     }
  68. }