custom/static-plugins/relewise-search/src/Subscriber/SearchSubscriber.php line 112

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Wexo\RelewiseSearch\Subscriber;
  3. use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
  4. use Shopware\Core\Content\Product\Events\ProductSuggestCriteriaEvent;
  5. use Shopware\Core\Content\Product\Events\ProductSuggestResultEvent;
  6. use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingFeaturesSubscriber;
  7. use Shopware\Storefront\Page\Search\SearchPageLoadedEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Wexo\Relewise\Service\Model\Search\Request\ContentSearchRequest;
  10. use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\RelewiseSearchBuilder;
  11. use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\RelewiseSearchBuilderInterface;
  12. use Wexo\RelewiseSearch\Service\ConfigService;
  13. /**
  14.  * Class SearchSubscriber
  15.  * @package Wexo\GarantSearch\Subscriber
  16.  */
  17. class SearchSubscriber implements EventSubscriberInterface
  18. {
  19.     /**
  20.      * @var ProductListingFeaturesSubscriber
  21.      */
  22.     protected $featuresSubscriber;
  23.     /**
  24.      * @var ConfigService
  25.      */
  26.     protected $configService;
  27.     /**
  28.      * @var RelewiseSearchBuilderInterface
  29.      */
  30.     protected $relewiseSearchBuilder;
  31.     /**
  32.      * SearchSubscriber constructor.
  33.      * @param ProductListingFeaturesSubscriber $featuresSubscriber
  34.      * @param ConfigService $configService
  35.      * @param RelewiseSearchBuilderInterface $relewiseSearchBuilder
  36.      */
  37.     public function __construct(
  38.         ProductListingFeaturesSubscriber $featuresSubscriber,
  39.         ConfigService $configService,
  40.         RelewiseSearchBuilderInterface $relewiseSearchBuilder
  41.     ) {
  42.         $this->featuresSubscriber $featuresSubscriber;
  43.         $this->configService $configService;
  44.         $this->relewiseSearchBuilder $relewiseSearchBuilder;
  45.     }
  46.     /**
  47.      * @return string[]
  48.      */
  49.     public static function getSubscribedEvents()
  50.     {
  51.         return [
  52.             SearchPageLoadedEvent::class => 'onSearchPageLoaded',
  53.             ProductSuggestResultEvent::class => 'handleResult',
  54.             ProductSuggestCriteriaEvent::class => 'handleSearchRequest'
  55.         ];
  56.     }
  57.     /**
  58.      * @param SearchPageLoadedEvent $event
  59.      */
  60.     public function onSearchPageLoaded(SearchPageLoadedEvent $event): void
  61.     {
  62.         $salesChannelContext $event->getSalesChannelContext();
  63.         $request $event->getRequest();
  64.         $page $event->getPage();
  65.         $contentModel = new ContentSearchRequest();
  66.         $contentModel->setTerm($request->get('search'));
  67.         $contentModel->setTake(0);
  68.         $contentModel->setSettings([
  69.             'SelectedContentProperties' => [
  70.                 'DisplayName' => true,
  71.                 'DataKeys' => [
  72.                     'ImageUrl',
  73.                     'Text'
  74.                 ]
  75.             ],
  76.         ]);
  77.         $relewiseSearch $this->relewiseSearchBuilder->build(
  78.             $salesChannelContext,
  79.             $request,
  80.             $contentModel
  81.         );
  82.         $relewiseSearch->setTotalHits($relewiseSearch->getTotalHits() + $page->getListing()->getTotal());
  83.         $page->addExtension(RelewiseSearchBuilder::RELEWISE_SEARCH_EXTENSION$relewiseSearch);
  84.     }
  85.     /**
  86.      * @param ProductSuggestResultEvent $event
  87.      */
  88.     public function handleResult(ProductSuggestResultEvent $event)
  89.     {
  90.         if (!$this->configService->isSearchFullPageEnabled($event->getSalesChannelContext()->getSalesChannelId())) {
  91.             return;
  92.         }
  93.         $this->featuresSubscriber->handleResult($event);
  94.     }
  95.     /**
  96.      * @param ProductSuggestCriteriaEvent $event
  97.      */
  98.     public function handleSearchRequest(ProductSuggestCriteriaEvent $event)
  99.     {
  100.         $salesChannelContext $event->getSalesChannelContext();
  101.         if (!$this->configService->isSearchFullPageEnabled($salesChannelContext->getSalesChannelId())) {
  102.             return;
  103.         }
  104.         $searchEvent = new ProductSearchCriteriaEvent(
  105.             $event->getRequest(),
  106.             $event->getCriteria(),
  107.             $salesChannelContext
  108.         );
  109.         $this->featuresSubscriber->handleSearchRequest($searchEvent);
  110.     }
  111. }