custom/plugins/EsmComputer/src/Storefront/Subscriber/SearchSubscriber.php line 39

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace EsmComputer\Storefront\Subscriber;
  3. use Shopware\Core\Content\Category\CategoryEntity;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  8. use Shopware\Storefront\Page\Search\SearchPageLoadedEvent;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use function array_filter;
  11. use function array_map;
  12. use function explode;
  13. use function header;
  14. use function in_array;
  15. use function strtolower;
  16. use function trim;
  17. class SearchSubscriber implements EventSubscriberInterface
  18. {
  19.     protected EntityRepository $categoryRepository;
  20.     public function __construct(EntityRepository $categoryRepository)
  21.     {
  22.         $this->categoryRepository $categoryRepository;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             SearchPageLoadedEvent::class => 'onSearchPageLoaded'
  28.         ];
  29.     }
  30.     /**
  31.      * Redirect to defined category if search term matches content of field custom_category_search_terms
  32.      */
  33.     public function onSearchPageLoaded(SearchPageLoadedEvent $event): void
  34.     {
  35.         $searchTerm trim($event->getPage()->getSearchTerm());
  36.         $criteria = new Criteria();
  37.         $criteria->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  38.             new ContainsFilter('customFields.custom_category_search_terms'$searchTerm),
  39.             new ContainsFilter('customFields.custom_category_search_terms'strtolower($searchTerm)),
  40.         ]));
  41.         $categories $this->categoryRepository->search($criteria$event->getContext());
  42.         if($categories->count() > 0) {
  43.             /** @var CategoryEntity $category */
  44.             foreach($categories as $category) {
  45.                 $searchTerms array_filter(array_map('trim'explode(','$category->getCustomFields()['custom_category_search_terms'])));
  46.                 if(in_array($searchTerm$searchTermstrue)) {
  47.                     $category $categories->first()->getId();
  48.                     $baseUrl $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl();
  49.                     header("Location: $baseUrl/navigation/$category"true302);
  50.                     exit;
  51.                 }
  52.             }
  53.         }
  54.     }
  55. }