vendor/shopware/storefront/Pagelet/Header/HeaderPageletLoader.php line 68

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Pagelet\Header;
  3. use Shopware\Core\Content\Category\CategoryCollection;
  4. use Shopware\Core\Content\Category\Service\NavigationLoaderInterface;
  5. use Shopware\Core\Content\Category\Tree\TreeItem;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  9. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  10. use Shopware\Core\System\Annotation\Concept\ExtensionPattern\Decoratable;
  11. use Shopware\Core\System\Currency\SalesChannel\AbstractCurrencyRoute;
  12. use Shopware\Core\System\Language\LanguageCollection;
  13. use Shopware\Core\System\Language\SalesChannel\AbstractLanguageRoute;
  14. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  15. use Shopware\Storefront\Event\RouteRequest\CurrencyRouteRequestEvent;
  16. use Shopware\Storefront\Event\RouteRequest\LanguageRouteRequestEvent;
  17. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  18. use Symfony\Component\HttpFoundation\Request;
  19. /**
  20.  * @Decoratable()
  21.  */
  22. class HeaderPageletLoader implements HeaderPageletLoaderInterface
  23. {
  24.     private EventDispatcherInterface $eventDispatcher;
  25.     private AbstractCurrencyRoute $currencyRoute;
  26.     private AbstractLanguageRoute $languageRoute;
  27.     private NavigationLoaderInterface $navigationLoader;
  28.     public function __construct(
  29.         EventDispatcherInterface $eventDispatcher,
  30.         AbstractCurrencyRoute $currencyRoute,
  31.         AbstractLanguageRoute $languageRoute,
  32.         NavigationLoaderInterface $navigationLoader
  33.     ) {
  34.         $this->eventDispatcher $eventDispatcher;
  35.         $this->currencyRoute $currencyRoute;
  36.         $this->languageRoute $languageRoute;
  37.         $this->navigationLoader $navigationLoader;
  38.     }
  39.     /**
  40.      * @throws MissingRequestParameterException
  41.      */
  42.     public function load(Request $requestSalesChannelContext $context): HeaderPagelet
  43.     {
  44.         $salesChannel $context->getSalesChannel();
  45.         $navigationId $request->get('navigationId'$salesChannel->getNavigationCategoryId());
  46.         if (!$navigationId) {
  47.             throw new MissingRequestParameterException('navigationId');
  48.         }
  49.         $languages $this->getLanguages($context$request);
  50.         $event = new CurrencyRouteRequestEvent($request, new Request(), $context);
  51.         $this->eventDispatcher->dispatch($event);
  52.         $navigation $this->navigationLoader->load(
  53.             (string) $navigationId,
  54.             $context,
  55.             $salesChannel->getNavigationCategoryId(),
  56.             $salesChannel->getNavigationCategoryDepth()
  57.         );
  58.         $criteria = new Criteria();
  59.         $criteria->setTitle('header::currencies');
  60.         $currencies $this->currencyRoute
  61.             ->load($event->getStoreApiRequest(), $context$criteria)
  62.             ->getCurrencies();
  63.         $page = new HeaderPagelet(
  64.             $navigation,
  65.             $languages,
  66.             $currencies,
  67.             $languages->get($context->getContext()->getLanguageId()),
  68.             $context->getCurrency(),
  69.             $this->getServiceMenu($context)
  70.         );
  71.         $this->eventDispatcher->dispatch(new HeaderPageletLoadedEvent($page$context$request));
  72.         return $page;
  73.     }
  74.     private function getServiceMenu(SalesChannelContext $context): CategoryCollection
  75.     {
  76.         $serviceId $context->getSalesChannel()->getServiceCategoryId();
  77.         if ($serviceId === null) {
  78.             return new CategoryCollection();
  79.         }
  80.         $navigation $this->navigationLoader->load($serviceId$context$serviceId1);
  81.         return new CategoryCollection(array_map(static function (TreeItem $treeItem) {
  82.             return $treeItem->getCategory();
  83.         }, $navigation->getTree()));
  84.     }
  85.     private function getLanguages(SalesChannelContext $contextRequest $request): LanguageCollection
  86.     {
  87.         $criteria = new Criteria();
  88.         $criteria->setTitle('header::languages');
  89.         $criteria->addFilter(
  90.             new EqualsFilter('language.salesChannelDomains.salesChannelId'$context->getSalesChannel()->getId())
  91.         );
  92.         $criteria->addSorting(new FieldSorting('name'FieldSorting::ASCENDING));
  93.         $criteria->addAssociation('productSearchConfig');
  94.         $apiRequest = new Request();
  95.         $event = new LanguageRouteRequestEvent($request$apiRequest$context$criteria);
  96.         $this->eventDispatcher->dispatch($event);
  97.         return $this->languageRoute->load($event->getStoreApiRequest(), $context$criteria)->getLanguages();
  98.     }
  99. }