src/Controller/DestinationController.php line 107

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. use Liip\ImagineBundle\Imagine\Cache\CacheManager;
  12. use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. use App\Utils\IresaManager;
  15. use App\Utils\Residences;
  16. use App\Services\ToolService;
  17. use App\Services\SeasonService;
  18. use App\Services\ImhotepHebergementService;
  19. use App\Services\SlugRouterService;
  20. use App\Entity\Typologie;
  21. use App\Entity\Residence;
  22. use App\Entity\mediaResidence;
  23. use App\Entity\Language;
  24. use App\Entity\Destination;
  25. /**
  26.  * @Route("/{_locale}", requirements={"_locale": "en|fr"})
  27.  */
  28. class DestinationController extends AbstractController
  29. {
  30.     private $em;
  31.     private $session;
  32.     private $flashbag;
  33.     private $user;
  34.     private $seasonService;
  35.     private $iresaManager;
  36.     private $toolService;
  37.     private $helper;
  38.     private $cacheManager;
  39.     private $translator;
  40.     private $residenceService;
  41.     private $imhotepService;
  42.     private $slugRouterService;
  43.     function __construct(EntityManagerInterface $em,  SessionInterface $sessionSeasonService $seasonServiceIresaManager $iresaManagerToolService $toolServiceUploaderHelper $helperCacheManager $cacheManagerTranslatorInterface $translatorResidences $residenceServiceImhotepHebergementService $imhotepServiceSlugRouterService $slugRouterService) {
  44.         $this->em $em;
  45.         $this->session $session;
  46.         $this->flashbag $this->session->getFlashBag();
  47.         $this->seasonService $seasonService;
  48.         $this->iresaManager $iresaManager;
  49.         $this->toolService $toolService;
  50.         $this->helper $helper;
  51.         $this->cacheManager $cacheManager;
  52.         $this->translator $translator;
  53.         $this->residenceService $residenceService;
  54.         $this->imhotepService $imhotepService;
  55.         $this->slugRouterService $slugRouterService;
  56.     }
  57.     
  58.     /**
  59.      * Route de compatibilité - Ancienne structure avec ID
  60.      * Redirige 301 vers la nouvelle structure sans ID
  61.      * @Route("/destination/{slug}/{id}", name="ac_platform_destination", requirements={"id"="\d+"})
  62.      */
  63.     public function destinationLegacyRedirect(Request $requeststring $slugint $id): Response
  64.     {
  65.         // Charger la destination par ID pour récupérer son slug canonique
  66.         $locale $request->getLocale();
  67.         $lang $this->em->getRepository(Language::class)->findOneByCode($locale);
  68.         
  69.         $destination $this->em->getRepository(Destination::class)->findOneByLang([
  70.             'lang_id' => $lang->getId(),
  71.             'code_traduction' => $id
  72.         ]);
  73.         
  74.         if (!$destination) {
  75.             throw $this->createNotFoundException('Destination inexistante');
  76.         }
  77.         
  78.         // Redirection 301 permanente vers la nouvelle structure avec slug canonique
  79.         $canonicalSlug $destination->getCanonical();
  80.         if (empty($canonicalSlug)) {
  81.             // Fallback sur le slug historique si pas de canonical
  82.             $canonicalSlug $destination->getSlug() ?: $slug;
  83.         }
  84.         
  85.         // Préserver les query parameters
  86.         $queryParams $request->query->all();
  87.         
  88.         return $this->redirectToRoute('ac_platform_destination_slug'
  89.             array_merge(['slug' => $canonicalSlug], $queryParams), 
  90.             301
  91.         );
  92.     }
  93.     /**
  94.      * Route principale - Nouvelle structure avec slug uniquement
  95.      * @Route("/destination/{slug}", name="ac_platform_destination_slug")
  96.      */
  97.     public function destinationActionRequest(Request $requeststring $slug): Response
  98.     {
  99.         $locale $request->getLocale();
  100.         
  101.         // Résoudre le slug vers une destination
  102.         $result $this->slugRouterService->resolveDestinationSlug($slug$locale);
  103.         
  104.         if (!$result) {
  105.             throw $this->createNotFoundException('Destination non trouvée');
  106.         }
  107.         
  108.         // Vérifier si on doit rediriger vers le slug canonique
  109.         if (!$result['is_canonical'] && !empty($result['canonical_slug'])) {
  110.             // Préserver les query parameters
  111.             $queryParams $request->query->all();
  112.             
  113.             return $this->redirectToRoute('ac_platform_destination_slug'
  114.                 array_merge(['slug' => $result['canonical_slug']], $queryParams), 
  115.                 301
  116.             );
  117.         }
  118.         
  119.         $destination $result['entity'];
  120.         $id $destination->getCodeTraduction(); // Récupérer l'ID depuis l'entité 
  121.         if ($id == 0) { 
  122.             $id 2// Défaut => France
  123.         }
  124.         
  125.         $locale $request->getLocale();
  126.         $lang $this->em->getRepository(Language::class)->findOneByCode($locale);
  127.         // Récupération des paramètres de recherche
  128.         $datearrivee $request->query->get('datearrivee''');
  129.         $dureeRequest $request->query->get('duree');
  130.         $nbpax $request->query->get('nbpax');
  131.         $nbadultes $request->query->get('nbadultes');
  132.         $nbenfants $request->query->get('nbenfants');
  133.         $search $request->query->get('search');
  134.         // Liste des durées par défaut
  135.         $listDurees = !empty($dureeRequest) ? [$dureeRequest] : [714215432];
  136.         
  137.         // Recherche optimisée avec IresaManager
  138.         $availabilityResult $this->iresaManager->findBestAvailability($id$datearrivee$listDurees);
  139.         
  140.         if ($availabilityResult === false) {
  141.             //$code = $this->translator->trans('erreur.erreurs.100', [], 'app');
  142.             //return $this->redirect($this->generateUrl('ac_platform_error', ['code' => $code]));
  143.             throw $this->createNotFoundException('Destination non trouvée');
  144.         }
  145.         $result $availabilityResult['result'];
  146.         $duree $availabilityResult['duree'];
  147.         $queryParams $availabilityResult['query_params'];
  148.         $hebergements $result["FichesLieuHebergement"];
  149.         $reponses $result["ListReponses"];
  150.         $prestations $result["FichesPrestation"];
  151.         // Comptage et validation des hébergements
  152.         $countheb 0;
  153.         $hebergement null;
  154.         foreach ($hebergements as $heb) {
  155.             if (!empty($heb["ListFiches"])) {
  156.                 $countheb++;
  157.                 $hebergement $heb;
  158.             }
  159.         }
  160.        
  161.         if ($countheb == 0) {
  162.             $code $this->translator->trans('erreur.erreurs.101', [], 'app');
  163.             //return $this->redirect($this->generateUrl('ac_platform_error', ['code' => $code]));
  164.             //throw $this->createNotFoundException('Destination non trouvée');
  165.             // Pas d'hébergement trouvé, on affiche la page avec message adapté
  166.         }
  167.         // Construction des données pour la vue
  168.         //$listeHebergements = $this->iresaManager->buildAccommodationsList($hebergements);
  169.         // Titre et description
  170.         $titre $search 
  171.             $this->translator->trans('themes.noResult.titre', [], 'app') : 
  172.             $destination->getTitreLong();
  173.         $description $search 
  174.             $this->translator->trans('themes.noResult.description', [], 'app') : 
  175.             $destination->getIntroduction();
  176.         // Traitement des fiches avec le service existant
  177.         $this->residenceService->setLocale($locale);
  178.         $fiches $this->residenceService->getSejours($hebergements$reponses$lang$nbpax);
  179.         // Photos de profil
  180.         $photoProfil = [];
  181.         foreach ($fiches as $k => $fiche) {
  182.             $residence $fiche['residence'];
  183.             
  184.             if ($residence instanceof Residence) {
  185.                 $season $this->seasonService->getSeason();
  186.                 $slider $this->em->getRepository(mediaResidence::class)->findOneByLocation(
  187.                     $residence->getId(), 
  188.                     "content"
  189.                     $lang
  190.                     $season
  191.                 );
  192.                 if ($slider instanceof mediaResidence) {
  193.                     $image_path $this->helper->asset($slider'imageFile');
  194.                     $image_link $this->cacheManager->getBrowserPath($image_path'offre');
  195.                     $photoProfil[$k] = $image_link;
  196.                 }
  197.             }
  198.         }
  199.         $aff_date $request->query->get('aff_date'false);
  200.         
  201.         $vars = [
  202.             "page" => "destination",
  203.             "id" => $id,
  204.             "mod" => "destination",
  205.             "hebergements" => $hebergements,
  206.             "searchBloc" => true,
  207.             "aff_date" => $aff_date,
  208.             "datearrivee" => $datearrivee,
  209.             "duree" => $duree,
  210.             "nbadultes" => $nbadultes,
  211.             "nbenfants" => $nbenfants,
  212.             'nbpax' => $nbpax,
  213.             'titre' => $titre,
  214.             'description' => $description,
  215.             "reponses" => $fiches,
  216.             "photoProfil" => $photoProfil,
  217.             "metaTitle" => $destination->getMetaTitle(),
  218.             "metaDescription" => $destination->getMetaDescription(),
  219.             "seoTitle" => $destination->getSeoTitle(),
  220.             "seoContent" => $destination->getSeoContent(),
  221.             "countheb" => $countheb,
  222.             //"listeHebergements" => $listeHebergements,
  223.             "current_entity" => $destination,  // Pour le menu de changement de langue
  224.             "current_entity_type" => 'Destination'  // Type d'entité pour le menu
  225.         ];
  226.         return $this->render('/front/Recherche/destination.html.twig'$vars);
  227.     }
  228.     
  229.     /**
  230.      * Récupère les hébergements d’un lieu et de sa descendance.
  231.      *
  232.      * @Route("/infos/hebergements/{idLieu}", name="hebergements_lieu")
  233.      */
  234.     public function hebergements_lieu(int $idLieuRequest $request): JsonResponse
  235.     {
  236.         // Paramètre optionnel ?view=all pour afficher toutes les résidences
  237.         $view $request->query->get('view''');
  238.         $destination $this->em->getRepository(Destination::class)->findOneBy(['idIresa' => $idLieu]);
  239.         // Récupération des résidences à partir du service Imhotep
  240.         $residences $this->imhotepService->getHebergementsByLieu($idLieu);
  241.         $hebergements = [];
  242.         foreach ($residences as $residence) {
  243.             // Recherche du parent direct (Destination) via le champ destinationIdiresa
  244.             $destinationParent $this->em->getRepository(Destination::class)->findOneBy(['idIresa' => $residence->getDestinationIdiresa()]);
  245.             // Construction dynamique du chemin
  246.             $cheminParts = [];
  247.             $courante $destinationParent;
  248.             while ($courante !== null) {
  249.                 // On utilise TitreCourt, mais vous pouvez choisir TitreLong selon vos besoins
  250.                 $cheminParts[] = $courante->getTitreCourt();
  251.                 $cheminInfos[] = [
  252.                     'id' => (int) $courante->getId(),
  253.                     'idiresa' => (int) $courante->getIdIresa(),
  254.                     'nom' => (string) $courante->getTitreCourt(),
  255.                     'etat' => (bool) $courante->getEtat(),
  256.                 ];
  257.                 $courante $courante->getParent();
  258.             }
  259.             // On inverse pour avoir la racine en premier (France / …)
  260.             $chemin implode(' / 'array_reverse($cheminParts));
  261.             $hebergements[] = [
  262.                 'id'                => (int) $residence->getId(),
  263.                 'idiresa'           => (int) $residence->getIdiresa(),
  264.                 'chemin'            => (string) $chemin,
  265.                 // 'cheminInfos'       => (array) $cheminInfos,
  266.                 //'commercialisation' => (bool) $residence->getCommercialisation(),
  267.                 'hebergement_nom'   => $residence->getNom(),
  268.                 'lieu_id'           => $destinationParent? (int) $destinationParent->getId() : null,
  269.                 'lieu_idiresa'      => $destinationParent? (int) $destinationParent->getIdIresa() : null,
  270.                 'lieu_nom'          => $destinationParent? (string) $destinationParent->getTitreCourt() : null,
  271.                 //'lieu_etat'         => $destinationParent? (bool) $destinationParent->getEtat() : null,
  272.             ];
  273.         }
  274.         // Construction du retour JSON
  275.         $response = [
  276.             'destination'  => [
  277.                 'id' => (int) $destination$destination->getId() : null,
  278.                 'idiresa' => (int) $idLieu,
  279.                 'nom' => $destination? (string) $destination->getTitreCourt() : null,
  280.             ],
  281.             'hebergements' => $hebergements,
  282.         ];
  283.         return new JsonResponse($response);
  284.     }
  285. }