<?php
namespace LoyxxRichBreadcrumb\Subscriber;
use LoyxxRichBreadcrumb\Struct\Breadcrumb;
use Shopware\Core\Content\Category\Service\CategoryBreadcrumbBuilder;
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;
/**
* @var CategoryBreadcrumbBuilder
*/
private $breadcrumbBuilder;
/**
* PageLoadedEventSubscriber constructor.
* @param SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler
* @param SystemConfigService $systemConfigService
*/
public function __construct(
SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler,
SystemConfigService $systemConfigService,
CategoryBreadcrumbBuilder $breadcrumbBuilder
)
{
$this->seoUrlPlaceholderHandler = $seoUrlPlaceholderHandler;
$this->systemConfigService = $systemConfigService;
$this->breadcrumbBuilder = $breadcrumbBuilder;
}
/**
* @return array|string[]
*/
public static function getSubscribedEvents(): array
{
return [
HeaderPageletLoadedEvent::class => 'onPageLoaded'
];
}
/**
* @param HeaderPageletLoadedEvent $event
*/
public function onPageLoaded(HeaderPageletLoadedEvent $event)
{
if ($event->getRequest()->attributes->get('_route') === 'frontend.landing.page') {
return;
}
if ($this->systemConfigService->get(PageLoadedEventSubscriber::BUNDLE_NAME . '.config.modifyProductDetailBreadcrumb')) {
$this->storeNavigationInformation($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,
$this->hasBreadcrumbListElements($breadcrumb)
);
$event->getPagelet()->addExtension('breadcrumb', $breadcrumbStruct);
}
/**
* @param HeaderPageletLoadedEvent $event
* @return array|null
*/
private function getBreadcrumbs(HeaderPageletLoadedEvent $event): ?array
{
return $this->breadcrumbBuilder->build(
$event->getPagelet()
->getNavigation()
->getActive(),
$event->getSalesChannelContext()->getSalesChannel()
);
}
private function hasBreadcrumbListElements(?array $breadcrumb): bool
{
if ($breadcrumb) {
if (isset($breadcrumb['itemListElement']) && $breadcrumb['itemListElement']) {
return true;
}
}
return false;
}
private function storeNavigationInformation(HeaderPageletLoadedEvent $event)
{
$route = $event->getRequest()->get('_route');
if ($route === 'frontend.navigation.page') {
$event->getRequest()->getSession()->set(ProductPageLoadedEvent::SESSION_SEO_CATEGORY_ID, $event->getRequest()->get('navigationId'));
}
}
}