<?php declare(strict_types=1);
namespace Swag\EnterpriseSearch\Controller;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Shopware\Storefront\Framework\Cache\Annotation\HttpCache;
use Shopware\Storefront\Page\Search\SearchPageLoader as ShopwareSearchPageLoader;
use Swag\EnterpriseSearch\Action\ActionType\RedirectActionException;
use Swag\EnterpriseSearch\Search\Page\SearchPageLoader;
use Swag\EnterpriseSearch\Suggest\Page\SuggestPageLoader;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @RouteScope(scopes={"storefront"})
*/
class SearchController extends StorefrontController
{
private const NAME = 'product-search-route';
/**
* @var SearchPageLoader
*/
private $searchPageLoader;
/**
* @var SuggestPageLoader
*/
private $suggestPageLoader;
/**
* @var ShopwareSearchPageLoader
*/
private $productPageLoader;
/**
* @var AdapterInterface
*/
private $cache;
public function __construct(
SearchPageLoader $searchPageLoader,
SuggestPageLoader $suggestPageLoader,
ShopwareSearchPageLoader $productPageLoader,
AdapterInterface $cache
) {
$this->searchPageLoader = $searchPageLoader;
$this->suggestPageLoader = $suggestPageLoader;
$this->productPageLoader = $productPageLoader;
$this->cache = $cache;
}
/**
* @HttpCache()
* @Route("/search", name="frontend.search.page", methods={"GET"})
*/
public function search(SalesChannelContext $context, Request $request): Response
{
$term = $request->get('search');
$key = md5(json_encode([
self::NAME,
method_exists($context, 'getSalesChannelId') ? $context->getSalesChannelId() : '',
method_exists($context, 'getLanguageIdChain') ? implode(' ', $context->getLanguageIdChain()) : '',
$term,
$context->getRuleIds(),
$context->getContext()->getVersionId(),
$context->getCurrency()->getId(),
$context->getCustomer() ? 'logged-in' : 'not-logged-in',
]));
$validTo = null;
$item = $this->cache->getItem($key);
if ($item->isHit()) {
return $item->get();
}
try {
$page = $this->searchPageLoader->load($request, $context);
$response = $this->renderStorefront('@Storefront/storefront/page/search/index.html.twig', ['page' => $page]);
} catch (MissingRequestParameterException $missingRequestParameterException) {
$response = $this->forwardToRoute('frontend.home.page');
} catch (RedirectActionException $redirectActionException) {
$validTo = $redirectActionException->getValidTo();
$response = $this->redirect($redirectActionException->getRoute());
}
$item->set($response);
$item->tag(self::NAME);
$item->expiresAt($validTo);
$this->cache->save($item);
return $response;
}
/**
* @HttpCache()
* @Route("/suggest", name="frontend.search.suggest", methods={"GET"}, defaults={"XmlHttpRequest"=true})
*/
public function suggest(SalesChannelContext $context, Request $request): Response
{
$page = $this->suggestPageLoader->load($request, $context);
return $this->renderStorefront('@Storefront/storefront/layout/header/search-suggest.html.twig', ['page' => $page]);
}
/**
* @HttpCache()
*
* Route to load the listing filters
*
* @Route("/widgets/search/{search}", name="widgets.search.pagelet", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
*
* @throws MissingRequestParameterException
*
* @deprecated tag:v3.3.0 use the Shopware SearchController methode instead.
*/
public function pagelet(Request $request, SalesChannelContext $context): Response
{
$request->request->set('no-aggregations', true);
$page = $this->productPageLoader->load($request, $context);
return $this->renderStorefront('@Storefront/storefront/page/search/search-pagelet.html.twig', ['page' => $page]);
}
}