<?php
namespace S360Experts\Storefront\Page\Navigation\Subscriber;
use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;
use S360Experts\Core\Content\Expert\ExpertCollection;
class NavigationPageSubscriber implements EventSubscriberInterface
{
/**
* @var SystemConfigService
*/
private $systemConfigService;
/**
* @var EntityRepository
*/
private $expertRepository;
public function __construct(
SystemConfigService $systemConfigService,
EntityRepository $expertRepository,
EntityRepository $categoryRepository
) {
$this->expertRepository = $expertRepository;
$this->systemConfigService = $systemConfigService;
$this->categoryRepository = $categoryRepository;
}
public static function getSubscribedEvents(): array
{
return [
NavigationPageLoadedEvent::class => 'onNavigationPageLoaded'
];
}
/**
* @param NavigationPageLoadedEvent $event
* @return void
*/
public function onNavigationPageLoaded(NavigationPageLoadedEvent $event): void
{
// /navigation/$currentCategoryId
$path = $event->getRequest()->getPathInfo();
// basic collection
$s360Experts = new ExpertCollection;
// make sure we're in a navigation
if (false === strpos($path, 'navigation')) {
return;
}
// Get last subCategory id, in case very deep navigations might have
// the entire path as, i.e. /navigation/$id/$id/$id
$explodedPath = explode('/', $path);
$currentCategoryId = $explodedPath[count($explodedPath) - 1];
$criteria = new Criteria();
$criteria->addAssociation('categories');
$allExperts = $this->expertRepository->search($criteria, $event->getContext());
foreach($allExperts as $expert) {
if($expert->getCategories()->has($currentCategoryId)) {
$s360Experts->add($expert);
}
}
if($this->systemConfigService->get('S360Experts.config.inheritFromParent') && empty($s360Experts->getElements())) { // not sure if i should just use ->getTotal() here
// find parent categories here and iterate through them in reverse hierarchy until we find at least 1 expert
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('id', $currentCategoryId));
$currentCategory = $this->categoryRepository->search($criteria, $event->getContext())->first();
$categoryTree = array_reverse(explode('|', $currentCategory->getPath()));
$categoryTree = array_filter($categoryTree, fn($value) => !is_null($value) && $value !== ''); // remove empty elements
array_pop($categoryTree); // without root category
foreach($allExperts as $expert) {
if(empty($s360Experts->getElements())) {
foreach($categoryTree as $categoryId) {
if($expert->getCategories()->has($categoryId)) {
$s360Experts->add($expert);
}
}
}
}
}
// this is the base entities we assign to my page
if(!empty($s360Experts->getElements())) {
$event->getPage()->addExtension('s360_experts', $s360Experts);
}
// this is their images
$s360ExpertImages = [];
foreach($s360Experts as $s360Expert) {
if(!empty($s360Expert->getImage())) {
$s360ExpertImages[] = $s360Expert->getImage();
}
}
$event->getPage()->addExtension('s360_experts_images', new ArrayStruct($s360ExpertImages));
}
}