<?php
declare(strict_types = 1);
namespace S360\MegaMenu\Storefront\Subscriber;
use S360\MegaMenu\Core\Content\Menu\MenuCollection;
use S360\MegaMenu\Service\MenuLoader;
use S360\MegaMenu\Storefront\Pagelet\OffcanvasNavigationPagelet;
use Shopware\Storefront\Pagelet\Menu\Offcanvas\MenuOffcanvasPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Add mobile (sub)menu to offcanvas menu.
* @package S360\MegaMenu\Storefront\Subscriber
*/
class MenuOffcanvasSubscriber extends AbstractMenuSubscriber implements EventSubscriberInterface
{
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
MenuOffcanvasPageletLoadedEvent::class => 'onPageletLoaded'
];
}
/**
* Add mobile (sub)menu to offcanvas pagelet.
*
* @param MenuOffcanvasPageletLoadedEvent $event
* @return void
*/
public function onPageletLoaded(MenuOffcanvasPageletLoadedEvent $event): void
{
$salesChannel = $event->getSalesChannelContext()->getSalesChannel();
$navigationId = $event->getRequest()->get(MenuLoader::ROOT_ID_QUERY_PARAM);
$activeProp = MenuLoader::ACTIVE_PROPERTY_ITEM_ID;
if (empty($navigationId)) {
$navigationId = $event->getRequest()->get('navigationId', $salesChannel->getNavigationCategoryId());
$activeProp = MenuLoader::ACTIVE_PROPERTY_CATEGORY_ID;
}
$menu = $this->menuLoader->load($event->getContext(), $event->getRequest(), $navigationId, $activeProp);
$mobile = $menu->getByType(MenuCollection::MOBILE_MENU_TYPE);
$activeCat = null;
// Load Active Pseudo Category
if ($mobile) {
$tree = $mobile->getTree();
$activeCat = $this->menuLoader->loadActiveCategory($tree, $navigationId);
// Sort Children
$this->menuLoader->sortCategories($activeCat);
if ($tree->getActive() && $tree->getActive()->getCategoryLink()) {
$this->menuLoader->sortCategories($tree->getActive()->getCategoryLink());
}
}
// Pagelet
$pagelet = new OffcanvasNavigationPagelet($menu->getByType('desktop'), $menu->getByType('mobile'), $activeCat);
$pagelet->setSalesChannelContext($event->getSalesChannelContext());
$event->getPagelet()->addExtension(
's360_megamenu',
$pagelet
);
}
}