<?php
namespace App\Controller;
use App\Entity\Hotel;
use App\Form\CombinedSearchType;
use App\Form\HotelfilterType;
use App\Form\SearchHotelType;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class TestfilterController extends AbstractController
{
/**
* @Route("/hotel", name="app_testfilter")
*/
public function index(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator): Response
{
// $results = [];
// $form = $this->createForm(SearchHotelType::class);
// $form->handleRequest($request);
// $em = $this->getDoctrine()->getManager();
// $data = $em->createQueryBuilder()
// ->select('c')
// ->from('App\Entity\Hotel','c')
// ->where('c.etat = 1')
// ->getQuery()
// ->getResult()
// ;
// // Création de la requête de base
// $qb = $em->createQueryBuilder()
// ->select('h')
// ->from('App\Entity\Hotel', 'h')
// ->join('h.hotelrooms', 'hr')
// ->join('h.services', 'hs')
// ->join('h.ville', 'v')
// ->join('h.hotelprices', 'hp')
// ->join('hr.chambre', 'c')
// ->join('hr.pricerooms', 'pr')
// ->join('h.hotelarrangements', 'ha')
// ->join('ha.arrangement', 'a')
// ->join('ha.pricearrangements', 'pa')
// ->where('h.etat = 1')
// ->groupBy('h.id');
// // Traitement du formulaire
// if ($form->isSubmitted() && $form->isValid()) {
// $data = $form->getData();
// $buttonClicked = $request->request->get('name');
// $formData = $form->getData();
// // Récupération des valeurs du champ "star" du formulaire
// $stars = $form->get('star')->getData();
// if (!empty($stars)) {
// $qb->andWhere('h.star IN (:stars)')
// ->setParameter('stars', $stars);
// }
// // Récupération des valeurs du champ "service" du formulaire
// $services = $form->get('service')->getData();
// if ($services->count() > 0) {
// $serviceIds = [];
// foreach ($services as $service) {
// $serviceIds[] = $service->getId();
// }
// $qb->andWhere('hs.id IN (:serviceIds)')
// ->setParameter('serviceIds', $serviceIds);
// }
// // Récupération des valeurs du champ "chambre" du formulaire
// $chambres = $form->get('chambre')->getData();
// if ($chambres->count() > 0) {
// $chambreIds = [];
// foreach ($chambres as $chambre) {
// $chambreIds[] = $chambre->getId();
// }
// $qb->andWhere('c.id IN (:chambreIds)')
// ->setParameter('chambreIds', $chambreIds);
// }
// // Récupération des valeurs du champ "chambre" du formulaire
// $arrangements = $form->get('arrangement')->getData();
// if ($arrangements->count() > 0) {
// $arrangementsIds = [];
// foreach ($arrangements as $arrangement) {
// $arrangementsIds[] = $arrangement->getId();
// }
// $qb->andWhere('a.id IN (:arrangementsIds)')
// ->setParameter('arrangementsIds', $arrangementsIds);
// }
// // Récupération des valeurs des champs "min" et "max"
// $minPrice = $form->get('min')->getData();
// $maxPrice = $form->get('max')->getData();
// // Ajout d'une condition à la requête pour filtrer la somme des prix dans les relations
// if (!empty($minPrice) && !empty($maxPrice)) {
// $qb->andWhere('(pr.price + pa.price) >= :minPrice')
// ->andWhere('(pr.price + pa.price) <= :maxPrice')
// ->setParameter('minPrice', $minPrice)
// ->setParameter('maxPrice', $maxPrice);
// }
// // Récupération des valeurs des champs "min" et "max"
// $dated = $form->get('dated')->getData();
// $datef = $form->get('datef')->getData();
// // Ajout d'une condition à la requête pour filtrer la somme des prix dans les relations
// if (!empty($dated) && !empty($datef)) {
// $qb->andWhere('hp.dated <= :dated')
// ->andWhere('hp.datef >= :datef')
// ->setParameter('dated', $dated)
// ->setParameter('datef', $datef);
// }
// $buttonClicked = $request->request->get('clickedButton');
// // Si le bouton "Rechercher par ville" a été cliqué
// if ($buttonClicked === 'ville') {
// // Ajoutez la condition pour la recherche par ville
// $ville = $form->get('ville')->getData();
// if (!empty($ville)) {
// $qb->andWhere('v.name = :ville')->setParameter('ville', $ville);
// }
// }
// foreach ($qb as $hotel) {
// // Logique pour chaque hôtel trouvé
// $results[] = [
// 'hotel' => $hotel,
// // Autres informations que vous souhaitez afficher
// ];
// }
// }
// // Exécution de la requête et récupération des résultats
// $hotel = $qb->getQuery()->getResult();
// // Rendu du template avec les résultats de la requête et le formulaire
// return $this->render('testfilter/index.html.twig', [
// 'form' => $form->createView(),
// 'hotel' => $hotel,
// 'results' => $results,
// 'data' => $data
// ]);
$form = $this->createForm(SearchHotelType::class);
$form->handleRequest($request);
$qb = $em->createQueryBuilder()
->select('h')
->from('App\Entity\Hotel', 'h')
//->join('h.hotelrooms', 'hr')
;
// Traitement du formulaire
if ($form->isSubmitted() && $form->isValid()) {
// Récupération des données du formulaire
$data = $form->getData();
// Récupération des valeurs du champ "star" du formulaire
$stars = $form->get('star')->getData();
if (!empty($stars)) {
$qb->andWhere('h.star IN (:stars)')
->setParameter('stars', $stars);
}
// Récupération des valeurs du champ "service" du formulaire
$services = $form->get('service')->getData();
if ($services->count() > 0) {
$serviceIds = [];
foreach ($services as $service) {
$serviceIds[] = $service->getId();
}
$qb->join('h.services', 'hs')
->andWhere('hs.id IN (:serviceIds)')
->setParameter('serviceIds', $serviceIds);
}
// Récupération des valeurs du champ "chambre" du formulaire
$chambres = $form->get('chambre')->getData();
if ($chambres->count() > 0) {
$chambreIds = [];
foreach ($chambres as $chambre) {
$chambreIds[] = $chambre->getId();
}
$qb->join('h.hotelrooms', 'hr') // Définition de l'alias hr pour la relation HotelRoom
->join('hr.chambre', 'c') // Utilisation de l'alias hr dans la jointure pour la relation Chambre
->andWhere('c.id IN (:chambreIds)')
->setParameter('chambreIds', $chambreIds);
}
// Récupération des valeurs du champ "arrangement" du formulaire
$arrangements = $form->get('arrangement')->getData();
if ($arrangements->count() > 0) {
$arrangementIds = [];
foreach ($arrangements as $arrangement) {
$arrangementIds[] = $arrangement->getId();
}
$qb->join('h.hotelarrangements', 'ha')
->join('ha.arrangement', 'a')
->andWhere('a.id IN (:arrangementIds)')
->setParameter('arrangementIds', $arrangementIds);
}
// Récupération des valeurs des champs "min" et "max" pour filtrer les prix
$minPrice = $form->get('min')->getData();
$maxPrice = $form->get('max')->getData();
if (!empty($minPrice) && !empty($maxPrice)) {
$qb->join('h.hotelrooms', 'hr')
->join('hr.pricerooms', 'pr')
->join('ha.pricearrangements', 'pa')
->andWhere('(pr.price + pa.price) >= :minPrice')
->andWhere('(pr.price + pa.price) <= :maxPrice')
->setParameter('minPrice', $minPrice)
->setParameter('maxPrice', $maxPrice);
}
// Récupération des valeurs des champs "dated" et "datef"
$dated = $form->get('dated')->getData();
$datef = $form->get('datef')->getData();
// Ajout d'une condition à la requête pour filtrer les dates dans les relations
if (!empty($dated) && !empty($datef)) {
$qb->join('h.hotelprices', 'hp')
->andWhere('hp.dated <= :dated')
->andWhere('hp.datef >= :datef')
->setParameter('dated', $dated)
->setParameter('datef', $datef);
}
// Si le bouton "Rechercher par ville" a été cliqué
$buttonClicked = $request->request->get('clickedButton');
if ($buttonClicked === 'ville') {
// Ajoutez la condition pour la recherche par ville
$ville = $form->get('ville')->getData();
if (!empty($ville)) {
$qb->join('h.ville', 'v')
->andWhere('v.name = :ville')
->setParameter('ville', $ville);
}
}
}
// Exécution de la requête pour obtenir les résultats
$query = $qb->getQuery();
// Paginer les résultats
$pagination = $paginator->paginate(
$query, // Requête à paginer
$request->query->getInt('page', 1), // Numéro de page par défaut
5 // Nombre d'éléments par page
);
return $this->render('testfilter/index.html.twig', [
'form' => $form->createView(),
'hotels' => $pagination,
]);
}
}