custom/plugins/CioBudget/src/Subscriber/HeaderSelectionSubscriber.php line 58

Open in your IDE?
  1. <?php
  2. namespace CioBudget\Subscriber;
  3. use CioBudget\Definition\Budget\BudgetEntity;
  4. use CioBudget\Service\BudgetInfoService;
  5. use CioBudget\Service\SessionService;
  6. use PhpParser\Node\Expr\Array_;
  7. use Shopware\Core\Checkout\Customer\CustomerEntity;
  8. use CioBudget\Service\BudgetLoaderService;
  9. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  12. use Shopware\Core\Framework\Validation\DataBag\DataBag;
  13. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  14. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
  15. use Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute;
  16. use Shopware\Storefront\Event\StorefrontRenderEvent;
  17. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPage;
  18. use Symfony\Component\DependencyInjection\Container;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. use Symfony\Component\HttpFoundation\Session\Session;
  21. class HeaderSelectionSubscriber implements EventSubscriberInterface
  22. {
  23.     private Container $container;
  24.     private BudgetLoaderService $budgetLoaderService;
  25.     private SessionService $sessionService;
  26.     private BudgetInfoService $budgetInfoService;
  27.     public function __construct(Container $container)
  28.     {
  29.         $this->container $container;
  30.     }
  31.     public function setSessionService(SessionService $sessionService)
  32.     {
  33.         $this->sessionService $sessionService;
  34.     }
  35.     public function setBudgetLoaderService(BudgetLoaderService $budgetLoaderService)
  36.     {
  37.         $this->budgetLoaderService $budgetLoaderService;
  38.     }
  39.     public function setBudgetInfoService(BudgetInfoService $budgetInfoService)
  40.     {
  41.         $this->budgetInfoService $budgetInfoService;
  42.     }
  43.     public static function getSubscribedEvents(): array
  44.     {
  45.         return [
  46.             StorefrontRenderEvent::class => 'onStorefrontRender'
  47.         ];
  48.     }
  49.     public function onStorefrontRender(StorefrontRenderEvent $event)
  50.     {
  51.         $customer $event->getSalesChannelContext()->getCustomer();
  52.         if (!$customer instanceof CustomerEntity) {
  53.             $event->setParameter('cio_budgets_show'false);
  54.             return;
  55.         }
  56.         if (!$customer || !is_array($customer->getCustomFields())) {
  57.             return;
  58.         }
  59.         /** @var EntitySearchResult $budgets */
  60.         $budgets $this->budgetLoaderService->getActiveBudgetsByCustomer($customer$event->getSalesChannelContext()->getContext());
  61.         if (!$budgets) {
  62.             return;
  63.         }
  64.         $currentSelectedBudgetId $this->sessionService->getBudgetIdFromSession();
  65.         if (!$currentSelectedBudgetId) {
  66.             return;
  67.         }
  68.         $currentBudget $this->budgetLoaderService->getBudgetById($currentSelectedBudgetId);
  69.         $currentBudget = [
  70.             'budget' => $currentBudget,
  71.             'currentState' => $currentBudget $this->budgetInfoService->getAvailableBudget($currentBudget->getId(), $event->getSalesChannelContext()) : 0,
  72.             'externalId' => $currentBudget str_pad($currentBudget->get('store')->getExtId(), 40STR_PAD_LEFT) : ''
  73.         ];
  74.         $event->setParameter('cio_budgets_show'true);
  75.         $event->setParameter('cio_currently_selected_budget'$currentBudget);
  76.         if ($budgets) {
  77.             $budgets $budgets->map(function ($budget) use ($event) {
  78.                 return [
  79.                     'budget' => $budget,
  80.                     'currentState' => $budget instanceof BudgetEntity $this->budgetInfoService->getAvailableBudget($budget->getId(), $event->getSalesChannelContext()) : 0,
  81.                     'externalId' => $budget instanceof BudgetEntity str_pad($budget->get('store')->getExtId(), 40STR_PAD_LEFT) : ''
  82.                 ];
  83.             });
  84.             uasort($budgets, function ($a$b) {
  85.                 if ($a['budget']->getName() == $b['budget']->getName()) return 0;
  86.                 return ($a['budget']->getName() < $b['budget']->getName()) ? -1;
  87.             });
  88.             $event->setParameter('cio_avaivable_budgets'$budgets);
  89.         }
  90.         $event->setParameter('cio_avaivable_budgets_redirect'$event->getRequest()->attributes->get('_route'));
  91.         $event->setParameter('cio_avaivable_budgets_redirect_querystring'$event->getRequest()->getQueryString());
  92.         $event->setParameter('cio_avaivable_budgets_redirect_params'$event->getRequest()->attributes->get('_route_params'));
  93.     }
  94. }