src/Controller/Shop/SearchController.php line 220

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\Events\ProductViewItemListEvent;
  7. use App\Repository\Statistics\NoResultSearchRepository;
  8. use App\Service\SpecialCharactersService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use MonsieurBiz\SyliusSearchPlugin\Exception\UnknownRequestTypeException;
  11. use MonsieurBiz\SyliusSearchPlugin\Model\Documentable\DocumentableInterface;
  12. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestConfiguration;
  13. use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestInterface;
  14. use MonsieurBiz\SyliusSearchPlugin\Search\Search;
  15. use MonsieurBiz\SyliusSettingsPlugin\Settings\SettingsInterface;
  16. use Sylius\Bundle\ResourceBundle\Controller\Parameters;
  17. use Sylius\Bundle\ResourceBundle\Controller\ParametersParserInterface;
  18. use Sylius\Component\Channel\Context\ChannelContextInterface;
  19. use Sylius\Component\Currency\Context\CurrencyContextInterface;
  20. use Sylius\Component\Locale\Context\LocaleContextInterface;
  21. use Sylius\Component\Registry\ServiceRegistryInterface;
  22. use Sylius\Component\Taxonomy\Repository\TaxonRepositoryInterface;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  25. use Symfony\Component\HttpFoundation\RedirectResponse;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Intl\Currencies;
  29. class SearchController extends AbstractController
  30. {
  31.     private TaxonRepositoryInterface $taxonRepository;
  32.     private Search $search;
  33.     private CurrencyContextInterface $currencyContext;
  34.     private LocaleContextInterface $localeContext;
  35.     private ChannelContextInterface $channelContext;
  36.     private SettingsInterface $searchSettings;
  37.     private ServiceRegistryInterface $documentableRegistry;
  38.     private ParametersParserInterface $parametersParser;
  39.     private NoResultSearchAssigner $noResultSearchAssigner;
  40.     private NoResultSearchRepository $noResultSearchRepository;
  41.     private SpecialCharactersService $specialCharactersService;
  42.     private EntityManagerInterface $entityManager;
  43.     private EventDispatcherInterface $eventDispatcher;
  44.     public function __construct(TaxonRepositoryInterface $taxonRepositorySearch $searchCurrencyContextInterface $currencyContextLocaleContextInterface $localeContextChannelContextInterface $channelContextSettingsInterface $searchSettingsServiceRegistryInterface $documentableRegistryParametersParserInterface $parametersParserNoResultSearchAssigner $noResultSearchAssignerNoResultSearchRepository $noResultSearchRepositorySpecialCharactersService $specialCharactersServiceEntityManagerInterface $entityManagerEventDispatcherInterface $eventDispatcher)
  45.     {
  46.         $this->taxonRepository $taxonRepository;
  47.         $this->search $search;
  48.         $this->currencyContext $currencyContext;
  49.         $this->localeContext $localeContext;
  50.         $this->channelContext $channelContext;
  51.         $this->searchSettings $searchSettings;
  52.         $this->documentableRegistry $documentableRegistry;
  53.         $this->parametersParser $parametersParser;
  54.         $this->noResultSearchAssigner $noResultSearchAssigner;
  55.         $this->noResultSearchRepository $noResultSearchRepository;
  56.         $this->specialCharactersService $specialCharactersService;
  57.         $this->entityManager $entityManager;
  58.         $this->eventDispatcher $eventDispatcher;
  59.     }
  60.     public function searchAction(Request $requeststring $query): Response
  61.     {
  62.         /** @var DocumentableInterface $documentable */
  63.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  64.         $requestConfiguration = new RequestConfiguration(
  65.             $request,
  66.             RequestInterface::SEARCH_TYPE,
  67.             $documentable,
  68.             $this->searchSettings,
  69.             $this->channelContext
  70.         );
  71.         $result $this->search->search($requestConfiguration);
  72.         if (count($result) === 0) {
  73.             $this->noResultSearchAssigner->assign(urldecode($query));
  74.             // relancer la recherche avec une query associée si elle existe
  75.             /** @var NoResultSearch $noResultSearch */
  76.             $noResultSearch $this->noResultSearchRepository->findOneBy(['search' => trim($this->specialCharactersService->replaceAccentedCharacters(urldecode($query)))]);
  77.             if ($noResultSearch && $noResultSearch->getAssociatedWord()) {
  78.                 return $this->redirectToRoute('monsieurbiz_search_search', ['query' => $noResultSearch->getAssociatedWord()]);
  79.             }
  80.         } else {
  81.             // rechercher si une noresultsearch existe et la supprimer car il y a maintenant des résultats
  82.             /** @var NoResultSearch $noResultSearch */
  83.             $noResultSearch $this->noResultSearchRepository->findOneBy(['search' => trim($this->specialCharactersService->replaceAccentedCharacters(urldecode($query)))]);
  84.             if ($noResultSearch) {
  85.                 $this->entityManager->remove($noResultSearch);
  86.                 $this->entityManager->flush();
  87.             }
  88.         }
  89.         return $this->render('@MonsieurBizSyliusSearchPlugin/Search/result.html.twig', [
  90.             'documentable' => $result->getDocumentable(),
  91.             'requestConfiguration' => $requestConfiguration,
  92.             'query' => urldecode($query),
  93.             'query_url' => $query,
  94.             'result' => $result,
  95.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  96.         ]);
  97.     }
  98.     /**
  99.      * Post search.
  100.      */
  101.     public function postAction(Request $request): RedirectResponse
  102.     {
  103.         $query $request->request->get('query');
  104.         return $this->redirect(
  105.             $this->generateUrl(
  106.                 'monsieurbiz_search_search',
  107.                 ['query' => str_replace('%2F''/'urlencode($query))]
  108.             )
  109.         );
  110.     }
  111.     /**
  112.      * Perform the instant search action & display results.
  113.      */
  114.     public function instantAction(Request $request): Response
  115.     {
  116.         $results = [];
  117.         /** @var DocumentableInterface $documentable */
  118.         foreach ($this->documentableRegistry->all() as $documentable) {
  119.             if (!(bool) $this->searchSettings->getCurrentValue($this->channelContext->getChannel(), null'instant_search_enabled__' $documentable->getIndexCode())) {
  120.                 continue;
  121.             }
  122.             $requestConfiguration = new RequestConfiguration(
  123.                 $request,
  124.                 RequestInterface::INSTANT_TYPE,
  125.                 $documentable,
  126.                 $this->searchSettings,
  127.                 $this->channelContext,
  128.                 new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  129.             );
  130.             try {
  131.                 $results[] = $this->search->search($requestConfiguration);
  132.             } catch (UnknownRequestTypeException $e) {
  133.                 continue;
  134.             }
  135.         }
  136.         $bNoResult true;
  137.         if (!empty($results)) {
  138.             foreach ($results as $result) {
  139.                 if ($result->count() == 0) {
  140.                 } else {
  141.                     $bNoResult false;
  142.                 }
  143.             }
  144.         }
  145.         if ($bNoResult == true) {
  146.             $query $request->get('query') ?? '';
  147.             if ($query != '') {
  148.                 $this->noResultSearchAssigner->assign(urldecode($query));
  149.                 $noResultSearch $this->noResultSearchRepository->findOneBy(['search' => trim($this->specialCharactersService->replaceAccentedCharacters(urldecode($query)))]);
  150.                 if ($noResultSearch && $noResultSearch->getAssociatedWord()) {
  151.                     $request->request->set('query'$noResultSearch->getAssociatedWord());
  152.                     foreach ($this->documentableRegistry->all() as $documentable) {
  153.                         $requestConfiguration = new RequestConfiguration(
  154.                             $request,
  155.                             RequestInterface::INSTANT_TYPE,
  156.                             $documentable,
  157.                             $this->searchSettings,
  158.                             $this->channelContext,
  159.                             new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  160.                         );
  161.                         try {
  162.                             $results[] = $this->search->search($requestConfiguration);
  163.                         } catch (UnknownRequestTypeException $e) {
  164.                             continue;
  165.                         }
  166.                     }
  167.                 }
  168.             }
  169.         }
  170.         return $this->render('@MonsieurBizSyliusSearchPlugin/Instant/result.html.twig', [
  171.             'results' => $results,
  172.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  173.         ]);
  174.     }
  175.     public function taxonAction(Request $request): Response
  176.     {
  177.         /** @var DocumentableInterface $documentable */
  178.         $documentable $this->documentableRegistry->get('search.documentable.monsieurbiz_product');
  179.         $requestConfiguration = new RequestConfiguration(
  180.             $request,
  181.             RequestInterface::TAXON_TYPE,
  182.             $documentable,
  183.             $this->searchSettings,
  184.             $this->channelContext,
  185.             new Parameters($this->parametersParser->parseRequestValues($request->attributes->get('_sylius', []), $request))
  186.         );
  187.         $result $this->search->search($requestConfiguration);
  188.         $taxon $this->taxonRepository->findOneBySlug(
  189.             $request->get('slug'),
  190.             $this->localeContext->getLocaleCode()
  191.         );
  192.         if ($result && $result->count() > 0) {
  193.             $arrayAllProductsGTM = []; //utilisé uniquement pour les event GTM
  194.             foreach ($result as $productES) {
  195.                 $arrayAllProductsGTM['result'][$productES->getId()] = $productES->getId();
  196.             }
  197.             $arrayAllProductsGTM['currentCategory'] = $taxon;
  198.             $event = new ProductViewItemListEvent($arrayAllProductsGTM);
  199.             $this->eventDispatcher->dispatch($eventProductViewItemListEvent::NAME);
  200.         }
  201.         return $this->render('@MonsieurBizSyliusSearchPlugin/Taxon/result.html.twig', [
  202.             'taxon' => $taxon,
  203.             'requestConfiguration' => $requestConfiguration,
  204.             'result' => $result,
  205.             'currencySymbol' => Currencies::getSymbol($this->currencyContext->getCurrencyCode(), $this->localeContext->getLocaleCode()),
  206.         ]);
  207.     }
  208. }