<?php
namespace LoyxxRichBreadcrumb\Subscriber;
use LoyxxRichBreadcrumb\Struct\Breadcrumb;
use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Framework\Routing\RequestTransformer;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use LoyxxRichBreadcrumb\Traits\Microdata;
/**
* Class PageLoadedEventSubscriber
* @package LoyxxRichBreadcrumb\Subscriber
*/
class PageLoadedEventSubscriber implements EventSubscriberInterface
{
use Microdata;
/**
* Bundle Name
*/
public const BUNDLE_NAME = 'LoyxxRichBreadcrumb';
/**
* @var SeoUrlPlaceholderHandlerInterface
*/
private $seoUrlPlaceholderHandler;
/**
* @var SystemConfigService
*/
private $systemConfigService;
/**
* PageLoadedEventSubscriber constructor.
* @param SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler
* @param SystemConfigService $systemConfigService
*/
public function __construct(SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler, SystemConfigService $systemConfigService)
{
$this->seoUrlPlaceholderHandler = $seoUrlPlaceholderHandler;
$this->systemConfigService = $systemConfigService;
}
/**
* @return array|string[]
*/
public static function getSubscribedEvents()
{
return [
HeaderPageletLoadedEvent::class => 'onPageLoaded'
];
}
/**
* @param HeaderPageletLoadedEvent $event
*/
public function onPageLoaded(HeaderPageletLoadedEvent $event)
{
// create microdata for breadcrumb
$host = $event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL) .
$event->getRequest()->attributes->get(RequestTransformer::SALES_CHANNEL_BASE_URL);
$uri = $event->getRequest()->getRequestUri();
$breadcrumb = NULL;
/**
* Since we are handling product page loaded breadcrumb this will show duplicate data
* so we need to skip breadcrumb generation for product page
*/
if ($event->getRequest()->attributes->get('_route') !== 'frontend.detail.page'){
$breadcrumb = $this->createMicrodata(
$event,
$this->getBreadcrumbs($event),
$host,
$event->getSalesChannelContext(),
$uri
);
}
/**
* Hide breadcrumb on home page
$breadcrumbIsVisible = $this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME.'.config.isInvisible');
if ($this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.isHiddenOnHomePage') && $event->getRequest()->attributes->get('_route') === 'frontend.home.page'){
$breadcrumbIsVisible = false;
}
*/
$breadcrumbStruct = new Breadcrumb(
$breadcrumb,
$this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME.'.config.isInvisible'),
$this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.showProductTitle'),
$this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.separator'),
$this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.isVisibleHomeLink'),
$this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.isHiddenOnHomePage'),
$this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.homeLabel'),
$host,
$uri
);
$event->getPagelet()->addExtension('breadcrumb', $breadcrumbStruct);
}
/**
* @param HeaderPageletLoadedEvent $event
* @return array|null
*/
private function getBreadcrumbs(HeaderPageletLoadedEvent $event)
{
return $event->getPagelet()
->getNavigation()
->getActive()
->buildSeoBreadcrumb(
$event->getSalesChannelContext()->getSalesChannel()->getNavigationCategoryId()
);
}
}