vendor/shopware/storefront/Controller/SearchController.php line 54

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Controller;
  3. use Shopware\Core\Content\Product\SalesChannel\Search\AbstractProductSearchRoute;
  4. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  5. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  6. use Shopware\Core\Framework\Routing\Annotation\Since;
  7. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  8. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  9. use Shopware\Storefront\Framework\Cache\Annotation\HttpCache;
  10. use Shopware\Storefront\Page\Search\SearchPageLoader;
  11. use Shopware\Storefront\Page\Suggest\SuggestPageLoader;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. /**
  17.  * @RouteScope(scopes={"storefront"})
  18.  */
  19. class SearchController extends StorefrontController
  20. {
  21.     /**
  22.      * @var SearchPageLoader
  23.      */
  24.     private $searchPageLoader;
  25.     /**
  26.      * @var SuggestPageLoader
  27.      */
  28.     private $suggestPageLoader;
  29.     /**
  30.      * @var AbstractProductSearchRoute
  31.      */
  32.     private $productSearchRoute;
  33.     public function __construct(
  34.         SearchPageLoader $searchPageLoader,
  35.         SuggestPageLoader $suggestPageLoader,
  36.         AbstractProductSearchRoute $productSearchRout
  37.     ) {
  38.         $this->searchPageLoader $searchPageLoader;
  39.         $this->suggestPageLoader $suggestPageLoader;
  40.         $this->productSearchRoute $productSearchRout;
  41.     }
  42.     /**
  43.      * @Since("6.0.0.0")
  44.      * @HttpCache()
  45.      * @Route("/search", name="frontend.search.page", methods={"GET"})
  46.      */
  47.     public function search(SalesChannelContext $contextRequest $request): Response
  48.     {
  49.         try {
  50.             $page $this->searchPageLoader->load($request$context);
  51.             if ($page->getListing()->getTotal() === 1) {
  52.                 $product $page->getListing()->first();
  53.                 if ($request->get('search') === $product->getProductNumber()) {
  54.                     $productId $product->getId();
  55.                     return $this->forwardToRoute('frontend.detail.page', [], ['productId' => $productId]);
  56.                 }
  57.             }
  58.         } catch (MissingRequestParameterException $missingRequestParameterException) {
  59.             return $this->forwardToRoute('frontend.home.page');
  60.         }
  61.         return $this->renderStorefront('@Storefront/storefront/page/search/index.html.twig', ['page' => $page]);
  62.     }
  63.     /**
  64.      * @Since("6.0.0.0")
  65.      * @HttpCache()
  66.      * @Route("/suggest", name="frontend.search.suggest", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  67.      */
  68.     public function suggest(SalesChannelContext $contextRequest $request): Response
  69.     {
  70.         $page $this->suggestPageLoader->load($request$context);
  71.         return $this->renderStorefront('@Storefront/storefront/layout/header/search-suggest.html.twig', ['page' => $page]);
  72.     }
  73.     /**
  74.      * @Since("6.2.0.0")
  75.      * @HttpCache()
  76.      *
  77.      * Route to load the listing filters
  78.      *
  79.      * @RouteScope(scopes={"storefront"})
  80.      * @Route("/widgets/search", name="widgets.search.pagelet.v2", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  81.      *
  82.      * @throws MissingRequestParameterException
  83.      */
  84.     public function ajax(Request $requestSalesChannelContext $context): Response
  85.     {
  86.         $request->request->set('no-aggregations'true);
  87.         $page $this->searchPageLoader->load($request$context);
  88.         return $this->renderStorefront('@Storefront/storefront/page/search/search-pagelet.html.twig', ['page' => $page]);
  89.     }
  90.     /**
  91.      * @Since("6.3.3.0")
  92.      * @HttpCache()
  93.      *
  94.      * Route to load the available listing filters
  95.      *
  96.      * @RouteScope(scopes={"storefront"})
  97.      * @Route("/widgets/search/filter", name="widgets.search.filter", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  98.      *
  99.      * @throws MissingRequestParameterException
  100.      */
  101.     public function filter(Request $requestSalesChannelContext $context): Response
  102.     {
  103.         $term $request->get('search');
  104.         if (!$term) {
  105.             throw new MissingRequestParameterException('search');
  106.         }
  107.         // Allows to fetch only aggregations over the gateway.
  108.         $request->request->set('only-aggregations'true);
  109.         // Allows to convert all post-filters to filters. This leads to the fact that only aggregation values are returned, which are combinable with the previous applied filters.
  110.         $request->request->set('reduce-aggregations'true);
  111.         $criteria = new Criteria();
  112.         $criteria->setTitle('search-page');
  113.         $result $this->productSearchRoute
  114.             ->load($request$context$criteria)
  115.             ->getListingResult();
  116.         $mapped = [];
  117.         foreach ($result->getAggregations() as $aggregation) {
  118.             $mapped[$aggregation->getName()] = $aggregation;
  119.         }
  120.         return new JsonResponse($mapped);
  121.     }
  122. }