src/Controller/Front/IndexController.php line 162
<?php
namespace App\Controller\Front;
use App\Entity\Cms\Action;
use App\Entity\Cms\Page;
use App\Entity\Cms\SEO;
use App\Entity\Cms\Site;
use App\Entity\Resalys\Etaboffrecgos;
use App\Entity\Resalys\Preregistration;
use App\Form\Resalys\PreregistrationFormType;
use App\Repository\Cms\MenuRepository;
use App\Repository\Cms\PageRepository;
use App\Repository\Cms\SiteRepository;
use App\Repository\Cms\SubsiteRepository;
use App\Repository\Resalys\ConfigRepository;
use App\Service\Cms\Front\RenderPageService;
use App\Service\Resalys\ResalysService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
class IndexController extends AbstractController
{
private static ?Site $__site = null;
private static ?Page $__page = null;
/**
* @Route("/date/choices/select/{champ}", name="date_choices_select", options={"expose"=true})
*/
public function getDateChoicesSelect(Request $request, $champ, PreregistrationFormType $preregistrationFormType, RequestStack $requestStack)
{
$preRegistration = new Preregistration();
$duration = empty($request->query->get('duration')) ? null : $request->query->get('duration');
$destination = empty($request->query->get('destination')) ? null : $request->query->get('destination');
if(strpos($champ,'-')) {
$champ = explode('-', $champ);
} else {
$champ = [
$champ
];
}
foreach ($champ as $c) {
switch ($c) {
case 'dateFirstChoice':
$preRegistration->setDurationFirstChoice($duration);
$preRegistration->setDestinationFirstChoice($destination);
break;
case 'dateSecondChoice':
$preRegistration->setDurationSecondChoice($duration);
$preRegistration->setDestinationSecondChoice($destination);
break;
}
}
$formPreregister = $this->createForm(PreregistrationFormType::class, $preRegistration);
return $this->render('Front/OffreCgos/Form/_specific_date_choices.html.twig', [
'formPreregister' => $formPreregister->createView(),
'champ' => $champ,
]);
}
//TODO Découper se controller en service: 1) gestion des block action / 2) gestion du SEO etc...
/**
* @Route("/", name="index_home")
* @Route("/{pageCode}", name="index_domain")
* @Route("/{siteCode}/{pageCode}", name="index", options={"expose"=true})
* @Route("/{pageCode}/post/{code}", name="index_post", options={"expose"=true})
* @Route("/{siteCode}/{pageCode}/post/{code}")
* @Route("/{siteCode}/{pageCode}/saison-{season}/{code}", name="pageCode_season_siteCode")
* @Route("/{pageCode}/saison-{season}/{code}", name="pageCode_season")
* @Route("/{pageCode}/vos-vancances/{code}")
* @Route("/article/{categorie}/{pageCode}", name="index_article")
* @Route("/dossier-thematique/{categorie}/{pageCode}", name="index_dossier_thematique")
* @Route("/{pageCode}/categorie/{code}", name="index_filtre", options={"expose"=true})
* @Route("/offres/{pageCode}/{categoryoffer}/saison-{season}/{code}", name="index_fiche_offrecgos")
* @throws NonUniqueResultException
* @throws \Doctrine\ORM\EntityNotFoundException
*/
public function indexAction(
Request $request,
EntityManagerInterface $em,
SiteRepository $siteRepository,
PageRepository $pageRepository,
RenderPageService $renderPageService,
MenuRepository $menuRepository,
ConfigRepository $configRepository,
ResalysService $resalysService,
SubsiteRepository $subsiteRepository
): RedirectResponse|Response
{
$session = new Session();
$previousRoute = $session->get('this_route');
if($request->get('type') == 'search' && !is_object($previousRoute) || $request->get('type') == 'search') {
if(empty($previousRoute) || $previousRoute->params['pageCode'] !== "resultats-de-recherche") {
$redirection = str_replace('?type=search', '', $request->getUri());
return $this->redirect($redirection);
}
}
$resalysUser = $session->get('user-session');
$subsiteCode = $renderPageService->getSiteCode();
$subsite = $subsiteRepository->findOneBy(['subsiteCode' => $subsiteCode]);
$resalysService->checkLogged($resalysUser);
$pageCode = $request->get('pageCode');
if($pageCode && ctype_upper(substr($pageCode, 0, 1))) {
$lowerCode = strtolower($pageCode);
$lowerUrl = str_replace($pageCode, $lowerCode, $request->getUri());
return $this->redirect($lowerUrl, 301);
}
$session->set('baseResaUrl', $request->getSchemeAndHttpHost());
$session->set('userIp', $request->getClientIp());
/** @var Site|null $site */
$site = $siteRepository->findById($request->getSession()->get('site'));
if(!$site) {
$site = $siteRepository->findDefaultSite();
}
// Recuperation des menus de la navigation
$menusNav = $menuRepository->findBySiteAndSubSite($site, $subsite, 'megamenu');
/** @var Page|null $page */
$page = $home = $pageRepository->findDefaultPage($site);
if ($request->get('pageCode') != null) {
$page = $pageRepository->findByCodeAndSite($request->get('pageCode'), $site);
}
// Recupération de la page d'accueil en fonction du sous-site (sous-domaine)
if(!empty($page) && $page->getPageIsDefault() && $subsiteCode !== 'touristra') {
$subsiteHomePage = $pageRepository->findDefaultPage($site, $subsiteCode);
if(!empty($subsiteHomePage)) {
$page = $home = $subsiteHomePage;
}
}
if(!empty($page)) {
$session->set('currentTemplate', $page->getTemplate());
}
if ($page == null || ($page->getOnline() == 0 && !$request->get('preview'))) {
throw $this->createNotFoundException('Désolé, la page que vous cherchez n\'existe pas. ');
}
//Si c'est une page fictive qui ne sert qu'à l'arborescence
if ($page->getPageArbo()) {
if (count($page->getChildren()) > 0) {
$page = $page->getChildren()->first();
} else {
$page = $pageRepository->findDefaultPage($site);
}
return $this->redirectToRoute('index', ['siteCode' => $site->getSiteCode(), 'pageCode' => $page->getPageCode()]);
}
self::setSite($site);
self::setPage($page);
//TODO Gerer le cas des Layout => site actuel dans la création d'une page
$layout = $site->getLayout();
if ($page->getLayout()) {
$layout = $page->getLayout();
}
//Gestion des balises dans le SEO et des actions
$actions = [];
$keywords = [];
$balises = [];
/** @var SEO|null $seo */
$seo = $page->getSeo();
if ($seo) {
if($seo->getMetaTitle()){
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaTitle(), $results)) {
$balises = array_merge($balises, $results[1]);
}
}
if($seo->getMetaDescription()) {
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaDescription(), $results)) {
$balises = array_merge($balises, $results[1]);
}
}
if($seo->getMetaOgTitle()) {
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaOgTitle(), $results)) {
$balises = array_merge($balises, $results[1]);
}
}
if($seo->getMetaOgDescription()) {
if (preg_match_all("/\[([0-9a-zA-Z\.]+)\]/", $seo->getMetaOgDescription(), $results)) {
$balises = array_merge($balises, $results[1]);
}
}
}
foreach ($page->getZones() as $zone){
foreach ($zone->getCols() as $col){
foreach ($col->getBlocks() as $block){
if ($block->getBlockType()->getTypeCode() == 'action') {
/** @var Action|null $action */
$action = $block->getAction();
if(!$action) {
throw $this->createNotFoundException('l\'action du block n\'a pas été trouvée dans la bdd');
}
$params = ['request' => $request];
$url = '\App\Controller\Front'.'\\'.$action->getActionModule().'\\FrontController::'.$action->getActionCode();
$filter = '';
if ($block->getActionFilter()) {
$params['filter'] = $block->getActionFilter();
$filter = $block->getActionFilter();
}
$actionResponse = $this->forward($url, $params, $request->query->all());
if ($actionResponse->isRedirection()) {
return $actionResponse;
} elseif ($actionResponse->isClientError()) {
throw $this->createNotFoundException();
} else {
$actions[$url . ':' . $filter] = $actionResponse->getContent();
}
// On enregistre les balises des fiches pour le SEO, si la fiche existe
if (!empty($actionResponse->getContent()) && $action->getActionView()) {
$isOffreCgos = false;
if ($subsiteCode == 'touristra-offres-cgos'){
$offreCgosRepo = $em->getRepository('\App\Entity\Resalys\Etaboffrecgos');
/** @var Etaboffrecgos|null $offreCgos */
$offreCgos = $offreCgosRepo->findOneBy(['etabCode' => $request->get('code')]);
if(!$offreCgos) {
$this->createNotFoundException("l'offre CGOS n'a pas pu être récupéré en bdd");
}
$isOffreCgos = true;
}
$entity = $action->getActionEntityNamespace() . '\\' . $action->getActionEntity();
$metadataEntity = $em->getClassMetadata($entity);
$fields = $metadataEntity->getFieldNames();
$etabRepo = $em->getRepository($entity);
$object = $isOffreCgos ? $offreCgos->getEtabFrom() : $etabRepo->findByCode($request->get('code'));
foreach ($fields as $field) {
if (!in_array($field, $balises)) {
continue;
}
$methodGet = 'get' . ucfirst($field);
if (!method_exists($object, $methodGet)) {
continue;
}
$value = $object->{$methodGet}();
$value = $renderPageService->formatFieldValue($entity, $field, $value);
$keywords[$field] = $value ;
}
}
}
}
}
}
$template = 'Front/' . $layout->getLayoutName().'/Page/'.$page->getTemplate()->getTemplateCode().'.html.twig';
$etabSEO = $renderPageService->getEtabSEO($template); // récupération du prefix pour le SEO
$seoBalises = [];
$seoBalises['title'] = $seoBalises['ogTitle'] = $etabSEO . $page->getPageName();
$seoBalises['description'] = $seoBalises['ogDescription'] = NULL;
$seoBalises['canonical'] = $seoBalises['ogUrl'] = NULL;
$seoBalises['ogLocale'] = 'fr_FR';
$seoBalises['ogType'] = 'website';
$seoBalises['index'] = 'index';
$seoBalises['follow'] = 'follow';
if ($seo) {
if(!empty($seo->getMetaTitle())) {
$seoBalises['title'] = $seoBalises['ogTitle'] = $etabSEO . $seo->getMetaTitle();
}
if(!empty($seo->getMetaDescription())) {
$seoBalises['description'] = $seoBalises['ogDescription'] = $seo->getMetaDescription();
}
if(!empty($seo->getMetaCanonical())) {
$seoBalises['canonical'] = $seoBalises['ogUrl'] = $seo->getMetaCanonical();
}
if (!empty($seo->getMetaOgTitle())) {
$seoBalises['ogTitle'] = $etabSEO . $seo->getMetaOgTitle();
}
if (!empty($seo->getMetaOgDescription())) {
$seoBalises['ogDescription'] = $seo->getMetaOgDescription();
}
if (!empty($seo->getMediaRelation())) {
$seoBalises['ogImage'] = $seo->getMediaRelation()->getMedia()?->getAbsolutePath();
}
$seoBalises['index'] = $seo->isMetaIndex() ? 'index' : 'noindex';
$seoBalises['follow'] = $seo->isMetaFollow() ? 'follow': 'nofollow';
foreach ($keywords as $key => $keyword) {
$seoBalises['title'] = str_replace('['.$key.']', $keyword, $seoBalises['title']);
if(!empty($seoBalises['description'])) {
$seoBalises['description'] = str_replace('['.$key.']', $keyword, $seoBalises['description']);
}
$seoBalises['ogTitle'] = str_replace('['.$key.']', $keyword, $seoBalises['ogTitle']);
if(!empty($seoBalises['ogDescription'])) {
$seoBalises['ogDescription'] = str_replace('['.$key.']', $keyword, $seoBalises['ogDescription']);
}
}
}
$resalysConfig = $configRepository->findAll();
$response = $this->render( 'Front/' . $layout->getLayoutCode() . '/layout.html.twig', [
'resalysConfig' => !empty($resalysConfig) ? $resalysConfig[0] : NULL,
'isAdherentSite' => str_contains($request->getUri(), 'adherent'),
'site' => $site,
'template' => $template,
'content' => 'Front/zones.html.twig',
'home' => $home,
'current' => $page,
'user' => $resalysUser,
'language' => $request->getLocale(),
'request' => $request,
'actions' => $actions,
'seo' => $seoBalises,
'menusNav' => $menusNav
]);
return $response;
}
public static function getSite(): ?Site
{
return self::$__site;
}
public static function setSite(Site $site): void
{
self::$__site = $site;
}
public static function getPage(): ?Page
{
return self::$__page;
}
public static function setPage(Page $page): void
{
self::$__page = $page;
}
}