<?php
namespace LoyxxSW6CategoryTreeTeaser\Subscriber;
use LoyxxSW6CategoryTreeTeaser\LoyxxSW6CategoryTreeTeaser;
use LoyxxSW6CategoryTreeTeaser\Struct\NavigationTree;
use Shopware\Core\Content\Category\CategoryEntity;
use Shopware\Core\Content\ImportExport\Event\Subscriber\CategoryCriteriaSubscriber;
use Shopware\Core\Content\Media\DataAbstractionLayer\MediaRepositoryDecorator;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Framework\Uuid\Uuid;
class PageLoadedEventSubscriber implements EventSubscriberInterface
{
private const BUNDLE_NAME = 'LoyxxSW6CategoryTreeTeaser';
/**
* @var SystemConfigService
*/
private $systemConfigService;
/**
* @var MediaRepositoryDecorator
*/
private $mediaRepositoryDecorator;
/**
* @var EntityRepositoryInterface
*/
private $categoryRepository;
public function __construct(
SystemConfigService $systemConfigService,
MediaRepositoryDecorator $mediaRepositoryDecorator,
EntityRepositoryInterface $categoryRepository
)
{
$this->systemConfigService = $systemConfigService;
$this->mediaRepositoryDecorator = $mediaRepositoryDecorator;
$this->mediaRepositoryDecorator = $mediaRepositoryDecorator;
$this->categoryRepository = $categoryRepository;
}
public static function getSubscribedEvents(): array
{
return [
HeaderPageletLoadedEvent::class => 'onPageLoadedEvent'
];
}
public function onPageLoadedEvent(HeaderPageletLoadedEvent $event)
{
/** get current active product */
$currentActivePage = $event->getPagelet()->getNavigation()->getActive();
$navigationTree = $event->getPagelet()->getNavigation()->getChildren($currentActivePage->getId());
//get children of the selected category
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $currentActivePage->getId()));
$criteria->addAssociation('children');
//Albert: uit wegens probleem met volgorde subcats in frontend - zie mijn doc
//$criteria->getAssociation('children')->addFilter(new EqualsFilter('active', 1));
$criteria->getAssociation('children')->addSorting(new FieldSorting('level'));
$criteria->getAssociation('children')->addAssociation('media');
/** @var CategoryEntity $category */
$category = $this->categoryRepository->search($criteria, $event->getContext())->first();
if ($category && !is_null($category->getChildren())){
$category->getChildren()->sortByPosition();
}
$pluginMediaPlaceholder = $this->systemConfigService->get(self::BUNDLE_NAME . '.config.pluginMediaPlaceholder');
$defaultMedia = NULL;
if ($pluginMediaPlaceholder) {
$criteria = new Criteria([
$pluginMediaPlaceholder
]);
$mediaEntity = $this->mediaRepositoryDecorator->search(
$criteria,
$event->getContext()
)->first();
$defaultMedia = $mediaEntity;
}
$event->getPagelet()->addExtension('navigationTree', new NavigationTree($category ? $category->getChildren() : [], $defaultMedia));
}
}