<?php
namespace App\Controller\Front;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;
use App\Service\Search;
use App\Manager\StoreManager;
class SearchController extends FrontController
{
/**
* @Route("/{_locale}/search/", name="search", requirements={"_locale":"fr|en"})
*/
public function search(Request $request, Search $search, \Doctrine\ORM\EntityManagerInterface $em)
{
$page = $request->get('p',1);
$q = $request->get('q', '');
if($q == ""){
$q = $request->get('query');
}
$type = $request->isXmlHttpRequest() ? 'json' : 'html';
$nbByPage = 20;
$lang = $request->getLocale();
$mode = $request->get('mode','exact');
if(!in_array($mode, ['exact','keywords'])){
$mode = 'exact';
}
//recherche par référence
if(!empty($q)) {
$reference = $em->getRepository('App:Product')->findOneByReference($q);
if($reference){
if(!$reference->isParent()){
$reference = $reference->getParent();
}
return $this->redirectToRoute('product',['id'=>$reference->getId(), 'url'=>$reference->getUrl()]);
}
}
//recherche dans elasticsearch
$results = $search->searchProduct($q, $lang, $nbByPage, $page, $mode);
if($results['nbResults'] < 15){
$mode = "keywords";
$results = $search->searchProduct($q, $lang, $nbByPage, $page, $mode);
}
$nbPages = ceil($results['nbResults'] / $nbByPage);
if($type == 'json'){
return $this->render('front/search/json-results.html.twig', [
'products' => $results['products'],
'page' => $page,
'nbPages' => $nbPages,
'nbResults' => $results['nbResults']
]);
}
return $this->render('front/search/results.html.twig', [
'query' => $q,
'page' => $page,
'nbByPage' => $nbByPage,
'nbPages' => $nbPages,
'results' => $results['products'],
'nbResults' => $results['nbResults'],
'mode' => $mode,
'discounts' => $this->getDiscountList($results['products'])
]);
}
/**
* @Route("/{_locale}/search-js", name="json_search", requirements={"_locale":"fr|en"}, options={"utf8": true})
*/
public function jsonSearch(Request $request, Search $search, \Doctrine\ORM\EntityManagerInterface $em)
{
$lang = $request->getLocale();
$q = trim($request->get('q'));
$output = [
'query' => $q,
'redirect' => false,
'success' => false,
'message' => ''
];
// try{
if($q){
$reference = $em->getRepository('App:Product')->findOneByReference($q);
if($reference){
if(!$reference->isParent()){
$reference = $reference->getParent();
}
$output['success'] = true;
$output['redirect'] = $this->generateUrl('product',['id'=>$reference->getId(), 'url'=>$reference->getUrl()]);
}else{
$results = $search->searchProduct($q, $lang, 5);
if($results['nbResults'] < 5){
$results = $search->searchProduct($q, $lang, 5, 1, "keywords");
}
$categories = $search->searchCategory($q, $lang, 8);
if(empty($categories['categories'])){
$categories = [
'categories' => $search->getResultsCategories($results['products'])
];
}
$manufacturers = $search->searchManufacturer($q, $lang, 8);
$output['success'] = true;
$output['products'] = $results['products'];
// $output['categories'] = $search->getResultsCategories($results['products']);
// $output['manufacturers'] = $search->getResultsManufacturers($results['products']);
$output['categories'] = $categories['categories'];
$output['manufacturers'] = $manufacturers['manufacturers'];
$output['html'] = $this->renderView('front/search/results-panel.html.twig',$output);
}
}
// }
// catch (\Exception $ex) {
// $output['message'] = $ex->getMessage();
// $output['stack'] = $ex->getTraceAsString();
// }
return new \Symfony\Component\HttpFoundation\JsonResponse($output);
}
}