<?php declare(strict_types=1);
namespace Wexo\RelewiseSearch\Core\Content\RelewiseSearch\Subscriber;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Wexo\Relewise\Service\Model\Items\Filtering\Filter\Content\ContentCategoryIdFilter;
use Wexo\Relewise\Service\Model\Items\Search\Facet\CategoryFacet;
use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\Events\RelewiseSearchBuilderContentModelEvent;
use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\Events\RelewiseSearchBuilderResultEvent;
use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\RelewiseSearchBuilder;
use Wexo\RelewiseSearch\Core\Content\RelewiseSearch\Tab\RelewiseSearchTabEntity;
use Wexo\RelewiseSearch\Service\ConfigService;
/**
* Class RelewiseSearchSubscriber
* @package Wexo\RelewiseSearch\Core\Content\RelewiseSearch
*/
class RelewiseSearchSubscriber implements EventSubscriberInterface
{
/**
* @var ConfigService
*/
protected $configService;
/**
* RelewiseSearchSubscriber constructor.
* @param ConfigService $configService
*/
public function __construct(ConfigService $configService)
{
$this->configService = $configService;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
RelewiseSearchBuilderContentModelEvent::class => 'onRelewiseSearchBuilderContent',
RelewiseSearchBuilderResultEvent::class => 'onRelewiseSearchResult'
];
}
/**
* @param RelewiseSearchBuilderContentModelEvent $event
*/
public function onRelewiseSearchBuilderContent(RelewiseSearchBuilderContentModelEvent $event): void
{
$request = $event->getRequest();
$searchTab = $event->getSearchTabEntity();
$model = $event->getContentSearchRequest();
$searchType = RelewiseSearchBuilder::getSearchTypeFromRequest($request);
$sidebarConfig = $this->sidebarConfig($event->getSalesChannelContext());
if ($sidebarConfig) {
$model->setTake($searchTab->getMaxResults() ?? 100);
}
// Check for current search
if ($searchTab->getTechnicalName() === $searchType) {
$categoryFacet = new CategoryFacet();
if ($category = $request->get('category')) {
$categoryFacet->setSelected(explode('|', $category));
}
// Only fetch items from the current content search. This saves network time by requesting less data
$model->setTake($searchTab->getMaxResults() ?? 100);
$model->addFacet($categoryFacet);
}
if ($categoryIds = $searchTab->getCategoryIds()) {
$model->addFilter(new ContentCategoryIdFilter($categoryIds));
}
}
/**
* @param RelewiseSearchBuilderResultEvent $event
*/
public function onRelewiseSearchResult(RelewiseSearchBuilderResultEvent $event)
{
$relewiseSearch = $event->getRelewiseSearch();
$searchType = RelewiseSearchBuilder::getSearchTypeFromRequest($event->getRequest());
if ($searchType !== 'product') {
/** @var RelewiseSearchTabEntity $currentSearch */
if ($currentSearch = $relewiseSearch->getTabs()->filterByProperty('technicalName', $searchType)->first()) {
$relewiseSearch->setResult($currentSearch->getRelewiseContent() ?? []);
$relewiseSearch->setContentLayout($currentSearch->getListingLayout());
}
}
$relewiseSearch->setContentSidebar($this->sidebarConfig($event->getSalesChannelContext()));
}
/**
* @param SalesChannelContext $salesChannelContext
* @return bool|null
*/
private function sidebarConfig(SalesChannelContext $salesChannelContext)
{
return $this->configService->isContentSidebarEnabled($salesChannelContext->getSalesChannelId());
}
}