custom/plugins/NetzpSearchAdvanced6/src/Subscriber/SearchSubscriber.php line 85

  1. <?php declare(strict_types=1);
  2. namespace NetzpSearchAdvanced6\Subscriber;
  3. use NetzpSearchAdvanced6\Components\SearchInterface;
  4. use NetzpSearchAdvanced6\Core\Content\SearchLog\SearchLogDefinition;
  5. use Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent;
  6. use Shopware\Core\Content\Product\SalesChannel\ProductAvailableFilter;
  7. use Shopware\Core\Framework\Struct\ArrayStruct;
  8. use Shopware\Core\System\SystemConfig\SystemConfigService;
  9. use Shopware\Storefront\Page\PageLoadedEvent;
  10. use Shopware\Storefront\Page\Search\SearchPageLoadedEvent;
  11. use Shopware\Storefront\Page\Suggest\SuggestPageLoadedEvent;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpKernel\Event\RequestEvent;
  14. class SearchSubscriber implements EventSubscriberInterface
  15. {
  16.     public function __construct(private readonly SearchInterface $searchService,
  17.                                 private readonly SystemConfigService $systemConfigService)
  18.     {
  19.     }
  20.     public static function getSubscribedEvents(): array
  21.     {
  22.         return [
  23.             SearchPageLoadedEvent::class        => 'doSearch',
  24.             SuggestPageLoadedEvent::class       => 'doSearchSuggest',
  25.             RequestEvent::class                 => 'onKernelRequest',
  26.             ProductListingCriteriaEvent::class  => 'loadProductListingCriteria',
  27.         ];
  28.     }
  29.     public function onKernelRequest(RequestEvent $event)
  30.     {
  31.         $salesChannelId $event->getRequest()->attributes->get('sw-sales-channel-id') ?? null;
  32.         $pluginConfig $this->systemConfigService->get('NetzpSearchAdvanced6.config'$salesChannelId);
  33.         $useSynonyms = (bool)$pluginConfig['useSynonyms'];
  34.         $request $event->getRequest();
  35.         if(! $useSynonyms || ! $request->query->has('search')) {
  36.             return;
  37.         }
  38.         $query $this->searchService->replaceSynonyms($request->query->get('search'));
  39.         $request->query->set('search'$query);
  40.     }
  41.     public function doSearch(PageLoadedEvent $event)
  42.     {
  43.         $pluginConfig $this->systemConfigService->get(
  44.             'NetzpSearchAdvanced6.config',
  45.             $event->getSalesChannelContext()->getSalesChannelId() ?? null
  46.         );
  47.         $logQueries array_key_exists('logQueries'$pluginConfig) ? $pluginConfig['logQueries'] : 0;
  48.         $query $event->getPage()->getSearchTerm();
  49.         $searchResults $this->searchService->doSearch($query$event->getSalesChannelContext());
  50.         if($logQueries == || $logQueries == 2)
  51.         {
  52.             $this->searchService->logQuery($query$event$searchResultsSearchLogDefinition::ORIGIN_SEARCH);
  53.         }
  54.         $firstTabWithResults '';
  55.         if($event->getPage()->getListing()->getTotal() == 0)
  56.         {
  57.             foreach($searchResults as $searchCategory => $searchCategoryResults)
  58.             {
  59.                 if(($searchCategoryResults['total'] ?? 0) > 0)
  60.                 {
  61.                     $firstTabWithResults $searchCategory;
  62.                     break;
  63.                 }
  64.             }
  65.         }
  66.         if($firstTabWithResults != '')
  67.         {
  68.             $event->getRequest()->attributes->set('tab'$firstTabWithResults);
  69.         }
  70.         $event->getPage()->addExtension('netzpSearch', new ArrayStruct($searchResults));
  71.     }
  72.     public function doSearchSuggest(SuggestPageLoadedEvent $event)
  73.     {
  74.         $pluginConfig $this->systemConfigService->get(
  75.             'NetzpSearchAdvanced6.config',
  76.             $event->getSalesChannelContext()->getSalesChannelId() ?? null
  77.         );
  78.         $logQueries array_key_exists('logQueries'$pluginConfig) ? $pluginConfig['logQueries'] : 0;
  79.         $query $event->getPage()->getSearchTerm();
  80.         $searchResults $this->searchService->doSearch($query$event->getSalesChannelContext(), true);
  81.         if($logQueries == 2) {
  82.             $this->searchService->logQuery($query$event$searchResultsSearchLogDefinition::ORIGIN_AJAX);
  83.         }
  84.         $firstTabWithResults '';
  85.         if($event->getPage()->getSearchResult()->getTotal() == 0)
  86.         {
  87.             foreach($searchResults as $searchCategory => $searchCategoryResults)
  88.             {
  89.                 if(($searchCategoryResults['total'] ?? 0) > 0)
  90.                 {
  91.                     $firstTabWithResults $searchCategory;
  92.                     break;
  93.                 }
  94.             }
  95.         }
  96.         if($firstTabWithResults != '')
  97.         {
  98.             $event->getRequest()->attributes->set('tab'$firstTabWithResults);
  99.         }
  100.         $event->getPage()->addExtension('netzpSearch', new ArrayStruct($searchResults));
  101.     }
  102.     public function loadProductListingCriteria(ProductListingCriteriaEvent $event): void
  103.     {
  104.         $pluginConfig $this->systemConfigService->get(
  105.             'NetzpSearchAdvanced6.config',
  106.             $event->getSalesChannelContext()->getSalesChannelId() ?? null
  107.         );
  108.         $manufacturerCmsPage $pluginConfig['searchManufacturerCmsPage'] ?? '';
  109.         if($manufacturerCmsPage != "" &&
  110.             $event->getRequest()->attributes->get('navigationId''') == $manufacturerCmsPage)
  111.         {
  112.             $event->getCriteria()->resetFilters();
  113.             $event->getCriteria()->addFilter(new ProductAvailableFilter($event->getSalesChannelContext()->getSalesChannel()->getId()));
  114.         }
  115.     }
  116. }