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

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 CioMasterdata\Definition\Masterdata\MasterdataEntity;
  7. use CioMasterdata\Service\MasterdataService;
  8. use PhpParser\Node\Expr\Array_;
  9. use Shopware\Core\Checkout\Customer\CustomerEntity;
  10. use CioBudget\Service\BudgetLoaderService;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  13. use Shopware\Storefront\Event\StorefrontRenderEvent;
  14. use Symfony\Component\DependencyInjection\Container;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\Session\Session;
  17. class HeaderSelectionSubscriber implements EventSubscriberInterface
  18. {
  19.     private Container $container;
  20.     private BudgetLoaderService $budgetLoaderService;
  21.     private SessionService $sessionService;
  22.     private BudgetInfoService $budgetInfoService;
  23.     private MasterdataService $masterdataService;
  24.     public function __construct(Container $container)
  25.     {
  26.         $this->container $container;
  27.     }
  28.     public function setSessionService(SessionService $sessionService)
  29.     {
  30.         $this->sessionService $sessionService;
  31.     }
  32.     public function setBudgetLoaderService(BudgetLoaderService $budgetLoaderService)
  33.     {
  34.         $this->budgetLoaderService $budgetLoaderService;
  35.     }
  36.     public function setBudgetInfoService(BudgetInfoService $budgetInfoService)
  37.     {
  38.         $this->budgetInfoService $budgetInfoService;
  39.     }
  40.     public function setMasterdataService(MasterdataService $masterdataService)
  41.     {
  42.         $this->masterdataService $masterdataService;
  43.     }
  44.     public static function getSubscribedEvents(): array
  45.     {
  46.         return [
  47.             StorefrontRenderEvent::class => 'onStorefrontRender'
  48.         ];
  49.     }
  50.     public function onStorefrontRender(StorefrontRenderEvent $event)
  51.     {
  52.         $customer $event->getSalesChannelContext()->getCustomer();
  53.         if (!$customer instanceof CustomerEntity) {
  54.             $event->setParameter('cio_budgets_show'false);
  55.             return;
  56.         }
  57.         if (!$customer || !is_array($customer->getCustomFields())) {
  58.             return;
  59.         }
  60.         /** @var EntitySearchResult $budgets */
  61.         $budgets $this->budgetLoaderService->getActiveBudgetsByCustomer($customer$event->getSalesChannelContext()->getContext());
  62.         if (!$budgets) {
  63.             return;
  64.         }
  65.         $currentSelectedBudgetId $this->sessionService->getBudgetIdFromSession();
  66.         if (!$currentSelectedBudgetId) {
  67.             return;
  68.         }
  69.         $currentBudget $this->budgetLoaderService->getBudgetById($currentSelectedBudgetId);
  70.         $storeArray = [];
  71.         if (is_array($customer->getCustomFields()) && array_key_exists('masterdata'$customer->getCustomFields())) {
  72.             $budgetMasterdatas $customer->getCustomFields()['masterdata'];
  73.             foreach ($budgetMasterdatas as $budgetMasterdata) {
  74.                 $masterData $this->masterdataService->getMasterdataById($budgetMasterdata['id'], true);
  75.                 if ($masterData instanceof MasterdataEntity) {
  76.                     $masterDataName $masterData->getName();
  77.                     foreach ($masterData->getStores() as $store) {
  78.                         if (!isset($storeArray[$store->getStoreId()])) {
  79.                             $storeArray[$store->getStoreId()] = $masterDataName;
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.         $currentBudget = [
  86.             'budget' => $currentBudget,
  87.             'currentState' => $currentBudget $this->budgetInfoService->getAvailableBudget($currentBudget->getId(), $event->getSalesChannelContext()->getContext(), $event->getSalesChannelContext()->getCustomer()) : 0,
  88.             'externalId' => $currentBudget str_pad($currentBudget->get('store')->getExtId(), 40STR_PAD_LEFT) : '',
  89.             'storeName' => isset($storeArray[$currentBudget->getStoreId()]) ? $storeArray[$currentBudget->getStoreId()] : ''
  90.         ];
  91.         $event->setParameter('cio_budgets_show'true);
  92.         $event->setParameter('cio_currently_selected_budget'$currentBudget);
  93.         if ($budgets) {
  94.             $budgets $budgets->map(function ($budget) use ($event$storeArray) {
  95.                 return [
  96.                     'budget' => $budget,
  97.                     'currentState' => $budget instanceof BudgetEntity $this->budgetInfoService->getAvailableBudget($budget->getId(), $event->getSalesChannelContext()->getContext(), $event->getSalesChannelContext()->getCustomer()) : 0,
  98.                     'externalId' => $budget instanceof BudgetEntity str_pad($budget->get('store')->getExtId(), 40STR_PAD_LEFT) : '',
  99.                     'storeName' => isset($storeArray[$budget->getStoreId()]) ? $storeArray[$budget->getStoreId()] : ''
  100.                 ];
  101.             });
  102.             uasort($budgets, function ($a$b) {
  103.                 if ($a['budget']->getName() == $b['budget']->getName()) return 0;
  104.                 return ($a['budget']->getName() < $b['budget']->getName()) ? -1;
  105.             });
  106.             $event->setParameter('cio_avaivable_budgets'$budgets);
  107.         }
  108.         $event->setParameter('cio_avaivable_budgets_redirect'$event->getRequest()->attributes->get('_route'));
  109.         $event->setParameter('cio_avaivable_budgets_redirect_params'$event->getRequest()->attributes->get('_route_params'));
  110.     }
  111. }