src/Controller/Front/SearchController.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Constant\AccommodationProperty;
  4. use App\Constant\AccommodationType;
  5. use App\Controller\AppController;
  6. use App\Entity\Page;
  7. use App\Repository\AccommodationRepository;
  8. use App\Repository\AccommodationRoomRepository;
  9. use App\Repository\PropertyListRepository;
  10. use App\Service\Notifier;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. /**
  16.  * @Route("recherche", name="front_search_")
  17.  */
  18. class SearchController extends AppController
  19. {
  20.     public $accommodationRepository;
  21.     public $roomRepository;
  22.     public $listRepository;
  23.     public function __construct(
  24.         Notifier $notifier
  25.         EntityManagerInterface $em,
  26.         AccommodationRepository $accommodationRepository,
  27.         AccommodationRoomRepository $roomRepository,
  28.         PropertyListRepository $listRepository
  29.     ) {
  30.         parent::__construct($notifier$em);
  31.         $this->accommodationRepository $accommodationRepository;
  32.         $this->roomRepository $roomRepository;
  33.         $this->listRepository $listRepository;
  34.     }
  35.     private function _getRequestFilters(Request $request) {
  36.         return [
  37.             "active" => true,
  38.             "district" => $request->query->get("district"),
  39.             "accommodationType" => $request->query->get("accommodationType"),
  40.             "lengthOfStay" => $request->query->get("lengthOfStay"),
  41.             "price" => $request->query->get("price"),
  42.             "totalBedrooms" => $request->query->get("totalBedrooms"),
  43.             "privateBathroom" => $request->query->get("privateBathroom"),
  44.             "petFriendly" => $request->query->get("petFriendly"),
  45.             "girlsOnly" => $request->query->get("girlsOnly"),
  46.             "service" => $request->query->get("service"),
  47.         ];
  48.     }
  49.     private function _filteredList(Request $request$isInitialLoad false){
  50.         $page intval($request->query->get("page"1));
  51.         $pageSize intval($request->query->get("pageSize"30));
  52.         $orderBy = [["available""DESC"]];
  53.         $filters $this->_getRequestFilters($request);
  54.         $list $this->accommodationRepository->searchAccommodations(
  55.             $filters,
  56.             ($isInitialLoad) ? $page,
  57.             ($isInitialLoad) ? ($page $pageSize) : $pageSize,
  58.             $orderBy
  59.         );
  60.         $totalCount $this->accommodationRepository->countAccommodations($filters);
  61.         $totalFreeRoomsCount $this->roomRepository->countRooms(["free" => true]);
  62.         return [
  63.             'list' => $list,
  64.             'pagination' => [
  65.                 'page' => $page,
  66.                 'pageCount' => ceil($totalCount $pageSize),
  67.                 'pageSize' => $pageSize,
  68.                 'totalCount' => $totalCount,
  69.                 'totalFreeRoomsCount' => $totalFreeRoomsCount,
  70.             ],
  71.         ];
  72.     }
  73.     /**
  74.      * @Route("/", name="index")
  75.      */
  76.     public function index(
  77.         Request $request,
  78.         PropertyListRepository $propertyListRepository
  79.     ){
  80.         // ------------------------------------------
  81.         // Get all filters lists
  82.         $disctricts $propertyListRepository->findOneBy(["slug" => "districts"]);
  83.         $filters = [
  84.             "districts" => $disctricts,
  85.             "accommodationTypes" => AccommodationType::getList(),
  86.             "services" => $this->listRepository->findOneBySlug(AccommodationProperty::SERVICES),
  87.         ];
  88.         // ------------------------------------------
  89.         // Search accommodations
  90.         $searchResult $this->_filteredList($requesttrue);
  91.         // ------------------------------------------
  92.         // Render page
  93.         $page = new Page();
  94.         $page->setMetaTitle("Citizens");
  95.         return $this->render('front/search/search.html.twig', [
  96.             'page' => $page,
  97.             'filters' => $filters,
  98.             'list' => $searchResult['list'],
  99.             'pagination' => $searchResult['pagination'],
  100.         ]);
  101.     }
  102.     /**
  103.      * @Route("/ajax", name="ajax", methods={"GET", "POST"})
  104.      */
  105.     public function ajax(Request $request)
  106.     {
  107.         $result $this->_filteredList($request);
  108.         $json = [
  109.             'header' => $this->render('front/search/search-list-header.html.twig'$result)->getContent(),
  110.             'page' => $this->render('front/search/search-list.html.twig'$result)->getContent(),
  111.             'pagination' => $result['pagination'],
  112.         ];
  113.         return new JsonResponse($json);
  114.     }
  115.     /**
  116.      * @Route("/map", name="map", methods={"GET", "POST"})
  117.      */
  118.     public function map(Request $request)
  119.     {
  120.         $filters $this->_getRequestFilters($request);
  121.         $list $this->accommodationRepository->searchAccommodations($filters11000);
  122.         $result = [];
  123.         foreach ($list as $accommodation) {
  124.             $result[] = [
  125.                 "type" => "Feature",
  126.                 "properties" => [
  127.                     "id" => $accommodation->getId(),
  128.                     "popup" => $this->render('front/search/map-popup.html.twig', ["accommodation" => $accommodation])->getContent(),
  129.                 ],
  130.                 "geometry" => [
  131.                     "type" => "Point",
  132.                     "coordinates" => [
  133.                         floatval($accommodation->getAddress()->getLongitude()),
  134.                         floatval($accommodation->getAddress()->getLatitude()),
  135.                     ],
  136.                 ]
  137.             ];
  138.         }
  139.         return new JsonResponse([
  140.             "type" => "FeatureCollection",
  141.             "features" => $result,
  142.         ]);
  143.     }
  144. }