<?php declare(strict_types=1);
namespace Wexo\RelewiseSearch\Subscriber;
use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductSuggestCriteriaEvent;
use Shopware\Core\Content\Product\Events\ProductSuggestResultEvent;
use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingFeaturesSubscriber;
use Shopware\Storefront\Page\Search\SearchPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\Relewise\Service\Model\Search\Request\ContentSearchRequest;
use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\RelewiseSearchBuilder;
use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\RelewiseSearchBuilderInterface;
use Wexo\RelewiseSearch\Service\ConfigService;
/**
* Class SearchSubscriber
* @package Wexo\GarantSearch\Subscriber
*/
class SearchSubscriber implements EventSubscriberInterface
{
/**
* @var ProductListingFeaturesSubscriber
*/
protected $featuresSubscriber;
/**
* @var ConfigService
*/
protected $configService;
/**
* @var RelewiseSearchBuilderInterface
*/
protected $relewiseSearchBuilder;
/**
* SearchSubscriber constructor.
* @param ProductListingFeaturesSubscriber $featuresSubscriber
* @param ConfigService $configService
* @param RelewiseSearchBuilderInterface $relewiseSearchBuilder
*/
public function __construct(
ProductListingFeaturesSubscriber $featuresSubscriber,
ConfigService $configService,
RelewiseSearchBuilderInterface $relewiseSearchBuilder
) {
$this->featuresSubscriber = $featuresSubscriber;
$this->configService = $configService;
$this->relewiseSearchBuilder = $relewiseSearchBuilder;
}
/**
* @return string[]
*/
public static function getSubscribedEvents()
{
return [
SearchPageLoadedEvent::class => 'onSearchPageLoaded',
ProductSuggestResultEvent::class => 'handleResult',
ProductSuggestCriteriaEvent::class => 'handleSearchRequest'
];
}
/**
* @param SearchPageLoadedEvent $event
*/
public function onSearchPageLoaded(SearchPageLoadedEvent $event): void
{
$salesChannelContext = $event->getSalesChannelContext();
$request = $event->getRequest();
$page = $event->getPage();
$contentModel = new ContentSearchRequest();
$contentModel->setTerm($request->get('search'));
$contentModel->setTake(0);
$contentModel->setSettings([
'SelectedContentProperties' => [
'DisplayName' => true,
'DataKeys' => [
'ImageUrl',
'Text'
]
],
]);
$relewiseSearch = $this->relewiseSearchBuilder->build(
$salesChannelContext,
$request,
$contentModel
);
$relewiseSearch->setTotalHits($relewiseSearch->getTotalHits() + $page->getListing()->getTotal());
$page->addExtension(RelewiseSearchBuilder::RELEWISE_SEARCH_EXTENSION, $relewiseSearch);
}
/**
* @param ProductSuggestResultEvent $event
*/
public function handleResult(ProductSuggestResultEvent $event)
{
if (!$this->configService->isSearchFullPageEnabled($event->getSalesChannelContext()->getSalesChannelId())) {
return;
}
$this->featuresSubscriber->handleResult($event);
}
/**
* @param ProductSuggestCriteriaEvent $event
*/
public function handleSearchRequest(ProductSuggestCriteriaEvent $event)
{
$salesChannelContext = $event->getSalesChannelContext();
if (!$this->configService->isSearchFullPageEnabled($salesChannelContext->getSalesChannelId())) {
return;
}
$searchEvent = new ProductSearchCriteriaEvent(
$event->getRequest(),
$event->getCriteria(),
$salesChannelContext
);
$this->featuresSubscriber->handleSearchRequest($searchEvent);
}
}