src/Controller/DefaultController.php line 76

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Symfony\Component\Yaml\Yaml;
  10. use Symfony\Component\Yaml\Exception\ParseException;
  11. use Symfony\Component\Yaml\Exception;
  12. use Twig\Environment;
  13. use Liip\ImagineBundle\Imagine\Cache\CacheManager;
  14. use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. use App\Entity\Residence;
  17. use App\Entity\Typologie;
  18. use App\Entity\Promo;
  19. use App\Entity\VenteFlash;
  20. use App\Entity\mediaResidence;
  21. use App\Entity\blog;
  22. use App\Entity\slider;
  23. use App\Entity\Language;
  24. use App\Entity\miseenavant;
  25. use App\Entity\Theme;
  26. use App\Entity\InscritNewsletter;
  27. use App\Utils\IresaManager;
  28. use App\Services\SeasonService;
  29. use App\Services\ToolService;
  30. use App\Services\SlugRouterService;
  31. use App\Services\SlugService;
  32. use App\Form\InscritNewsletterType;
  33. /**
  34.  * @Route("/{_locale}", requirements={"_locale": "en|fr"})
  35.  */
  36. class DefaultController extends AbstractController
  37. {
  38.     /**
  39.      * @var EntityManagerInterface
  40.      */
  41.     private $em;
  42.     private $seasonService;
  43.     private $iresaManager;
  44.     private $toolService;
  45.     private $uploadHelper;
  46.     private $cacheManager;
  47.     private $translator;
  48.     private $twig;
  49.     private $slugRouterService;
  50.     public function __construct(EntityManagerInterface $emSeasonService $seasonServiceIresaManager $iresaManagerToolService $toolServiceUploaderHelper $uploadHelperCacheManager $cacheManagerTranslatorInterface $translatorEnvironment $twigSlugRouterService $slugRouterService)
  51.     {
  52.         $this->em $em;
  53.         $this->seasonService $seasonService;
  54.         $this->iresaManager $iresaManager;
  55.         $this->toolService $toolService;
  56.         $this->uploadHelper $uploadHelper;
  57.         $this->cacheManager $cacheManager;
  58.         $this->translator $translator;
  59.         $this->twig $twig;
  60.         $this->slugRouterService $slugRouterService;
  61.     }
  62.     /**
  63.      * @Route("/", name="ac_platform_homepage")
  64.      */
  65.     public function index(Request $request)
  66.     {
  67.         $session $request->getSession();
  68.         $locale $request->getLocale();
  69.         $lang  $this->em->getRepository(Language::class)->findOneByCode($locale);
  70.         
  71.         if($request->query->has('_locale')) {
  72.             return $this->redirect($this->generateUrl('ac_platform_homepage', ['_locale' => $request->query->get('_locale')]));
  73.         }
  74.            
  75.         $session->remove('next');
  76.         $session->remove('nextan');
  77.         $MiseEnAvantMajeur $this->em->getRepository(blog::class)->getHome($lang);
  78.         $MisesEnAvantMineur $this->em->getRepository(miseenavant::class)->getHome($lang);
  79.         $slider $this->em->getRepository(slider::class)->getHome($lang);
  80.         $repository $this->em->getRepository(Promo::class);
  81.         $promos $repository->getBonsPlansDuMoment();
  82.         $photoProfil = [];
  83.         foreach($promos as $promo) {
  84.             $residence $this->em->getRepository(Residence::class)->findOneByIdiresa($promo->getIdLieuHebergement());
  85.             
  86.             if($residence instanceof residence) {
  87.                 $season $this->seasonService->getSeason();
  88.                 $mediaResidence $this->em->getRepository(mediaResidence::class)->findOneByLocation($residence->getId(), "content"$lang$season);
  89.                 if($mediaResidence instanceof mediaResidence) {
  90.                     $image_path $this->uploadHelper->asset($mediaResidence'imageFile');
  91.                     $image_link $this->cacheManager->getBrowserPath($image_path'offre');
  92.                     $photoProfil[$promo->getId()] = $image_link;
  93.                 }
  94.             }
  95.         }
  96.         
  97.         $vars = array(
  98.             "page_code" => "home",
  99.             "searchBloc" => true,
  100.             "mod" => "promo",
  101.             "MiseEnAvantMajeur" => $MiseEnAvantMajeur,
  102.             "MisesEnAvantMineur" => $MisesEnAvantMineur,
  103.             "slider" => $slider,
  104.             "promos" => $promos,
  105.             "photoProfil" => $photoProfil
  106.         );
  107.         
  108.         return $this->render('/front/Default/index.html.twig'$vars);
  109.     }
  110.     /**
  111.      * @Route("/dest/e/{code}", name="ac_platform_error")
  112.      */
  113.     public function error(Request $request$code)
  114.     {
  115.         $locale $request->getLocale();
  116.         $lang  $this->em->getRepository(Language::class)->findOneByCode($locale);
  117.         
  118.         if($request->query->has('_locale')) {
  119.             return $this->redirect($this->generateUrl('ac_platform_homepage', ['_locale' => $request->query->get('_locale')]));
  120.         }
  121.     
  122.         $code_id $this->translator->trans('erreur.' $code,  [], 'app');
  123.         switch($code_id) {
  124.             case 100// erreur 100 / moteur de recherche / Pas d'hébergement trouvé
  125.                 $title "Ouups ! Petit problème...";
  126.                 $message "Nous n'avons trouvé aucune destination avec vos paramètres de recherche";
  127.             break;
  128.             case 101// erreur 101 / moteur de recherche / Pas de destination trouvée
  129.                 $title "Ouups ! Petit problème...";
  130.                 $message "Aucun séjour ne correspond à vos souhaits. <br/>Nous vous invitons à renouveler votre recherche avec des dates différentes.";
  131.             break;
  132.             case 102// erreur_102 / moteur de recherche / destination inconnue
  133.                 $title "Ouups ! Petit problème...";
  134.                 $message "Cette destination n'existe pas";
  135.             break;
  136.             case 200// erreur 200 / Hebergement remonté mais pas de tarif
  137.                 $title "Ouups ! Petit problème...";
  138.                 $message "Il y a eu un problème technique  avec cette réservation, merci de nous contacter au 04 82 98 36 42";
  139.             break;
  140.         }
  141.         $repository $this->em->getRepository(Promo::class);
  142.         $promos $repository->getBonsPlansDuMoment();
  143.         $vars = array(
  144.             "searchBloc" => true,
  145.             "title" =>  $title,
  146.             "message" => $message,
  147.         );
  148.         
  149.         return $this->render('/front/Default/error.html.twig'$vars);
  150.     }
  151.     
  152.     /**
  153.      * @Route("/themes", name="ac_platform_themes")
  154.      */
  155.     public function themes(Request $request)
  156.     {
  157.         $locale $request->getLocale();
  158.         $lang  $this->em->getRepository(Language::class)->findOneByCode($locale);
  159.         $criteria = [
  160.             'lang' => $lang
  161.             'etat' => true
  162.         ];
  163.         $orderBy = ['ordre' => 'ASC'];
  164.         $themes  $this->em->getRepository(Theme::class)->findBy($criteria$orderBy);
  165.         $themesWithUrls = [];
  166.         foreach ($themes as $theme) {
  167.             $themesWithUrls[] = [
  168.                 'entity' => $theme,
  169.                 'url' => $this->slugRouterService->generateCanonicalUrl($theme'ac_platform_theme_slug', ['_locale' => $locale])
  170.             ];
  171.         }
  172.         $vars = [
  173.             'themes' => $themesWithUrls
  174.         ];
  175.         return $this->render('/front/Moteur/themes.html.twig'$vars);
  176.     }
  177.     public function chglng(Request $request)
  178.     {
  179.         $lng strtolower($request->request->get("lng"));
  180.         $uri =  $request->request->get("uri");
  181.         $uri str_replace("/".$request->getLocale()."/""/".$lng."/"$uri);
  182.         return new JsonResponse($uri);
  183.     }
  184.     /**
  185.      * @Route("/inscription-newsletter", name="ac_platform_inscriptionnewsletter")
  186.      */
  187.     public function newsletter(Request $request)
  188.     {
  189.         $inscritNewsletter = new InscritNewsletter();
  190.         $form $this->createForm(InscritNewsletterType::class, $inscritNewsletter);
  191.        
  192.         if ($request->isXmlHttpRequest()) {
  193.             // La requête est une requête Ajax
  194.             $email $request->request->get('email');
  195.             if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  196.                 $retour 'ko';
  197.                 return new JsonResponse($retour);
  198.             }
  199.             
  200.             $newsletter $this->em->getRepository(InscritNewsletter::class)->findOneByEmail($email);
  201.             if(!$newsletter instanceof InscritNewsletter) {
  202.                 $newsletter = new InscritNewsletter();
  203.                 $newsletter->setEmail($email);
  204.                 $newsletter->setEtat(1);
  205.                 $this->em->persist($newsletter);
  206.                 $this->em->flush();
  207.                 $retour 'ok';
  208.                 
  209.             } else {
  210.                 $retour 'email_exists';
  211.             }
  212.         
  213.             return new JsonResponse($retour);
  214.         }
  215.         return $this->render('/front/Default/newsletter.html.twig', array(
  216.             'form'=>$form->createView()
  217.         ));
  218.     }
  219.     public function familles(Request $request) {
  220.         $moteur $this->iresaManager->getDataMoteur();
  221.         $familles $moteur->ListFamillesLieuHebergement;
  222.         $retour = array(
  223.             "familles" => $familles
  224.         );
  225.         return $this->render('/front/Moteur/familles.html.twig'$retour);
  226.     }
  227.     public function checkpanier(Request $request)
  228.     {
  229.         $session $request->getSession();
  230.         $resas $session->get('resas');
  231.         if($resas) {
  232.             $dt = new \DateTime;
  233.             foreach($resas as $resa) {
  234.                 echo $dt->getTimestamp() - $resa["timestamp"];
  235.                 if( $dt->getTimestamp() - $resa["timestamp"] > 3600) {
  236.                     $session->remove('resas');
  237.                 }
  238.             }
  239.         }
  240.         return new JsonResponse("");
  241.     }
  242.     /**
  243.      * @Route("/menu", name="ac_platform_menu")
  244.      */
  245.     public function menu(Request $request)
  246.     {
  247.         $route $request->query->get('route_name');
  248.         $params $request->query->get('params');
  249.         $params is_null($params) ? [] : $params;
  250.         $currentLocale $request->getLocale();
  251.         
  252.         $repository $this->em->getRepository(Promo::class);
  253.         $count $repository->countPromos();
  254.         $haspromo $count truefalse;
  255.         
  256.         $venteFlash = new VenteFlash();
  257.         try {
  258.             $projectRoot $this->getParameter('kernel.project_dir');
  259.             $parameter Yaml::parse(file_get_contents($projectRoot.'/var/config/vente-flash.yaml'));
  260.             $venteFlash->setParameter($parameter);
  261.             
  262.         } catch (ParseException $exception) {
  263.             //dump('Unable to parse the YAML string: %s', $exception->getMessage());
  264.         }
  265.         $categories = [];
  266.         
  267.         $promosCategories Promo::CATEGORIES;
  268.         $now = new \DateTime();
  269.         $now = new \DateTime$now->format('Y-m-d'));
  270.        
  271.         if($venteFlash->actif && $now >= $venteFlash->operationDateDebut && $now <= $venteFlash->operationDateFin) {
  272.             array_unshift($promosCategoriesPromo::CATEGORY_VENTES_FLASH);
  273.         }
  274.        
  275.         foreach($promosCategories as $category ) {
  276.             $method $this->translator->trans("promos." $category ".method" , [], 'promos');
  277.             if(method_exists$repository$method)) {
  278.                 $promos $repository->{$method}();
  279.                 if(count($promos) > 0){
  280.                    $categories[] = $category;
  281.                 }
  282.             }
  283.         }
  284.         // Générer les URLs de changement de langue via le service
  285.         $url_fr $this->slugRouterService->generateUrlForLocale($route$params$currentLocale'fr');
  286.         $url_en $this->slugRouterService->generateUrlForLocale($route$params$currentLocale'en');
  287.        
  288.         $vars = array(
  289.             "haspromo" =>  $haspromo,
  290.             "categories" => $categories,
  291.             "route_name" => $route,
  292.             "params" => $params,
  293.             "url_fr" => $url_fr,
  294.             "url_en" => $url_en
  295.         );
  296.        
  297.         return $this->render('/front/Default/menu.html.twig'$vars);
  298.     }
  299.     /**
  300.      * Génère l'URL pour une locale donnée
  301.      */
  302.     private function generateLocaleUrl(?string $route, array $paramsstring $currentLocalestring $targetLocale): ?string
  303.     {
  304.         if (empty($route)) {
  305.             return null;
  306.         }
  307.         // Routes de résidences
  308.         if (in_array($route, ['ac_platform_produit_slug''ac_platform_produit'])) {
  309.             return $this->generateResidenceLocaleUrl($params$targetLocale);
  310.         }
  311.         // Routes de destinations  
  312.         if (in_array($route, ['ac_platform_destination_slug''ac_platform_destination'])) {
  313.             return $this->generateDestinationLocaleUrl($params$targetLocale);
  314.         }
  315.         // Fallback : changer juste la locale
  316.         try {
  317.             return $this->generateUrl($routearray_merge($params, ['_locale' => $targetLocale]));
  318.         } catch (\Exception $e) {
  319.             return null;
  320.         }
  321.     }
  322.     /**
  323.      * Génère l'URL d'une résidence dans une locale donnée
  324.      */
  325.     private function generateResidenceLocaleUrl(array $paramsstring $targetLocale): ?string
  326.     {
  327.         $slug $params['slug'] ?? null;
  328.         $id $params['id'] ?? null;
  329.         
  330.         $residence null;
  331.         
  332.         // Trouver la résidence depuis le slug
  333.         if ($slug) {
  334.             $result $this->slugService->findEntityBySlug($slug);
  335.             if ($result && $result['entity'] instanceof \App\Entity\OptionResidence) {
  336.                 $residence $result['entity']->getResidence();
  337.             }
  338.         }
  339.         
  340.         // Ou depuis l'ID
  341.         if (!$residence && $id) {
  342.             $residence $this->em->getRepository(\App\Entity\Residence::class)->findOneBy(['idiresa' => $id]);
  343.         }
  344.         
  345.         if (!$residence) {
  346.             return null;
  347.         }
  348.         
  349.         // Trouver l'OptionResidence pour la langue cible
  350.         $lang $this->em->getRepository(\App\Entity\Language::class)->findOneBy(['code' => $targetLocale]);
  351.         if (!$lang) {
  352.             return null;
  353.         }
  354.         
  355.         $optionResidence $this->em->getRepository(\App\Entity\OptionResidence::class)->findOneBy([
  356.             'residence' => $residence,
  357.             'lang' => $lang
  358.         ]);
  359.         
  360.         if (!$optionResidence || !$optionResidence->getCanonical()) {
  361.             return null;
  362.         }
  363.         
  364.         // Générer l'URL avec le slug canonique
  365.         $newParams array_merge($params, ['slug' => $optionResidence->getCanonical(), '_locale' => $targetLocale]);
  366.         unset($newParams['id']); // Retirer l'ID de l'ancienne structure
  367.         
  368.         try {
  369.             return $this->generateUrl('ac_platform_produit_slug'$newParams);
  370.         } catch (\Exception $e) {
  371.             return null;
  372.         }
  373.     }
  374.     /**
  375.      * Génère l'URL d'une destination dans une locale donnée
  376.      */
  377.     private function generateDestinationLocaleUrl(array $paramsstring $targetLocale): ?string
  378.     {
  379.         $slug $params['slug'] ?? null;
  380.         $id $params['id'] ?? null;
  381.         
  382.         $destination null;
  383.         
  384.         // 1. Trouver la destination depuis le slug
  385.         if ($slug) {
  386.             $result $this->slugService->findEntityBySlug($slug);
  387.             if ($result && $result['entity'] instanceof \App\Entity\Destination) {
  388.                 $destination $result['entity'];
  389.             }
  390.         }
  391.         
  392.         // Ou depuis l'ID (route legacy)
  393.         if (!$destination && $id) {
  394.             $destination $this->em->getRepository(\App\Entity\Destination::class)->find($id);
  395.         }
  396.         
  397.         if (!$destination) {
  398.             return null;
  399.         }
  400.         
  401.         // 2. Récupérer l'idiresa ou code_traduction pour trouver la version dans l'autre langue
  402.         $idiresa $destination->getIdIresa() ?: $destination->getCodeTraduction();
  403.         
  404.         if (!$idiresa) {
  405.             return null;
  406.         }
  407.         
  408.         // 3. Trouver la Destination dans la langue cible
  409.         $lang $this->em->getRepository(\App\Entity\Language::class)->findOneBy(['code' => $targetLocale]);
  410.         if (!$lang) {
  411.             return null;
  412.         }
  413.         
  414.         $targetDestination $this->em->getRepository(\App\Entity\Destination::class)->findOneBy([
  415.             'id_iresa' => $idiresa,
  416.             'lang' => $lang
  417.         ]);
  418.         
  419.         if (!$targetDestination) {
  420.             return null;
  421.         }
  422.         
  423.         // 4. Utiliser le slug canonique de la destination cible
  424.         $targetSlug $targetDestination->getCanonical() ?: $targetDestination->getSlug();
  425.         
  426.         if (!$targetSlug) {
  427.             return null;
  428.         }
  429.         
  430.         // 5. Générer l'URL avec le bon slug
  431.         $newParams array_merge($params, ['slug' => $targetSlug'_locale' => $targetLocale]);
  432.         unset($newParams['id']); // Retirer l'ID de l'ancienne structure
  433.         
  434.         try {
  435.             return $this->generateUrl('ac_platform_destination_slug'$newParams);
  436.         } catch (\Exception $e) {
  437.             return null;
  438.         }
  439.     }
  440.    
  441.     /**
  442.      * @Route("/footer", name="ac_platform_footer")
  443.      */
  444.     public function footer(Request $request)
  445.     {
  446.         $locale $request->getLocale();
  447.         
  448.         $locale $request->getLocale();
  449.         $lang  $this->em->getRepository(Language::class)->findOneByCode($locale);
  450.         $residences  $this->em->getRepository(Residence::class)->findEnabled($lang);
  451.         $vars = array(
  452.             "hebergements" => $residences
  453.         );
  454.         $html $this->twig->render('/front/Default/footer.html.twig'$vars);
  455.         $twig = new Response($html);
  456.         $twig->headers->set('Content-Type''text/html');
  457.         
  458.         return $twig;
  459.         
  460.     }
  461. }