src/Controller/Front/IndexController.php line 162

  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Cms\Action;
  4. use App\Entity\Cms\Page;
  5. use App\Entity\Cms\SEO;
  6. use App\Entity\Cms\Site;
  7. use App\Entity\Resalys\Etaboffrecgos;
  8. use App\Entity\Resalys\Preregistration;
  9. use App\Form\Resalys\PreregistrationFormType;
  10. use App\Repository\Cms\MenuRepository;
  11. use App\Repository\Cms\PageRepository;
  12. use App\Repository\Cms\SiteRepository;
  13. use App\Repository\Cms\SubsiteRepository;
  14. use App\Repository\Resalys\ConfigRepository;
  15. use App\Service\Cms\Front\RenderPageService;
  16. use App\Service\Resalys\ResalysService;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Doctrine\ORM\NonUniqueResultException;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpFoundation\Session\Session;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. class IndexController extends AbstractController
  27. {
  28.     private static ?Site $__site null;
  29.     private static ?Page $__page null;
  30.     /**
  31.      * @Route("/date/choices/select/{champ}", name="date_choices_select", options={"expose"=true})
  32.      */
  33.     public function getDateChoicesSelect(Request $request$champPreregistrationFormType $preregistrationFormTypeRequestStack $requestStack)
  34.     {
  35.         $preRegistration = new Preregistration();
  36.         $duration = empty($request->query->get('duration')) ? null $request->query->get('duration');
  37.         $destination = empty($request->query->get('destination')) ? null $request->query->get('destination');
  38.         if(strpos($champ,'-')) {
  39.             $champ explode('-'$champ);
  40.         } else {
  41.             $champ = [
  42.                 $champ
  43.             ];
  44.         }
  45.         foreach ($champ as $c) {
  46.             switch ($c) {
  47.                 case 'dateFirstChoice':
  48.                     $preRegistration->setDurationFirstChoice($duration);
  49.                     $preRegistration->setDestinationFirstChoice($destination);
  50.                     break;
  51.                 case 'dateSecondChoice':
  52.                     $preRegistration->setDurationSecondChoice($duration);
  53.                     $preRegistration->setDestinationSecondChoice($destination);
  54.                     break;
  55.             }
  56.         }
  57.         $formPreregister $this->createForm(PreregistrationFormType::class, $preRegistration);
  58.         return $this->render('Front/OffreCgos/Form/_specific_date_choices.html.twig', [
  59.             'formPreregister' => $formPreregister->createView(),
  60.             'champ' => $champ,
  61.         ]);
  62.     }
  63.     //TODO Découper se controller en service: 1) gestion des block action / 2) gestion du SEO etc...
  64.     /**
  65.      * @Route("/", name="index_home")
  66.      * @Route("/{pageCode}", name="index_domain")
  67.      * @Route("/{siteCode}/{pageCode}", name="index", options={"expose"=true})
  68.      * @Route("/{pageCode}/post/{code}", name="index_post", options={"expose"=true})
  69.      * @Route("/{siteCode}/{pageCode}/post/{code}")
  70.      * @Route("/{siteCode}/{pageCode}/saison-{season}/{code}", name="pageCode_season_siteCode")
  71.      * @Route("/{pageCode}/saison-{season}/{code}", name="pageCode_season")
  72.      * @Route("/{pageCode}/vos-vancances/{code}")
  73.      * @Route("/article/{categorie}/{pageCode}", name="index_article")
  74.      * @Route("/dossier-thematique/{categorie}/{pageCode}", name="index_dossier_thematique")
  75.      * @Route("/{pageCode}/categorie/{code}", name="index_filtre", options={"expose"=true})
  76.      * @Route("/offres/{pageCode}/{categoryoffer}/saison-{season}/{code}", name="index_fiche_offrecgos")
  77.      * @throws NonUniqueResultException
  78.      * @throws \Doctrine\ORM\EntityNotFoundException
  79.      */
  80.     public function indexAction(
  81.         Request                 $request,
  82.         EntityManagerInterface  $em,
  83.         SiteRepository          $siteRepository,
  84.         PageRepository          $pageRepository,
  85.         RenderPageService       $renderPageService,
  86.         MenuRepository          $menuRepository,
  87.         ConfigRepository        $configRepository,
  88.         ResalysService          $resalysService,
  89.         SubsiteRepository       $subsiteRepository
  90.     ): RedirectResponse|Response
  91.     {
  92.         $session = new Session();
  93.         
  94.         $previousRoute $session->get('this_route');
  95.         if($request->get('type') == 'search' && !is_object($previousRoute) || $request->get('type') == 'search') {
  96.             if(empty($previousRoute) || $previousRoute->params['pageCode'] !== "resultats-de-recherche") {
  97.                 $redirection str_replace('?type=search'''$request->getUri());
  98.                 return $this->redirect($redirection);
  99.             }
  100.         }
  101.         $resalysUser $session->get('user-session');
  102.         $subsiteCode $renderPageService->getSiteCode();
  103.         $subsite $subsiteRepository->findOneBy(['subsiteCode' => $subsiteCode]);
  104.         $resalysService->checkLogged($resalysUser);
  105.         $pageCode $request->get('pageCode');
  106.         if($pageCode && ctype_upper(substr($pageCode01))) {
  107.             $lowerCode  strtolower($pageCode);
  108.             $lowerUrl   str_replace($pageCode$lowerCode$request->getUri());
  109.             return $this->redirect($lowerUrl301);
  110.         }
  111.         $session->set('baseResaUrl'$request->getSchemeAndHttpHost());
  112.         $session->set('userIp'$request->getClientIp());
  113.         /** @var Site|null $site */
  114.         $site $siteRepository->findById($request->getSession()->get('site'));
  115.         if(!$site) {
  116.             $site $siteRepository->findDefaultSite();
  117.         }
  118.         // Recuperation des menus de la navigation
  119.         $menusNav $menuRepository->findBySiteAndSubSite($site$subsite'megamenu');
  120.         /** @var Page|null $page */
  121.         $page $home $pageRepository->findDefaultPage($site);
  122.         if ($request->get('pageCode') != null) {
  123.             $page $pageRepository->findByCodeAndSite($request->get('pageCode'), $site);
  124.         }
  125.         // Recupération de la page d'accueil en fonction du sous-site (sous-domaine)
  126.         if(!empty($page) && $page->getPageIsDefault() && $subsiteCode !== 'touristra') {
  127.             $subsiteHomePage $pageRepository->findDefaultPage($site$subsiteCode);
  128.             if(!empty($subsiteHomePage)) {
  129.                 $page $home $subsiteHomePage;
  130.             }
  131.         }
  132.         if(!empty($page)) {
  133.             $session->set('currentTemplate'$page->getTemplate());
  134.         }
  135.         if ($page == null || ($page->getOnline() == && !$request->get('preview'))) {
  136.             throw $this->createNotFoundException('Désolé, la page que vous cherchez n\'existe pas. ');
  137.         }
  138.         //Si c'est une page fictive qui ne sert qu'à l'arborescence
  139.         if ($page->getPageArbo()) {
  140.             if (count($page->getChildren()) > 0) {
  141.                 $page   $page->getChildren()->first();
  142.             } else {
  143.                 $page   $pageRepository->findDefaultPage($site);
  144.             }
  145.             return $this->redirectToRoute('index', ['siteCode' => $site->getSiteCode(), 'pageCode' => $page->getPageCode()]);
  146.         }
  147.         self::setSite($site);
  148.         self::setPage($page);
  149.         //TODO Gerer le cas des Layout => site actuel dans la création d'une page
  150.         $layout $site->getLayout();
  151.         if ($page->getLayout()) {
  152.             $layout $page->getLayout();
  153.         }
  154.         //Gestion des balises dans le SEO et des actions
  155.         $actions  = [];
  156.         $keywords = [];
  157.         $balises  = [];
  158.         /** @var SEO|null $seo */
  159.         $seo $page->getSeo();
  160.         if ($seo) {
  161.             if($seo->getMetaTitle()){
  162.                 if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaTitle(), $results)) {
  163.                     $balises array_merge($balises$results[1]);
  164.                 }
  165.             }
  166.             if($seo->getMetaDescription()) {
  167.                 if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaDescription(), $results)) {
  168.                     $balises array_merge($balises$results[1]);
  169.                 }
  170.             }
  171.             if($seo->getMetaOgTitle()) {
  172.                 if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaOgTitle(), $results)) {
  173.                     $balises array_merge($balises$results[1]);
  174.                 }
  175.             }
  176.             if($seo->getMetaOgDescription()) {
  177.                 if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/"$seo->getMetaOgDescription(), $results)) {
  178.                     $balises array_merge($balises$results[1]);
  179.                 }
  180.             }
  181.         }
  182.         foreach ($page->getZones() as $zone){
  183.             foreach ($zone->getCols() as $col){
  184.                 foreach ($col->getBlocks() as $block){
  185.                     if ($block->getBlockType()->getTypeCode() == 'action') {
  186.                         /** @var Action|null $action */
  187.                         $action $block->getAction();
  188.                         if(!$action) {
  189.                             throw $this->createNotFoundException('l\'action du block n\'a pas été trouvée dans la bdd');
  190.                         }
  191.                         $params = ['request' => $request];
  192.                         $url '\App\Controller\Front'.'\\'.$action->getActionModule().'\\FrontController::'.$action->getActionCode();
  193.                         $filter '';
  194.                         if ($block->getActionFilter()) {
  195.                             $params['filter'] = $block->getActionFilter();
  196.                             $filter $block->getActionFilter();
  197.                         }
  198.                         $actionResponse $this->forward($url$params$request->query->all());
  199.                         if ($actionResponse->isRedirection()) {
  200.                             return $actionResponse;
  201.                         } elseif ($actionResponse->isClientError()) {
  202.                             throw $this->createNotFoundException();
  203.                         } else {
  204.                             $actions[$url ':' $filter] = $actionResponse->getContent();
  205.                         }
  206.                         // On enregistre les balises des fiches pour le SEO, si la fiche existe
  207.                         if (!empty($actionResponse->getContent()) && $action->getActionView()) {
  208.                             $isOffreCgos false;
  209.                             if ($subsiteCode == 'touristra-offres-cgos'){
  210.                                 $offreCgosRepo $em->getRepository('\App\Entity\Resalys\Etaboffrecgos');
  211.                                 /** @var Etaboffrecgos|null $offreCgos */
  212.                                 $offreCgos $offreCgosRepo->findOneBy(['etabCode' => $request->get('code')]);
  213.                                 if(!$offreCgos) {
  214.                                     $this->createNotFoundException("l'offre CGOS n'a pas pu être récupéré en bdd");
  215.                                 }
  216.                                 $isOffreCgos true;
  217.                             }
  218.                             $entity $action->getActionEntityNamespace() . '\\' $action->getActionEntity();
  219.                             $metadataEntity $em->getClassMetadata($entity);
  220.                             $fields $metadataEntity->getFieldNames();
  221.                             $etabRepo $em->getRepository($entity);
  222.                             $object $isOffreCgos $offreCgos->getEtabFrom() : $etabRepo->findByCode($request->get('code'));
  223.                             foreach ($fields as $field) {
  224.                                 if (!in_array($field$balises)) {
  225.                                     continue;
  226.                                 }
  227.                                 $methodGet 'get' ucfirst($field);
  228.                                 if (!method_exists($object$methodGet)) {
  229.                                     continue;
  230.                                 }
  231.                                 $value $object->{$methodGet}();
  232.                                 $value $renderPageService->formatFieldValue($entity$field$value);
  233.                                 $keywords[$field] = $value ;
  234.                             }
  235.                         }
  236.                     }
  237.                 }
  238.             }
  239.         }
  240.         $template 'Front/' $layout->getLayoutName().'/Page/'.$page->getTemplate()->getTemplateCode().'.html.twig';
  241.         $etabSEO                    $renderPageService->getEtabSEO($template); // récupération du prefix pour le SEO
  242.         $seoBalises                 = [];
  243.         $seoBalises['title']        = $seoBalises['ogTitle'] = $etabSEO $page->getPageName();
  244.         $seoBalises['description']  = $seoBalises['ogDescription'] = NULL;
  245.         $seoBalises['canonical']    = $seoBalises['ogUrl'] = NULL;
  246.         $seoBalises['ogLocale']     = 'fr_FR';
  247.         $seoBalises['ogType']       = 'website';
  248.         $seoBalises['index']        = 'index';
  249.         $seoBalises['follow']       = 'follow';
  250.         if ($seo) {
  251.             if(!empty($seo->getMetaTitle())) {
  252.                 $seoBalises['title'] = $seoBalises['ogTitle'] = $etabSEO $seo->getMetaTitle();
  253.             }
  254.             if(!empty($seo->getMetaDescription())) {
  255.                 $seoBalises['description'] = $seoBalises['ogDescription'] = $seo->getMetaDescription();
  256.             }
  257.             if(!empty($seo->getMetaCanonical())) {
  258.                 $seoBalises['canonical'] = $seoBalises['ogUrl'] = $seo->getMetaCanonical();
  259.             }
  260.             if (!empty($seo->getMetaOgTitle())) {
  261.                 $seoBalises['ogTitle'] = $etabSEO $seo->getMetaOgTitle();
  262.             }
  263.             if (!empty($seo->getMetaOgDescription())) {
  264.                 $seoBalises['ogDescription'] = $seo->getMetaOgDescription();
  265.             }
  266.             if (!empty($seo->getMediaRelation())) {
  267.                 $seoBalises['ogImage'] = $seo->getMediaRelation()->getMedia()?->getAbsolutePath();
  268.             }
  269.             $seoBalises['index']    = $seo->isMetaIndex()  ? 'index' 'noindex';
  270.             $seoBalises['follow']   = $seo->isMetaFollow() ? 'follow''nofollow';
  271.             foreach ($keywords as $key => $keyword) {
  272.                 $seoBalises['title'] = str_replace('['.$key.']'$keyword$seoBalises['title']);
  273.                 if(!empty($seoBalises['description'])) {
  274.                     $seoBalises['description'] = str_replace('['.$key.']'$keyword$seoBalises['description']);
  275.                 }
  276.                 $seoBalises['ogTitle'] = str_replace('['.$key.']'$keyword$seoBalises['ogTitle']);
  277.                 if(!empty($seoBalises['ogDescription'])) {
  278.                     $seoBalises['ogDescription'] = str_replace('['.$key.']'$keyword$seoBalises['ogDescription']);
  279.                 }
  280.             }
  281.         }
  282.         $resalysConfig $configRepository->findAll();
  283.         $response $this->render'Front/' $layout->getLayoutCode() . '/layout.html.twig', [
  284.             'resalysConfig'     => !empty($resalysConfig) ? $resalysConfig[0] : NULL,
  285.             'isAdherentSite'    => str_contains($request->getUri(), 'adherent'),
  286.             'site'              => $site,
  287.             'template'          => $template,
  288.             'content'           => 'Front/zones.html.twig',
  289.             'home'              => $home,
  290.             'current'           => $page,
  291.             'user'              => $resalysUser,
  292.             'language'          => $request->getLocale(),
  293.             'request'           => $request,
  294.             'actions'           => $actions,
  295.             'seo'               => $seoBalises,
  296.             'menusNav'          => $menusNav
  297.         ]);
  298.         return $response;
  299.     }
  300.     public static function getSite(): ?Site
  301.     {
  302.         return self::$__site;
  303.     }
  304.     public static function setSite(Site $site): void
  305.     {
  306.         self::$__site $site;
  307.     }
  308.     public static function getPage(): ?Page
  309.     {
  310.         return self::$__page;
  311.     }
  312.     public static function setPage(Page $page): void
  313.     {
  314.         self::$__page $page;
  315.     }
  316. }