custom/plugins/LoyxxRichBreadcrumb/src/Subscriber/PageLoadedEventSubscriber.php line 73

Open in your IDE?
  1. <?php
  2. namespace LoyxxRichBreadcrumb\Subscriber;
  3. use LoyxxRichBreadcrumb\Struct\Breadcrumb;
  4. use Shopware\Core\Content\Category\Service\CategoryBreadcrumbBuilder;
  5. use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
  6. use Shopware\Core\System\SystemConfig\SystemConfigService;
  7. use Shopware\Storefront\Framework\Routing\RequestTransformer;
  8. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use LoyxxRichBreadcrumb\Traits\Microdata;
  11. /**
  12.  * Class PageLoadedEventSubscriber
  13.  * @package LoyxxRichBreadcrumb\Subscriber
  14.  */
  15. class PageLoadedEventSubscriber implements EventSubscriberInterface
  16. {
  17.     use Microdata;
  18.     /**
  19.      * Bundle Name
  20.      */
  21.     public const BUNDLE_NAME 'LoyxxRichBreadcrumb';
  22.     /**
  23.      * @var SeoUrlPlaceholderHandlerInterface
  24.      */
  25.     private $seoUrlPlaceholderHandler;
  26.     /**
  27.      * @var SystemConfigService
  28.      */
  29.     private $systemConfigService;
  30.     /**
  31.      * @var CategoryBreadcrumbBuilder
  32.      */
  33.     private $breadcrumbBuilder;
  34.     /**
  35.      * PageLoadedEventSubscriber constructor.
  36.      * @param SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler
  37.      * @param SystemConfigService $systemConfigService
  38.      */
  39.     public function __construct(
  40.         SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler,
  41.         SystemConfigService               $systemConfigService,
  42.         CategoryBreadcrumbBuilder         $breadcrumbBuilder
  43.     )
  44.     {
  45.         $this->seoUrlPlaceholderHandler $seoUrlPlaceholderHandler;
  46.         $this->systemConfigService $systemConfigService;
  47.         $this->breadcrumbBuilder $breadcrumbBuilder;
  48.     }
  49.     /**
  50.      * @return array|string[]
  51.      */
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [
  55.             HeaderPageletLoadedEvent::class => 'onPageLoaded'
  56.         ];
  57.     }
  58.     /**
  59.      * @param HeaderPageletLoadedEvent $event
  60.      */
  61.     public function onPageLoaded(HeaderPageletLoadedEvent $event)
  62.     {
  63.         if ($event->getRequest()->attributes->get('_route') === 'frontend.landing.page') {
  64.             return;
  65.         }
  66.         if ($this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.modifyProductDetailBreadcrumb')) {
  67.             $this->storeNavigationInformation($event);
  68.         }
  69.         // create microdata for breadcrumb
  70.         $host $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL) .
  71.             $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_BASE_URL);
  72.         $uri $event->getRequest()->getRequestUri();
  73.         $breadcrumb NULL;
  74.         /**
  75.          * Since we are handling product page loaded breadcrumb this will show duplicate data
  76.          * so we need to skip breadcrumb generation for product page
  77.          */
  78.         if ($event->getRequest()->attributes->get('_route') !== 'frontend.detail.page') {
  79.             $breadcrumb $this->createMicrodata(
  80.                 $event,
  81.                 $this->getBreadcrumbs($event),
  82.                 $host,
  83.                 $event->getSalesChannelContext(),
  84.                 $uri
  85.             );
  86.         }
  87.         /**
  88.          * Hide breadcrumb on home page
  89.          * $breadcrumbIsVisible = $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME.'.config.isInvisible');
  90.          * if ($this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.isHiddenOnHomePage') && $event->getRequest()->attributes->get('_route') === 'frontend.home.page'){
  91.          * $breadcrumbIsVisible = false;
  92.          * }
  93.          */
  94.         $breadcrumbStruct = new Breadcrumb(
  95.             $breadcrumb,
  96.             $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.isInvisible'),
  97.             $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.showProductTitle'),
  98.             $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.separator'),
  99.             $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.isVisibleHomeLink'),
  100.             $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.isHiddenOnHomePage'),
  101.             $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME '.config.homeLabel'),
  102.             $host,
  103.             $uri,
  104.             $this->hasBreadcrumbListElements($breadcrumb)
  105.         );
  106.         $event->getPagelet()->addExtension('breadcrumb'$breadcrumbStruct);
  107.     }
  108.     /**
  109.      * @param HeaderPageletLoadedEvent $event
  110.      * @return array|null
  111.      */
  112.     private function getBreadcrumbs(HeaderPageletLoadedEvent $event): ?array
  113.     {
  114.         return $this->breadcrumbBuilder->build(
  115.             $event->getPagelet()
  116.                 ->getNavigation()
  117.                 ->getActive(),
  118.             $event->getSalesChannelContext()->getSalesChannel()
  119.         );
  120.     }
  121.     private function hasBreadcrumbListElements(?array $breadcrumb): bool
  122.     {
  123.         if ($breadcrumb) {
  124.             if (isset($breadcrumb['itemListElement']) && $breadcrumb['itemListElement']) {
  125.                 return true;
  126.             }
  127.         }
  128.         return false;
  129.     }
  130.     private function storeNavigationInformation(HeaderPageletLoadedEvent $event)
  131.     {
  132.         $route $event->getRequest()->get('_route');
  133.         if ($route === 'frontend.navigation.page') {
  134.             $event->getRequest()->getSession()->set(ProductPageLoadedEvent::SESSION_SEO_CATEGORY_ID$event->getRequest()->get('navigationId'));
  135.         }
  136.     }
  137. }