src/Controller/Shop/SearchController.php line 177

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Shop;
  4. use App\Assigner\NoResultSearchAssigner;
  5. use App\Entity\Statistics\NoResultSearch;
  6. use App\Repository\Statistics\NoResultSearchRepository;
  7. use App\Service\SpecialCharactersService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use MonsieurBiz\SyliusSearchPlugin\Exception\UnknownRequestTypeException;
  10. use MonsieurBiz\SyliusSearchPlugin\Model\Documentable\DocumentableInterface;
  11. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestConfiguration;
  12. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestInterface;
  13. use MonsieurBiz\SyliusSearchPlugin\Search\Search;
  14. use MonsieurBiz\SyliusSettingsPlugin\Settings\SettingsInterface;
  15. use Sylius\Bundle\ResourceBundle\Controller\Parameters;
  16. use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
  17. use Sylius\Component\Channel\Context\ChannelContextInterface;
  18. use Sylius\Component\Currency\Context\CurrencyContextInterface;
  19. use Sylius\Component\Locale\Context\LocaleContextInterface;
  20. use Sylius\Component\Registry\ServiceRegistryInterface;
  21. use Sylius\Component\Taxonomy\Repository\TaxonRepositoryInterface;
  22. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  23. use Symfony\Component\HttpFoundation\RedirectResponse;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Intl\Currencies;
  27. class SearchController extends AbstractController
  28. {
  29.     private TaxonRepositoryInterface $taxonRepository;
  30.     private Search $search;
  31.     private CurrencyContextInterface $currencyContext;
  32.     private LocaleContextInterface $localeContext;
  33.     private ChannelContextInterface $channelContext;
  34.     private SettingsInterface $searchSettings;
  35.     private ServiceRegistryInterface $documentableRegistry;
  36.     private ParametersParserInterface $parametersParser;
  37.     private NoResultSearchAssigner $noResultSearchAssigner;
  38.     private NoResultSearchRepository $noResultSearchRepository;
  39.     private SpecialCharactersService $specialCharactersService;
  40.     private EntityManagerInterface $entityManager;
  41.     public function __construct(
  42.         TaxonRepositoryInterface $taxonRepository,
  43.         Search $search,
  44.         CurrencyContextInterface $currencyContext,
  45.         LocaleContextInterface $localeContext,
  46.         ChannelContextInterface $channelContext,
  47.         SettingsInterface $searchSettings,
  48.         ServiceRegistryInterface $documentableRegistry,
  49.         ParametersParserInterface $parametersParser,
  50.         NoResultSearchAssigner $noResultSearchAssigner,
  51.         NoResultSearchRepository $noResultSearchRepository,
  52.         SpecialCharactersService $specialCharactersService,
  53.         EntityManagerInterface $entityManager
  54.     ) {
  55.         $this->taxonRepository $taxonRepository;
  56.         $this->search $search;
  57.         $this->currencyContext $currencyContext;
  58.         $this->localeContext $localeContext;
  59.         $this->channelContext $channelContext;
  60.         $this->searchSettings $searchSettings;
  61.         $this->documentableRegistry $documentableRegistry;
  62.         $this->parametersParser $parametersParser;
  63.         $this->noResultSearchAssigner $noResultSearchAssigner;
  64.         $this->noResultSearchRepository $noResultSearchRepository;
  65.         $this->specialCharactersService $specialCharactersService;
  66.         $this->entityManager $entityManager;
  67.     }
  68.     // TODO add an optional parameter $documentType (nullable => get the default document type)
  69.     public function searchAction(Request $requeststring $query): Response
  70.     {
  71.         /** @var DocumentableInterface $documentable */
  72.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  73.         $requestConfiguration = new RequestConfiguration(
  74.             $request,
  75.             RequestInterface::SEARCH_TYPE,
  76.             $documentable,
  77.             $this->searchSettings,
  78.             $this->channelContext
  79.         );
  80.         $result $this->search->search($requestConfiguration);
  81.         if (count($result) === 0) {
  82.             $this->noResultSearchAssigner->assign(urldecode($query));
  83.             // relancer la recherche avec une query associée si elle existe
  84.             /** @var NoResultSearch $noResultSearch */
  85.             $noResultSearch $this->noResultSearchRepository->findOneBy(['search' => trim($this->specialCharactersService->replaceAccentedCharacters(urldecode($query)))]);
  86.             if ($noResultSearch && $noResultSearch->getAssociatedWord()) {
  87.                 return $this->redirectToRoute('monsieurbiz_search_search', ['query' => $noResultSearch->getAssociatedWord()]);
  88.             }
  89.         } else {
  90.             //rechercher si une noresultsearch existe et la supprimer car il y a maintenant des résultats
  91.             /** @var NoResultSearch $noResultSearch */
  92.             $noResultSearch $this->noResultSearchRepository->findOneBy(['search' => trim($this->specialCharactersService->replaceAccentedCharacters(urldecode($query)))]);
  93.             if ($noResultSearch) {
  94.                 $this->entityManager->remove($noResultSearch);
  95.                 $this->entityManager->flush();
  96.             }
  97.         }
  98.         return $this->render('@MonsieurBizSyliusSearchPlugin/Search/result.html.twig', [
  99.             'documentable' => $result->getDocumentable(),
  100.             'requestConfiguration' => $requestConfiguration,
  101.             'query' => urldecode($query),
  102.             'query_url' => $query,
  103.             'result' => $result,
  104.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  105.         ]);
  106.     }
  107.     /**
  108.      * Post search.
  109.      */
  110.     public function postAction(Request $request): RedirectResponse
  111.     {
  112.         $query = (array) $request->request->get('monsieurbiz_searchplugin_search') ?? [];
  113.         $query $query['query'] ?? '';
  114.         return $this->redirect(
  115.             $this->generateUrl(
  116.                 'monsieurbiz_search_search',
  117.                 ['query' => urlencode($query)]
  118.             )
  119.         );
  120.     }
  121.     /**
  122.      * Perform the instant search action & display results.
  123.      */
  124.     public function instantAction(Request $request): Response
  125.     {
  126.         $results = [];
  127.         /** @var DocumentableInterface $documentable */
  128.         foreach ($this->documentableRegistry->all() as $documentable) {
  129.             if (!(bool) $this->searchSettings->getCurrentValue($this->channelContext->getChannel(), null'instant_search_enabled__' $documentable->getIndexCode())) {
  130.                 continue;
  131.             }
  132.             $requestConfiguration = new RequestConfiguration(
  133.                 $request,
  134.                 RequestInterface::INSTANT_TYPE,
  135.                 $documentable,
  136.                 $this->searchSettings,
  137.                 $this->channelContext,
  138.                 new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  139.             );
  140.             try {
  141.                 $results[] = $this->search->search($requestConfiguration);
  142.             } catch (UnknownRequestTypeException $e) {
  143.                 continue;
  144.             }
  145.         }
  146.         return $this->render('@MonsieurBizSyliusSearchPlugin/Instant/result.html.twig', [
  147.             'results' => $results,
  148.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  149.         ]);
  150.     }
  151.     public function taxonAction(Request $request): Response
  152.     {
  153.         /** @var DocumentableInterface $documentable */
  154.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  155.         $requestConfiguration = new RequestConfiguration(
  156.             $request,
  157.             RequestInterface::TAXON_TYPE,
  158.             $documentable,
  159.             $this->searchSettings,
  160.             $this->channelContext,
  161.             new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  162.         );
  163.         $result $this->search->search($requestConfiguration);
  164.         $taxon $this->taxonRepository->findOneBySlug(
  165.             $request->get('slug'),
  166.             $this->localeContext->getLocaleCode()
  167.         );
  168.         return $this->render('@MonsieurBizSyliusSearchPlugin/Taxon/result.html.twig', [
  169.             'taxon' => $taxon,
  170.             'requestConfiguration' => $requestConfiguration,
  171.             'result' => $result,
  172.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  173.         ]);
  174.     }
  175. }