custom/plugins/NimbitsPriceOnRequestNext/src/Subscriber/StorefrontSubscriber.php line 180

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Nimbits\NimbitsPriceOnRequestNext\Subscriber;
  3. use Nimbits\NimbitsPriceOnRequestNext\Service\PriceOnRequestService;
  4. use Nimbits\NimbitsPriceOnRequestNext\Setting\Service\SettingService;
  5. use Shopware\Core\Checkout\Cart\Cart;
  6. use Shopware\Core\Checkout\Cart\CartBehavior;
  7. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  8. use Shopware\Core\Checkout\Cart\Rule\LineItemScope;
  9. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  10. use Shopware\Core\Content\Product\SalesChannel\Detail\AbstractProductDetailRoute;
  11. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  15. use Shopware\Core\Framework\Struct\StructCollection;
  16. use Shopware\Core\Framework\Uuid\Uuid;
  17. use Shopware\Core\System\SalesChannel\Entity\SalesChannelEntityLoadedEvent;
  18. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  19. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  20. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
  21. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  22. use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
  23. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  24. use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\HttpFoundation\RedirectResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
  29. use Symfony\Component\HttpKernel\KernelEvents;
  30. use Shopware\Storefront\Page\PageLoadedEvent;
  31. use Shopware\Core\Checkout\Cart\RuleLoader;
  32. use Shopware\Core\Checkout\Cart\CartRuleLoader;
  33. use Shopware\Core\Checkout\Cart\AbstractRuleLoader;
  34. use Shopware\Core\Checkout\Cart\CachedRuleLoader;
  35. use Shopware\Core\Framework\Rule\Rule;
  36. //use Symfony\Component\DependencyInjection\ContainerBuilder;
  37. class StorefrontSubscriber implements EventSubscriberInterface
  38. {
  39.     private SettingService $settingsService;
  40.     private CartService $cartService;
  41.     private $productRepository;
  42.     private $productDetailRoute;
  43.     private PriceOnRequestService $priceOnRequestService;
  44.     private SalesChannelRepositoryInterface $salesChannelProductRepository;
  45.     private CartRuleLoader $cartRuleLoader;
  46.     private CachedRuleLoader $cachedRuleLoader;
  47.     public function __construct(
  48.         SettingService                  $settingsService,
  49.         CartService                     $cartService,
  50.         EntityRepositoryInterface       $productRepository,
  51.         AbstractProductDetailRoute      $productDetailRoute,
  52.         PriceOnRequestService           $priceOnRequestService,
  53.         SalesChannelRepositoryInterface $salesChannelProductRepository,
  54.         CartRuleLoader                  $cartRuleLoader,
  55.         CachedRuleLoader                $cachedRuleLoader
  56.     )
  57.     {
  58.         $this->settingsService $settingsService;
  59.         $this->cartService $cartService;
  60.         $this->productRepository $productRepository;
  61.         $this->productDetailRoute $productDetailRoute;
  62.         $this->priceOnRequestService $priceOnRequestService;
  63.         $this->salesChannelProductRepository $salesChannelProductRepository;
  64.         $this->cartRuleLoader $cartRuleLoader;
  65.         $this->cachedRuleLoader $cachedRuleLoader;
  66.     }
  67.     public static function getSubscribedEvents(): array
  68.     {
  69.         // Return the events to listen to as array like this:  <event to listen to> => <method to execute>
  70.         return [
  71.             KernelEvents::CONTROLLER_ARGUMENTS => 'beforeController',
  72.             ProductPageLoadedEvent::class => 'onProductPageLoaded',
  73.             'sales_channel.product.loaded' => 'productsLoaded'//TODO
  74.             OffcanvasCartPageLoadedEvent::class => 'onCheckoutPageLoaded'//TODO ALl poroducts
  75.             CheckoutCartPageLoadedEvent::class => 'onCheckoutPageLoaded'//TODO ALl poroducts
  76.             CheckoutConfirmPageLoadedEvent::class => 'onCheckoutPageLoaded'//TODO ALl poroducts
  77.             FooterPageletLoadedEvent::class => 'onFooterLoaded'
  78.         ];
  79.     }
  80.     public function beforeController(ControllerArgumentsEvent $event)
  81.     {
  82.         if ($event->getRequest()->getPathInfo() == '/checkout/product/add-by-number' && isset($event->getArguments()[1])) {
  83.             /** @var $salesChannelContext SalesChannelContext */
  84.             $salesChannelContext $event->getArguments()[1];
  85.             $product $this->salesChannelProductRepository->search(
  86.                 (new Criteria())
  87.                     ->addFilter(new EqualsFilter('productNumber'$event->getRequest()->get('number'))),
  88.                 $salesChannelContext
  89.             );
  90.             if ($product->count() > 0) {
  91.                 $productId $product->first()->getId();
  92.                 $productPorRuleset $this->priceOnRequestService->getProductRuleSet($salesChannelContext$this->priceOnRequestService->createMockLineItem($product->first()));
  93.                 //if the product is not addable to cart
  94.                 if ($productPorRuleset->getVars()["por_add_to_cart_not_visible"]) {
  95.                     $event->setController(function (Request $requestSalesChannelContext $salesChannelContext) {
  96.                         return new RedirectResponse($request->getUriForPath('/checkout/cart?nb_por_nbpn=1'));
  97.                     });
  98.                 }
  99.             }
  100.         }
  101.     }
  102.     public function onProductPageLoaded(ProductPageLoadedEvent $event)
  103.     {
  104.         //evaluate products
  105.         $salesChannelContext $event->getSalesChannelContext();
  106.         $productId $event->getPage()->getProduct()->getId();
  107.         $productPorRuleset $this->priceOnRequestService->getProductRuleSet($salesChannelContext$this->priceOnRequestService->createMockLineItem($event->getPage()->getProduct()));
  108.         $event->getPage()->getProduct()->addExtension('nimbits_por_product_ruleset'$productPorRuleset);
  109.     }
  110.     public function productsLoaded(SalesChannelEntityLoadedEvent $event): void
  111.     {
  112.         //evaluate products
  113.         $salesChannelContext $event->getSalesChannelContext();
  114.         foreach ($event->getEntities() as $product) {
  115.             $productPorRuleset $this->priceOnRequestService->getProductRuleSet($salesChannelContext$this->priceOnRequestService->createMockLineItem($product));
  116.             $product->addExtension('nimbits_por_product_ruleset'$productPorRuleset);
  117.             //add unit set
  118.             // $product->addExtension('nimbits_por_product_units', (new StructCollection())->assign($this->getUnitsForProductByProduct($product, $salesChannelContext)));
  119.         }
  120.     }
  121.     public function getUnitsForProductByLineitem($item$salesChannelContext)
  122.     {
  123.         if (isset($item->getPayload()["productNumber"])) {
  124.             $productNumber $item->getPayload()["productNumber"];
  125.             $product $this->salesChannelProductRepository->search(
  126.                 (new Criteria())
  127.                     ->addFilter(new EqualsFilter('productNumber'$productNumber)),
  128.                 $salesChannelContext
  129.             );
  130.             if(empty($product)){
  131.                 return ["packUnit" => """packUnitPlural" => ""];
  132.             }
  133.             try{
  134.                 $pu =  $product->first()->packUnit;
  135.                 $pup $product->first()->packUnitPlural;
  136.             }catch (\Exception $e){
  137.                 $pu "";
  138.                 $pup "";
  139.             }
  140.             return ["packUnit" => $pu"packUnitPlural" => $pup];
  141.         }
  142.         else{
  143.             return ["packUnit" => """packUnitPlural" => ""];
  144.         }
  145.     }
  146.     public function onCheckoutPageLoaded(PageLoadedEvent $event)
  147.     {
  148.         //evaluate products
  149.         $salesChannelContext $event->getSalesChannelContext();
  150.         $currentCart $this->cartService->getCart($salesChannelContext->getToken(), $salesChannelContext);
  151.         $lineItems $currentCart->getLineItems();
  152.         $priceOnRequestCartRuleset $this->priceOnRequestService->getCartRuleSet($salesChannelContext);
  153.         $cartHasNoPrice false;
  154.         $cartNotPurchasable $priceOnRequestCartRuleset->cart_is_not_purchaseable;
  155.         foreach ($lineItems as $item) {
  156.             $productPorRuleset $this->priceOnRequestService->getProductRuleSet($salesChannelContext$item);
  157.             $cartHasNoPrice $cartHasNoPrice || $productPorRuleset->por_dont_show_price;
  158.             $cartNotPurchasable $cartNotPurchasable || $productPorRuleset->por_product_not_purchasable || $productPorRuleset->por_dont_show_price;
  159.             $item->addExtension('nimbits_por_product_ruleset'$productPorRuleset);
  160.             //add unit set
  161.             $item->addExtension('nimbits_por_product_units', (new StructCollection())->assign($this->getUnitsForProductByLineitem($item$salesChannelContext)));
  162.         }
  163.         $priceOnRequestCartRuleset->assign(["cart_has_no_price" => $cartHasNoPrice]);
  164.         //cart is also not purchasable if no price can be determined
  165.         $priceOnRequestCartRuleset->assign(["cart_is_not_purchaseable" => $cartNotPurchasable]);
  166.         $event->getPage()->addExtension('nimbits_por_cart_ruleset'$priceOnRequestCartRuleset);
  167.         //handling for add by productnumber error
  168.         $dontAddByProductNumber = ($event->getRequest()->get('nb_por_nbpn'0) == 1);
  169.         $showerror = ["showerror" => $dontAddByProductNumber];
  170.         $errorStruct = (new StructCollection())->assign($showerror);
  171.         $event->getPage()->addExtension('nimbits_por_cart_producnumber_add_error'$errorStruct);
  172.     }
  173.     public function onFooterLoaded(FooterPageletLoadedEvent $event)
  174.     {
  175.         $event->getPagelet()->addExtension('nimbitsPriceOnRequestSettings',
  176.             $this->settingsService->getSettingsAsStruct($event->getSalesChannelContext()->getSalesChannel()->getId())
  177.         );
  178.     }
  179. }