<?php
declare(strict_types = 1);
namespace DonCarneTheme\Subscriber;
use Shopware\Storefront\Pagelet\Menu\Offcanvas\MenuOffcanvasPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\Struct\ArrayStruct;
class MenuOffcanvasSubscriber implements EventSubscriberInterface
{
private EntityRepository $categoryRepository;
public function __construct(
EntityRepository $categoryRepository
)
{
$this->categoryRepository = $categoryRepository;
}
public static function getSubscribedEvents()
{
return [
MenuOffcanvasPageletLoadedEvent::class => 'onPageletLoaded'
];
}
public function onPageletLoaded(MenuOffcanvasPageletLoadedEvent $event): void
{
$activeCategory = $event->getPagelet()->getNavigation()->getActive();
if(!$activeCategory){
return;
}
$extraCategories = false;
$customFields = $activeCategory->getCustomFields();
if($customFields && isset($customFields['doncarne_category_special_menu_display'])){
$categoryIds = isset($customFields['doncarne_category_custom_fields_special_menu_extra_categories']) ? $customFields['doncarne_category_custom_fields_special_menu_extra_categories'] : [];
if(!empty($categoryIds)){
$extraCategories = $this->getCategories($categoryIds, $event->getContext());
}
}
if($extraCategories){
$event->getPagelet()->addExtension(
'menuExtraCategories',
new ArrayStruct($extraCategories)
);
}
}
private function getCategories(array $categoryIds, Context $context): array
{
$criteria = (new Criteria())->addFilter(new EqualsAnyFilter('id', $categoryIds));
return $this->categoryRepository->search($criteria, $context)->getElements();
}
}