src/Controller/Front/SearchController.php line 94

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