src/Controller/Shop/SearchController.php line 141

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Shop;
  4. use MonsieurBiz\SyliusSearchPlugin\Exception\UnknownRequestTypeException;
  5. use MonsieurBiz\SyliusSearchPlugin\Model\Documentable\DocumentableInterface;
  6. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestConfiguration;
  7. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestInterface;
  8. use MonsieurBiz\SyliusSearchPlugin\Search\Search;
  9. use MonsieurBiz\SyliusSettingsPlugin\Settings\SettingsInterface;
  10. use Sylius\Bundle\ResourceBundle\Controller\Parameters;
  11. use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
  12. use Sylius\Component\Channel\Context\ChannelContextInterface;
  13. use Sylius\Component\Currency\Context\CurrencyContextInterface;
  14. use Sylius\Component\Locale\Context\LocaleContextInterface;
  15. use Sylius\Component\Registry\ServiceRegistryInterface;
  16. use Sylius\Component\Taxonomy\Repository\TaxonRepositoryInterface;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Intl\Currencies;
  22. class SearchController extends AbstractController
  23. {
  24.     private TaxonRepositoryInterface $taxonRepository;
  25.     private Search $search;
  26.     private CurrencyContextInterface $currencyContext;
  27.     private LocaleContextInterface $localeContext;
  28.     private ChannelContextInterface $channelContext;
  29.     private SettingsInterface $searchSettings;
  30.     private ServiceRegistryInterface $documentableRegistry;
  31.     private ParametersParserInterface $parametersParser;
  32.     public function __construct(
  33.         TaxonRepositoryInterface $taxonRepository,
  34.         Search $search,
  35.         CurrencyContextInterface $currencyContext,
  36.         LocaleContextInterface $localeContext,
  37.         ChannelContextInterface $channelContext,
  38.         SettingsInterface $searchSettings,
  39.         ServiceRegistryInterface $documentableRegistry,
  40.         ParametersParserInterface $parametersParser
  41.     ) {
  42.         $this->taxonRepository $taxonRepository;
  43.         $this->search $search;
  44.         $this->currencyContext $currencyContext;
  45.         $this->localeContext $localeContext;
  46.         $this->channelContext $channelContext;
  47.         $this->searchSettings $searchSettings;
  48.         $this->documentableRegistry $documentableRegistry;
  49.         $this->parametersParser $parametersParser;
  50.     }
  51.     // TODO add an optional parameter $documentType (nullable => get the default document type)
  52.     public function searchAction(Request $requeststring $query): Response
  53.     {
  54.         /** @var DocumentableInterface $documentable */
  55.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  56.         $requestConfiguration = new RequestConfiguration(
  57.             $request,
  58.             RequestInterface::SEARCH_TYPE,
  59.             $documentable,
  60.             $this->searchSettings,
  61.             $this->channelContext
  62.         );
  63.         $result $this->search->search($requestConfiguration);
  64.         return $this->render('@MonsieurBizSyliusSearchPlugin/Search/result.html.twig', [
  65.             'documentable'         => $result->getDocumentable(),
  66.             'requestConfiguration' => $requestConfiguration,
  67.             'query'                => urldecode($query),
  68.             'query_url'            => $query,
  69.             'result'               => $result,
  70.             'currencySymbol'       => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  71.         ]);
  72.     }
  73.     /**
  74.      * Post search.
  75.      */
  76.     public function postAction(Request $request): RedirectResponse
  77.     {
  78.         $query = (array) $request->request->get('monsieurbiz_searchplugin_search') ?? [];
  79.         $query $query['query'] ?? '';
  80.         return $this->redirect(
  81.             $this->generateUrl(
  82.                 'monsieurbiz_search_search',
  83.                 ['query' => urlencode($query)]
  84.             )
  85.         );
  86.     }
  87.     /**
  88.      * Perform the instant search action & display results.
  89.      */
  90.     public function instantAction(Request $request): Response
  91.     {
  92.         $results = [];
  93.         /** @var DocumentableInterface $documentable */
  94.         foreach ($this->documentableRegistry->all() as $documentable)
  95.         {
  96.             if (!(bool) $this->searchSettings->getCurrentValue($this->channelContext->getChannel(), null'instant_search_enabled__'.$documentable->getIndexCode()))
  97.             {
  98.                 continue;
  99.             }
  100.             $requestConfiguration = new RequestConfiguration(
  101.                 $request,
  102.                 RequestInterface::INSTANT_TYPE,
  103.                 $documentable,
  104.                 $this->searchSettings,
  105.                 $this->channelContext
  106.             );
  107.             try
  108.             {
  109.                 $results[] = $this->search->search($requestConfiguration);
  110.             }
  111.             catch (UnknownRequestTypeException $e)
  112.             {
  113.                 continue;
  114.             }
  115.         }
  116.         return $this->render('@MonsieurBizSyliusSearchPlugin/Instant/result.html.twig', [
  117.             'results' => $results,
  118.         ]);
  119.     }
  120.     public function taxonAction(Request $request): Response
  121.     {
  122.         /** @var DocumentableInterface $documentable */
  123.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  124.         $requestConfiguration = new RequestConfiguration(
  125.             $request,
  126.             RequestInterface::TAXON_TYPE,
  127.             $documentable,
  128.             $this->searchSettings,
  129.             $this->channelContext,
  130.             new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  131.         );
  132.         $result $this->search->search($requestConfiguration);
  133.         $taxon $this->taxonRepository->findOneBySlug(
  134.             $request->get('slug'),
  135.             $this->localeContext->getLocaleCode()
  136.         );
  137.         return $this->render('@MonsieurBizSyliusSearchPlugin/Taxon/result.html.twig', [
  138.             'taxon'                => $taxon,
  139.             'requestConfiguration' => $requestConfiguration,
  140.             'result'               => $result,
  141.             'currencySymbol'       => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  142.         ]);
  143.     }
  144. }