src/Controller/Front/SearchController.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use Symfony\Component\HttpFoundation\Response;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Doctrine\ORM\EntityManager;
  7. use App\Service\Search;
  8. use App\Manager\StoreManager;
  9. class SearchController extends FrontController
  10. {
  11. /**
  12. * @Route("/{_locale}/search/", name="search", requirements={"_locale":"fr|en"})
  13. */
  14. public function search(Request $request, Search $search, \Doctrine\ORM\EntityManagerInterface $em)
  15. {
  16. $page = $request->get('p',1);
  17. $q = $request->get('q', '');
  18. if($q == ""){
  19. $q = $request->get('query');
  20. }
  21. $type = $request->isXmlHttpRequest() ? 'json' : 'html';
  22. $nbByPage = 20;
  23. $lang = $request->getLocale();
  24. $mode = $request->get('mode','exact');
  25. if(!in_array($mode, ['exact','keywords'])){
  26. $mode = 'exact';
  27. }
  28. //recherche par référence
  29. if(!empty($q)) {
  30. $reference = $em->getRepository('App:Product')->findOneByReference($q);
  31. if($reference){
  32. if(!$reference->isParent()){
  33. $reference = $reference->getParent();
  34. }
  35. return $this->redirectToRoute('product',['id'=>$reference->getId(), 'url'=>$reference->getUrl()]);
  36. }
  37. }
  38. //recherche dans elasticsearch
  39. $results = $search->searchProduct($q, $lang, $nbByPage, $page, $mode);
  40. if($results['nbResults'] < 15){
  41. $mode = "keywords";
  42. $results = $search->searchProduct($q, $lang, $nbByPage, $page, $mode);
  43. }
  44. $nbPages = ceil($results['nbResults'] / $nbByPage);
  45. if($type == 'json'){
  46. return $this->render('front/search/json-results.html.twig', [
  47. 'products' => $results['products'],
  48. 'page' => $page,
  49. 'nbPages' => $nbPages,
  50. 'nbResults' => $results['nbResults']
  51. ]);
  52. }
  53. return $this->render('front/search/results.html.twig', [
  54. 'query' => $q,
  55. 'page' => $page,
  56. 'nbByPage' => $nbByPage,
  57. 'nbPages' => $nbPages,
  58. 'results' => $results['products'],
  59. 'nbResults' => $results['nbResults'],
  60. 'mode' => $mode,
  61. 'discounts' => $this->getDiscountList($results['products'])
  62. ]);
  63. }
  64. /**
  65. * @Route("/{_locale}/search-js", name="json_search", requirements={"_locale":"fr|en"}, options={"utf8": true})
  66. */
  67. public function jsonSearch(Request $request, Search $search, \Doctrine\ORM\EntityManagerInterface $em)
  68. {
  69. $lang = $request->getLocale();
  70. $q = trim($request->get('q'));
  71. $output = [
  72. 'query' => $q,
  73. 'redirect' => false,
  74. 'success' => false,
  75. 'message' => ''
  76. ];
  77. // try{
  78. if($q){
  79. $reference = $em->getRepository('App:Product')->findOneByReference($q);
  80. if($reference){
  81. if(!$reference->isParent()){
  82. $reference = $reference->getParent();
  83. }
  84. $output['success'] = true;
  85. $output['redirect'] = $this->generateUrl('product',['id'=>$reference->getId(), 'url'=>$reference->getUrl()]);
  86. }else{
  87. $results = $search->searchProduct($q, $lang, 5);
  88. if($results['nbResults'] < 5){
  89. $results = $search->searchProduct($q, $lang, 5, 1, "keywords");
  90. }
  91. $categories = $search->searchCategory($q, $lang, 8);
  92. if(empty($categories['categories'])){
  93. $categories = [
  94. 'categories' => $search->getResultsCategories($results['products'])
  95. ];
  96. }
  97. $manufacturers = $search->searchManufacturer($q, $lang, 8);
  98. $output['success'] = true;
  99. $output['products'] = $results['products'];
  100. // $output['categories'] = $search->getResultsCategories($results['products']);
  101. // $output['manufacturers'] = $search->getResultsManufacturers($results['products']);
  102. $output['categories'] = $categories['categories'];
  103. $output['manufacturers'] = $manufacturers['manufacturers'];
  104. $output['html'] = $this->renderView('front/search/results-panel.html.twig',$output);
  105. }
  106. }
  107. // }
  108. // catch (\Exception $ex) {
  109. // $output['message'] = $ex->getMessage();
  110. // $output['stack'] = $ex->getTraceAsString();
  111. // }
  112. return new \Symfony\Component\HttpFoundation\JsonResponse($output);
  113. }
  114. }