vendor/shopware/storefront/Page/Navigation/NavigationPageLoader.php line 64

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Page\Navigation;
  3. use Shopware\Core\Content\Category\CategoryEntity;
  4. use Shopware\Core\Content\Category\Exception\CategoryNotFoundException;
  5. use Shopware\Core\Content\Category\SalesChannel\AbstractCategoryRoute;
  6. use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
  7. use Shopware\Core\System\Annotation\Concept\ExtensionPattern\Decoratable;
  8. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  9. use Shopware\Storefront\Page\GenericPageLoaderInterface;
  10. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. /**
  13.  * @Decoratable()
  14.  */
  15. class NavigationPageLoader implements NavigationPageLoaderInterface
  16. {
  17.     /**
  18.      * @var GenericPageLoaderInterface
  19.      */
  20.     private $genericLoader;
  21.     /**
  22.      * @var EventDispatcherInterface
  23.      */
  24.     private $eventDispatcher;
  25.     /**
  26.      * @var AbstractCategoryRoute
  27.      */
  28.     private $cmsPageRoute;
  29.     /**
  30.      * @var SeoUrlPlaceholderHandlerInterface
  31.      */
  32.     private $seoUrlReplacer;
  33.     public function __construct(
  34.         GenericPageLoaderInterface $genericLoader,
  35.         EventDispatcherInterface $eventDispatcher,
  36.         AbstractCategoryRoute $cmsPageRoute,
  37.         SeoUrlPlaceholderHandlerInterface $seoUrlReplacer
  38.     ) {
  39.         $this->genericLoader $genericLoader;
  40.         $this->eventDispatcher $eventDispatcher;
  41.         $this->cmsPageRoute $cmsPageRoute;
  42.         $this->seoUrlReplacer $seoUrlReplacer;
  43.     }
  44.     public function load(Request $requestSalesChannelContext $context): NavigationPage
  45.     {
  46.         $page $this->genericLoader->load($request$context);
  47.         $page NavigationPage::createFrom($page);
  48.         $navigationId $request->get('navigationId'$context->getSalesChannel()->getNavigationCategoryId());
  49.         $category $this->cmsPageRoute
  50.             ->load($navigationId$request$context)
  51.             ->getCategory();
  52.         if (!$category->getActive()) {
  53.             throw new CategoryNotFoundException($category->getId());
  54.         }
  55.         if ($category->getCmsPage()) {
  56.             $this->loadMetaData($category$page);
  57.             $page->setCmsPage($category->getCmsPage());
  58.         }
  59.         $this->eventDispatcher->dispatch(
  60.             new NavigationPageLoadedEvent($page$context$request)
  61.         );
  62.         if ($page->getMetaInformation()) {
  63.             $canonical = ($navigationId === $context->getSalesChannel()->getNavigationCategoryId())
  64.                 ? $this->seoUrlReplacer->generate('frontend.home.page')
  65.                 : $this->seoUrlReplacer->generate('frontend.navigation.page', ['navigationId' => $navigationId]);
  66.             $page->getMetaInformation()->assign(['canonical' => $canonical]);
  67.         }
  68.         return $page;
  69.     }
  70.     private function loadMetaData(CategoryEntity $categoryNavigationPage $page): void
  71.     {
  72.         $metaInformation $page->getMetaInformation();
  73.         if ($metaInformation === null) {
  74.             return;
  75.         }
  76.         $metaDescription $category->getTranslation('metaDescription')
  77.             ?? $category->getTranslation('description');
  78.         $metaInformation->setMetaDescription((string) $metaDescription);
  79.         $metaTitle $category->getTranslation('metaTitle')
  80.             ?? $category->getTranslation('name');
  81.         $metaInformation->setMetaTitle((string) $metaTitle);
  82.         $metaInformation->setMetaKeywords((string) $category->getTranslation('keywords'));
  83.     }
  84. }