src/Controller/Shop/SearchController.php line 139

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\HttpKernel\Exception\NotFoundHttpException;
  22. use Symfony\Component\Intl\Currencies;
  23. class SearchController extends AbstractController
  24. {
  25.     private TaxonRepositoryInterface $taxonRepository;
  26.     private Search $search;
  27.     private CurrencyContextInterface $currencyContext;
  28.     private LocaleContextInterface $localeContext;
  29.     private ChannelContextInterface $channelContext;
  30.     private SettingsInterface $searchSettings;
  31.     private ServiceRegistryInterface $documentableRegistry;
  32.     private ParametersParserInterface $parametersParser;
  33.     public function __construct(
  34.         TaxonRepositoryInterface $taxonRepository,
  35.         Search $search,
  36.         CurrencyContextInterface $currencyContext,
  37.         LocaleContextInterface $localeContext,
  38.         ChannelContextInterface $channelContext,
  39.         SettingsInterface $searchSettings,
  40.         ServiceRegistryInterface $documentableRegistry,
  41.         ParametersParserInterface $parametersParser
  42.     ) {
  43.         $this->taxonRepository $taxonRepository;
  44.         $this->search $search;
  45.         $this->currencyContext $currencyContext;
  46.         $this->localeContext $localeContext;
  47.         $this->channelContext $channelContext;
  48.         $this->searchSettings $searchSettings;
  49.         $this->documentableRegistry $documentableRegistry;
  50.         $this->parametersParser $parametersParser;
  51.     }
  52.     // TODO add an optional parameter $documentType (nullable => get the default document type)
  53.     public function searchAction(Request $requeststring $query): Response
  54.     {
  55.         /** @var DocumentableInterface $documentable */
  56.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  57.         $requestConfiguration = new RequestConfiguration(
  58.             $request,
  59.             RequestInterface::SEARCH_TYPE,
  60.             $documentable,
  61.             $this->searchSettings,
  62.             $this->channelContext
  63.         );
  64.         $result $this->search->search($requestConfiguration);
  65.         return $this->render('@MonsieurBizSyliusSearchPlugin/Search/result.html.twig', [
  66.             'documentable' => $result->getDocumentable(),
  67.             'requestConfiguration' => $requestConfiguration,
  68.             'query' => urldecode($query),
  69.             'query_url' => $query,
  70.             'result' => $result,
  71.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  72.         ]);
  73.     }
  74.     /**
  75.      * Post search.
  76.      */
  77.     public function postAction(Request $request): RedirectResponse
  78.     {
  79.         $query = (array) $request->request->get('monsieurbiz_searchplugin_search') ?? [];
  80.         $query $query['query'] ?? '';
  81.         return $this->redirect(
  82.             $this->generateUrl(
  83.                 'monsieurbiz_search_search',
  84.                 ['query' => str_replace('%2F''/'urlencode($query))]
  85.             )
  86.         );
  87.     }
  88.     /**
  89.      * Perform the instant search action & display results.
  90.      */
  91.     public function instantAction(Request $request): Response
  92.     {
  93.         $results = [];
  94.         /** @var DocumentableInterface $documentable */
  95.         foreach ($this->documentableRegistry->all() as $documentable) {
  96.             if (!(bool) $this->searchSettings->getCurrentValue($this->channelContext->getChannel(), null'instant_search_enabled__' $documentable->getIndexCode())) {
  97.                 continue;
  98.             }
  99.             $requestConfiguration = new RequestConfiguration(
  100.                 $request,
  101.                 RequestInterface::INSTANT_TYPE,
  102.                 $documentable,
  103.                 $this->searchSettings,
  104.                 $this->channelContext,
  105.                 new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  106.             );
  107.             try {
  108.                 $results[] = $this->search->search($requestConfiguration);
  109.             } catch (UnknownRequestTypeException $e) {
  110.                 continue;
  111.             }
  112.         }
  113.         return $this->render('@MonsieurBizSyliusSearchPlugin/Instant/result.html.twig', [
  114.             'results' => $results,
  115.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  116.         ]);
  117.     }
  118.     public function taxonAction(Request $request): Response
  119.     {
  120.         /** @var DocumentableInterface $documentable */
  121.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  122.         $requestConfiguration = new RequestConfiguration(
  123.             $request,
  124.             RequestInterface::TAXON_TYPE,
  125.             $documentable,
  126.             $this->searchSettings,
  127.             $this->channelContext,
  128.             new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  129.         );
  130.         $result $this->search->search($requestConfiguration);
  131.         $taxon $this->taxonRepository->findOneBySlug(
  132.             $request->get('slug'),
  133.             $this->localeContext->getLocaleCode()
  134.         );
  135.         // empĂȘcher les url multiples avec d'autres oldId que le bon
  136.         $slug $request->attributes->get('slug');
  137.         $id $request->attributes->get('id');
  138.         if ($taxon->getSlug() !== $slug || $taxon->getOldId() != $id) {
  139.             throw new NotFoundHttpException();
  140.         }
  141.         return $this->render('@MonsieurBizSyliusSearchPlugin/Taxon/result.html.twig', [
  142.             'taxon' => $taxon,
  143.             'requestConfiguration' => $requestConfiguration,
  144.             'result' => $result,
  145.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  146.         ]);
  147.     }
  148. }