src/Controller/Front/SearchController.php line 73

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. // déclinaison : directement sur la fiche modèle, la référence cherchée présélectionnée
  33. $productModel = $reference->getTopProductModel();
  34. if($productModel){
  35. $productModel->translate($lang);
  36. return $this->redirect($this->generateUrl('product_model', ['id'=>$productModel->getId(), 'url'=>$productModel->getUrl()]).'#p='.$reference->getId());
  37. }
  38. if(!$reference->isParent()){
  39. $reference = $reference->getParent();
  40. }
  41. return $this->redirectToRoute('product',['id'=>$reference->getId(), 'url'=>$reference->getUrl()]);
  42. }
  43. }
  44. //recherche dans elasticsearch
  45. $results = $search->searchProduct($q, $lang, $nbByPage, $page, $mode);
  46. if($results['nbResults'] < 15){
  47. $mode = "keywords";
  48. $results = $search->searchProduct($q, $lang, $nbByPage, $page, $mode);
  49. }
  50. $nbPages = ceil($results['nbResults'] / $nbByPage);
  51. if($type == 'json'){
  52. return $this->render('front/search/json-results.html.twig', [
  53. 'products' => $results['products'],
  54. 'page' => $page,
  55. 'nbPages' => $nbPages,
  56. 'nbResults' => $results['nbResults']
  57. ]);
  58. }
  59. return $this->render('front/search/results.html.twig', [
  60. 'query' => $q,
  61. 'page' => $page,
  62. 'nbByPage' => $nbByPage,
  63. 'nbPages' => $nbPages,
  64. 'results' => $results['products'],
  65. 'nbResults' => $results['nbResults'],
  66. 'mode' => $mode,
  67. 'discounts' => $this->getDiscountList($results['products'])
  68. ]);
  69. }
  70. /**
  71. * @Route("/{_locale}/search-js", name="json_search", requirements={"_locale":"fr|en"}, options={"utf8": true})
  72. */
  73. public function jsonSearch(Request $request, Search $search, \Doctrine\ORM\EntityManagerInterface $em)
  74. {
  75. $lang = $request->getLocale();
  76. $q = trim($request->get('q'));
  77. $output = [
  78. 'query' => $q,
  79. 'redirect' => false,
  80. 'success' => false,
  81. 'message' => ''
  82. ];
  83. // try{
  84. if($q){
  85. $reference = $em->getRepository('App:Product')->findOneByReference($q);
  86. if($reference){
  87. $output['success'] = true;
  88. $productModel = $reference->getTopProductModel();
  89. if($productModel){
  90. $productModel->translate($lang);
  91. $output['redirect'] = $this->generateUrl('product_model', ['id'=>$productModel->getId(), 'url'=>$productModel->getUrl()]).'#p='.$reference->getId();
  92. }else{
  93. if(!$reference->isParent()){
  94. $reference = $reference->getParent();
  95. }
  96. $output['redirect'] = $this->generateUrl('product',['id'=>$reference->getId(), 'url'=>$reference->getUrl()]);
  97. }
  98. }else{
  99. $results = $search->searchProduct($q, $lang, 5);
  100. if($results['nbResults'] < 5){
  101. $results = $search->searchProduct($q, $lang, 5, 1, "keywords");
  102. }
  103. $categories = $search->searchCategory($q, $lang, 8);
  104. if(empty($categories['categories'])){
  105. $categories = [
  106. 'categories' => $search->getResultsCategories($results['products'])
  107. ];
  108. }
  109. $manufacturers = $search->searchManufacturer($q, $lang, 8);
  110. $output['success'] = true;
  111. $output['products'] = $results['products'];
  112. $output['categories'] = $categories['categories'];
  113. $output['manufacturers'] = $manufacturers['manufacturers'];
  114. $output['html'] = $this->renderView('front/search/results-panel.html.twig',$output);
  115. }
  116. }
  117. // }
  118. // catch (\Exception $ex) {
  119. // $output['message'] = $ex->getMessage();
  120. // $output['stack'] = $ex->getTraceAsString();
  121. // }
  122. return new \Symfony\Component\HttpFoundation\JsonResponse($output);
  123. }
  124. }