src/Controller/ThemeController.php line 56

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 Symfony\Contracts\Translation\TranslatorInterface;
  12. use App\Utils\Residences as ResidencesUtil;
  13. use App\Utils\IresaManager;
  14. use App\Services\SeasonService;
  15. use App\Services\iresaService;
  16. use App\Services\SlugRouterService;
  17. use App\Entity\Residence;
  18. use App\Entity\mediaResidence;
  19. use App\Entity\Language;
  20. use App\Entity\Theme;
  21. use App\Services\ToolService;
  22. use Liip\ImagineBundle\Imagine\Cache\CacheManager;
  23. use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
  24. /**
  25.  * @Route("/{_locale}", requirements={"_locale": "en|fr"})
  26.  */
  27. class ThemeController extends AbstractController
  28. {
  29.     private $em;
  30.     private $session;
  31.     private $flashbag;
  32.     private $user;
  33.     private $seasonService;
  34.     private $toolService;
  35.     private $cacheManager;
  36.     private $helper;
  37.     private $translator;
  38.     private $residencesUtil;
  39.     private $iresaManager;
  40.     private $slugRouterService;
  41.     function __construct(EntityManagerInterface $em,  SessionInterface $sessionSeasonService $seasonServiceToolService $toolServiceCacheManager $cacheManagerUploaderHelper $helperTranslatorInterface $translatorResidencesUtil $residencesUtilIresaManager $iresaManagerSlugRouterService $slugRouterService)
  42.     {
  43.         $this->em $em;
  44.         $this->session $session;
  45.         $this->flashbag $this->session->getFlashBag();
  46.         $this->seasonService $seasonService;
  47.         $this->toolService $toolService;
  48.         $this->cacheManager $cacheManager;
  49.         $this->helper $helper;
  50.         $this->translator $translator;
  51.         $this->residencesUtil $residencesUtil;
  52.         $this->iresaManager $iresaManager;
  53.         $this->slugRouterService $slugRouterService;
  54.     }
  55.     /**
  56.      * Route de compatibilité - Ancienne structure avec ID
  57.      * Redirige 301 vers la nouvelle structure sans ID
  58.      * @Route("/theme/{slug}/{id}", name="ac_platform_theme", requirements={"id"="\d+"})
  59.      */
  60.     public function themeLegacyRedirect(Request $requeststring $slugint $id): Response
  61.     {
  62.         $locale $request->getLocale();
  63.         $lang $this->em->getRepository(Language::class)->findOneByCode($locale);
  64.         $theme $this->em->getRepository(Theme::class)->findOneByLang([
  65.             'lang_id' => $lang->getId(),
  66.             'code_traduction' => $id
  67.         ]);
  68.         if (!$theme) {
  69.             throw $this->createNotFoundException('Thème inexistant');
  70.         }
  71.         $canonicalSlug $theme->getCanonical();
  72.         if (empty($canonicalSlug)) {
  73.             $canonicalSlug $theme->getSlug() ?: $slug;
  74.         }
  75.         $queryParams $request->query->all();
  76.         return $this->redirectToRoute(
  77.             'ac_platform_theme_slug',
  78.             array_merge(['slug' => $canonicalSlug], $queryParams),
  79.             301
  80.         );
  81.     }
  82.     /**
  83.      * Route principale - Nouvelle structure avec slug uniquement
  84.      * @Route("/theme/{slug}", name="ac_platform_theme_slug")
  85.      */
  86.     public function themeAction(Request $requeststring $slug): Response
  87.     {
  88.         $locale $request->getLocale();
  89.         
  90.         $result $this->slugRouterService->resolveThemeSlug($slug$locale);
  91.         if (!$result) {
  92.             throw $this->createNotFoundException('Thème non trouvé');
  93.         }
  94.         if (!$result['is_canonical'] && !empty($result['canonical_slug'])) {
  95.             $queryParams $request->query->all();
  96.             return $this->redirectToRoute(
  97.                 'ac_platform_theme_slug',
  98.                 array_merge(['slug' => $result['canonical_slug']], $queryParams),
  99.                 301
  100.             );
  101.         }
  102.         $theme $result['entity'];
  103.         $id $theme->getCodeTraduction();
  104.         if ($request->query->get('page') == 1) {
  105.             return $this->redirect($this->generateUrl('ac_platform_theme_slug', array('slug' => $slug)));
  106.         }
  107.         $locale $request->getLocale();
  108.         $lang $this->em->getRepository(Language::class)->findOneByCode($locale);
  109.         /* 
  110.             interrogation iresa avec les paramètres donnés en paramétre
  111.             exemple pour la page multi-destination "Montagne" sans paramètre
  112.             http://ateya-imhotep-prod.i-resa.com/imhotep/DataResultDetail/1/e9eb5b74-2565-42ca-9c1a-d067c8aee882/?ListLieu=10&DateDebut=&Duree=7&DetailParPrestation=1&pageSize=150
  113.         */
  114.         if ($request->query->has('datearrivee')) {
  115.             $datearrivee $request->query->get('datearrivee');
  116.             $NbDeltaJour 7;
  117.         } else {
  118.             // s'il n'y a pas de date d'arrivée, on prend la date du jour et on cherche les location autour de cette date
  119.             $datearrivee date('d/m/Y');
  120.             $NbDeltaJour 90;
  121.         }
  122.         $duree 0;
  123.         if ($request->query->has('duree')) {
  124.             $duree $request->query->get('duree');
  125.         }
  126.         $currentPage $request->query->get('page') ?? 1;
  127.         $pageSize 25;
  128.         $obj = array(
  129.             "ListThemes" => $id,
  130.             "DateDebut" => $datearrivee,
  131.             'Duree' => $duree,
  132.             'NbDeltaJour' => $NbDeltaJour,
  133.             "DetailParPrestation" => true,
  134.             "pageSize" => $pageSize,
  135.             "page" => $currentPage
  136.         );
  137.         $result $this->iresaManager->getDataResultDetail($obj);
  138.         $hebergements $result["FichesLieuHebergement"];
  139.         $reponses $result["ListReponses"];
  140.         $prestations $result["FichesPrestation"];
  141.         $maxReponse $result["MaxReponse"];
  142.         $nbPages =  ceil($maxReponse $pageSize);
  143.         $countheb 0;
  144.         $listeHebergements "";
  145.         foreach ($hebergements as $heb) {
  146.             if ($heb['IdElement'] > 0) {
  147.                 $listeHebergements .= $heb['IdElement'] . ",";
  148.             }
  149.             if (count($heb["ListFiches"]) > 0) {
  150.                 $countheb++;
  151.                 $hebergement $heb;
  152.             }
  153.         }
  154.         $typologies null;
  155.         /*
  156.             Si un seul hébergement est remonté => redirection vers la page produit correspondante
  157.         */
  158.         if ($countheb == 1) {
  159.             $slug $this->toolService->slugify(str_replace("*"""$hebergement["ListFiches"]["zero"]["nom"]));
  160.             $id $hebergement["IdElement"];
  161.             return $this->redirect($this->generateUrl('ac_platform_produit', array('slug' => $slug'id' => $id)));
  162.         }
  163.         /*
  164.             Si plusieurs hébergements sont remontés => redirection vers la page destination multi produit correspondante
  165.         */
  166.         $packages = [];
  167.         $titre "";
  168.         $description "";
  169.         if ($request->query->has('search')) {
  170.             $titre $this->translator->trans('themes.noResult.titre', [], 'app');;
  171.             $description $this->translator->trans('themes.noResult.description', [], 'app');
  172.         } else {
  173.             $titre $theme->getTitre() ?? $theme->getNom();
  174.             $description $theme->getDescription();
  175.         }
  176.         $this->residencesUtil->setLocale($locale);
  177.         $fiches $this->residencesUtil->getSejours($hebergements$reponses$lang);
  178.         $photoProfil = [];
  179.         $k 0;
  180.         foreach ($fiches as $fiche) {
  181.             $residence $fiche['residence'];
  182.             if ($residence instanceof residence) {
  183.                 $season $this->seasonService->getSeason();
  184.                 $slider $this->em->getRepository(mediaResidence::class)->findOneByLocation($residence->getId(), "content"$lang$season);
  185.                 if ($slider instanceof mediaResidence) {
  186.                     $image_path $this->helper->asset($slider'imageFile');
  187.                     if ($image_path) {
  188.                         $image_link $this->cacheManager->getBrowserPath($image_path'offre');
  189.                         $photoProfil[$k] = $image_link;
  190.                     }
  191.                 }
  192.             }
  193.             $k++;
  194.         }
  195.         $vars = [
  196.             "page_code" => "theme",
  197.             "slug" => $slug,
  198.             "id" => $id,
  199.             "currentPage" => $currentPage,
  200.             "nbPages" => $nbPages,
  201.             "maxReponse" => $maxReponse,
  202.             "mod" => "destination",
  203.             "searchBloc" => true,
  204.             "aff_date" => false,
  205.             'titre' => $titre,
  206.             'description' => $description,
  207.             "hebergements" => $hebergements,
  208.             "reponses" => $fiches,
  209.             "photoProfil" => $photoProfil,
  210.         ];
  211.         return $this->render('/front/Recherche/theme.html.twig'$vars);
  212.     }
  213. }