<?php
namespace App\Controller\Front;
use App\Constant\AccommodationProperty;
use App\Constant\AccommodationType;
use App\Controller\AppController;
use App\Entity\Page;
use App\Repository\AccommodationRepository;
use App\Repository\AccommodationRoomRepository;
use App\Repository\PropertyListRepository;
use App\Service\Notifier;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("recherche", name="front_search_")
*/
class SearchController extends AppController
{
public $accommodationRepository;
public $roomRepository;
public $listRepository;
public function __construct(
Notifier $notifier,
EntityManagerInterface $em,
AccommodationRepository $accommodationRepository,
AccommodationRoomRepository $roomRepository,
PropertyListRepository $listRepository
) {
parent::__construct($notifier, $em);
$this->accommodationRepository = $accommodationRepository;
$this->roomRepository = $roomRepository;
$this->listRepository = $listRepository;
}
private function _getRequestFilters(Request $request) {
return [
"active" => true,
"district" => $request->query->get("district"),
"accommodationType" => $request->query->get("accommodationType"),
"lengthOfStay" => $request->query->get("lengthOfStay"),
"price" => $request->query->get("price"),
"totalBedrooms" => $request->query->get("totalBedrooms"),
"privateBathroom" => $request->query->get("privateBathroom"),
"petFriendly" => $request->query->get("petFriendly"),
"girlsOnly" => $request->query->get("girlsOnly"),
"service" => $request->query->get("service"),
];
}
private function _filteredList(Request $request, $isInitialLoad = false){
$page = intval($request->query->get("page", 1));
$pageSize = intval($request->query->get("pageSize", 30));
$orderBy = [["available", "DESC"]];
$filters = $this->_getRequestFilters($request);
$list = $this->accommodationRepository->searchAccommodations(
$filters,
($isInitialLoad) ? 1 : $page,
($isInitialLoad) ? ($page * $pageSize) : $pageSize,
$orderBy
);
$totalCount = $this->accommodationRepository->countAccommodations($filters);
$totalFreeRoomsCount = $this->roomRepository->countRooms(["free" => true]);
return [
'list' => $list,
'pagination' => [
'page' => $page,
'pageCount' => ceil($totalCount / $pageSize),
'pageSize' => $pageSize,
'totalCount' => $totalCount,
'totalFreeRoomsCount' => $totalFreeRoomsCount,
],
];
}
/**
* @Route("/", name="index")
*/
public function index(
Request $request,
PropertyListRepository $propertyListRepository
){
// ------------------------------------------
// Get all filters lists
$disctricts = $propertyListRepository->findOneBy(["slug" => "districts"]);
$filters = [
"districts" => $disctricts,
"accommodationTypes" => AccommodationType::getList(),
"services" => $this->listRepository->findOneBySlug(AccommodationProperty::SERVICES),
];
// ------------------------------------------
// Search accommodations
$searchResult = $this->_filteredList($request, true);
// ------------------------------------------
// Render page
$page = new Page();
$page->setMetaTitle("Citizens");
return $this->render('front/search/search.html.twig', [
'page' => $page,
'filters' => $filters,
'list' => $searchResult['list'],
'pagination' => $searchResult['pagination'],
]);
}
/**
* @Route("/ajax", name="ajax", methods={"GET", "POST"})
*/
public function ajax(Request $request)
{
$result = $this->_filteredList($request);
$json = [
'header' => $this->render('front/search/search-list-header.html.twig', $result)->getContent(),
'page' => $this->render('front/search/search-list.html.twig', $result)->getContent(),
'pagination' => $result['pagination'],
];
return new JsonResponse($json);
}
/**
* @Route("/map", name="map", methods={"GET", "POST"})
*/
public function map(Request $request)
{
$filters = $this->_getRequestFilters($request);
$list = $this->accommodationRepository->searchAccommodations($filters, 1, 1000);
$result = [];
foreach ($list as $accommodation) {
$result[] = [
"type" => "Feature",
"properties" => [
"id" => $accommodation->getId(),
"popup" => $this->render('front/search/map-popup.html.twig', ["accommodation" => $accommodation])->getContent(),
],
"geometry" => [
"type" => "Point",
"coordinates" => [
floatval($accommodation->getAddress()->getLongitude()),
floatval($accommodation->getAddress()->getLatitude()),
],
]
];
}
return new JsonResponse([
"type" => "FeatureCollection",
"features" => $result,
]);
}
}