<?php declare(strict_types=1);
namespace EsmComputer\Storefront\Subscriber;
use Shopware\Core\Content\Category\CategoryEntity;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
use Shopware\Storefront\Page\Search\SearchPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use function array_filter;
use function array_map;
use function explode;
use function header;
use function in_array;
use function strtolower;
use function trim;
class SearchSubscriber implements EventSubscriberInterface
{
protected EntityRepository $categoryRepository;
public function __construct(EntityRepository $categoryRepository)
{
$this->categoryRepository = $categoryRepository;
}
public static function getSubscribedEvents(): array
{
return [
SearchPageLoadedEvent::class => 'onSearchPageLoaded'
];
}
/**
* Redirect to defined category if search term matches content of field custom_category_search_terms
*/
public function onSearchPageLoaded(SearchPageLoadedEvent $event): void
{
$searchTerm = trim($event->getPage()->getSearchTerm());
$criteria = new Criteria();
$criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
new ContainsFilter('customFields.custom_category_search_terms', $searchTerm),
new ContainsFilter('customFields.custom_category_search_terms', strtolower($searchTerm)),
]));
$categories = $this->categoryRepository->search($criteria, $event->getContext());
if($categories->count() > 0) {
/** @var CategoryEntity $category */
foreach($categories as $category) {
$searchTerms = array_filter(array_map('trim', explode(',', $category->getCustomFields()['custom_category_search_terms'])));
if(in_array($searchTerm, $searchTerms, true)) {
$category = $categories->first()->getId();
$baseUrl = $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl();
header("Location: $baseUrl/navigation/$category", true, 302);
exit;
}
}
}
}
}