<?php
declare (strict_types = 1);
/*
* Copyright (C) Office National de Publication et de Communication - All Rights Reserved
*
* Unauthorized copying of this file, via any medium is strictly prohibited by law
* This file is proprietary and confidential
*/
namespace App\Controller;
use App\Entity\Faq;
use App\Entity\Items;
use App\Entity\Trace;
use App\Entity\Ville;
use App\Entity\Region;
use App\Service\Slugify;
use App\Service\Traceur;
use App\Entity\Actualite;
use App\Entity\Departement;
use App\Service\Historique;
use App\Service\PathBuilder;
use App\Common\LieuInterface;
use App\Elasticsearch\Engine;
use App\Elasticsearch\Moteur;
use App\Entity\ZonesInternat;
use App\Entity\AncienneRegion;
use App\Entity\ItemsInsertion;
use App\Service\CrawlerDetect;
use App\Service\UserTransient;
use App\Elasticsearch\Parametres;
use App\Repository\VilleRepository;
use App\Repository\RegionRepository;
use App\Repository\ActualiteRepository;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\SeoTexteReferencementDiplome;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
final class AnnuaireController extends AbstractController
{
private const MAX = Moteur::PER_PAGE_DEFAULT_2;
private const MAX_DIPLOME = 60;
private const MAX_ACTUALITE = 10;
/** @var Slugify */
private $slugify;
/** @var Moteur */
private $moteur;
/** @var UserTransient */
private $userTransient;
/** @var Historique */
private $historique;
/** @var CrawlerDetect */
private $crawlerDetect;
/** @var PathBuilder */
private $pathBuilder;
/** @var Traceur */
private $traceur;
private $engine;
/** @var ManagerRegistry */
private $doctrine;
private HttpKernelInterface $httpKernel;
private RequestStack $requestStack;
private RouterInterface $router;
public function __construct(
Slugify $slugify,
Moteur $moteur,
UserTransient $userTransient,
Historique $historique,
CrawlerDetect $crawlerDetect,
PathBuilder $pathBuilder,
Traceur $traceur,
Moteur $engine,
ManagerRegistry $doctrine,
HttpKernelInterface $httpKernel,
RequestStack $requestStack,
RouterInterface $router
) {
$this->slugify = $slugify;
$this->moteur = $moteur;
$this->userTransient = $userTransient;
$this->historique = $historique;
$this->crawlerDetect = $crawlerDetect;
$this->pathBuilder = $pathBuilder;
$this->traceur = $traceur;
$this->engine = $engine;
$this->doctrine = $doctrine;
$this->httpKernel = $httpKernel;
$this->requestStack = $requestStack;
$this->router = $router;
}
/**
* @Route("/annuaire", name="annuaire", methods={"GET"})
*/
public function index(): Response
{
return $this->redirectToRoute('homepage', [], 301);
}
/**
* @Route("/annuaire/{quoi}", name="annuaire_quoi", methods={"GET"})
*/
public function quoi(string $quoi): Response
{
return $this->redirectToRoute('enseignement-catholique', [], 301);
}
/**
* @Route(
* "/annuaire-enseignement-catholique/{lieu}",
* name="annuaire_catho",
* methods={"GET"},
* defaults={"typeOnglet"="annuaire-enseignement-catholique"}
* )
* @Route(
* "/annuaire-enseignement-prive/{lieu}",
* name="annuaire_prive",
* methods={"GET"},
* defaults={"typeOnglet"="annuaire-enseignement-prive"}
* )
*
* @Route(
* "/annuaire/{quoi}/{lieu}",
* name="annuaire_liste",
* methods={"GET"}
* )
*
* @Route(
* "/onglet/superieur/{sousTypeOnglet}/{niveauOnglet}",
* name="annuaire_liste_par_onglet_sup",
* methods={"GET"},
* defaults={"niveauOnglet"="tout"}
* )
*
* @Route(
* "/onglet/superieur/{sousTypeOnglet}/{niveauOnglet}/{localisation}",
* name="annuaire_liste_par_onglet_sup_localisation",
* methods={"GET"},
* defaults={"niveauOnglet"="tout"}
* )
*
* @Route(
* "/onglet/{typeOnglet}/{niveauOnglet}",
* name="annuaire_liste_par_onglet",
* methods={"GET"},
* defaults={"niveauOnglet"="tout"}
* )
*
*
* @Route(
* "/onglet/{typeOnglet}/{niveauOnglet}/{localisation}",
* name="annuaire_liste_par_onglet_localisation",
* methods={"GET"},
* defaults={"niveauOnglet"="tout"}
* )
*
* @Cache(expires="+1 minute", public=false)
*/
public function liste(Request $request, string $quoi = null, string $lieu = null,
$typeOnglet = null, $sousTypeOnglet = null, $niveauOnglet = null, $localisation = null): Response {
$lieuTemp = null;
$parametres = new Parametres();
// 2025 - redirection des liens du sidebar gauche catho > privé
$currentRoute = $request->attributes->get('_route');
if ($currentRoute == "annuaire_catho") {
return $this->redirectToRoute('annuaire_prive', [
"typeOnglet" => "annuaire-enseignement-prive",
"lieu" => $lieu
], 301);
}
// (sous-)Redirection de la racine "/onglet" vers "/ecoles-colleges-lycees"
$uri = $request->getPathInfo();
if ($uri == "/onglet" || $uri == "/onglet/") {
$routeName = 'enseignement-prive'; // The route name you want to call
$routeParams = $this->router->match($this->generateUrl($routeName));
$subRequest = $request->duplicate([], null, ['_controller' => $routeParams['_controller']] + $routeParams);
return $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
}
// Bloquer les params bizarres non reconnus (exp : region, lang ...)
$getParams = $request->query->all();
$acceptedGetParams = [
'page',
'filiere',
'diplome',
'eds',
'pTypeOnglet',
'pSousTypeOnglet',
'pNiveauOnglet',
'pQueryString',
'statut',
'autre',
'alternance',
'age',
'lva',
'lvb',
'lieu',
'emplacement',
'type',
'single',
'emplacement',
'id',
'onglet',
'departement',
'profil',
'niveau',
'utm_source',
'utm_medium',
'utm_campaign',
'utm_content',
'utm_term',
'utm_id',
'utm_adgroup',
'utm_adname',
'utm_adset',
'utm_adtype',
'utm_adgroupid',
'utm_adnameid',
'utm_adsetid',
'gclid',
'dclid',
'fbclid',
'twclid',
'msclkid',
'_gl',
];
if (count($getParams)) {
$getParams = array_keys($getParams);
foreach ($getParams as $getParam) {
if (!in_array($getParam, $acceptedGetParams)) {
throw $this->createNotFoundException("Cette page n'exite pas !");
} else {
// Si le param existe mais n'a aucune valeur => STOP
$value = $_GET[$getParam];
if (!$value || empty($value))
throw $this->createNotFoundException("Cette page n'exite pas !!");
if (is_array($value) && count($value) == 1 && $value[0] === "")
throw $this->createNotFoundException("Cette page n'exite pas !!!");
}
}
}
if ('filiere' == $sousTypeOnglet) {
return $this->redirectToRoute('annuaire_liste_par_onglet_sup', ['niveauOnglet' => 'tout'], 301);
}
/*
Gérer les URLs qui fonctionnent mais qui ne devraient pas exister
EXP :
/onglet/ecole/belleville-69220/dorans-90400?niveau[]=02-ELEM
belleville-69220 n'existe pas ! la bonne ville est belleville-en-beaujolais-69220
/onglet/ecole/saint-denis-89100/granges-la-ville-70400?niveau%5B0%5D=02-ELEM
saint-denis-89100 n'existe pas ! la bonne ville est saint-denis-les-sens-89100
*/
// dump("typeOnglet : $typeOnglet / niveauOnglet : $niveauOnglet / localisation : $localisation");
switch ($typeOnglet) {
case 'ecole':
if (
!$this->slugify->revealLieu($niveauOnglet) &&
$niveauOnglet != "maternelle" &&
$niveauOnglet != "elementaire" &&
$niveauOnglet != "tout"
)
throw $this->createNotFoundException("URL interdite [1]");
break;
case 'college':
if (
!$this->slugify->revealLieu($niveauOnglet) &&
$niveauOnglet != "tout"
)
throw $this->createNotFoundException("URL interdite [2]");
break;
case 'lycee':
if (
!$this->slugify->revealLieu($niveauOnglet) &&
$niveauOnglet != "general" &&
$niveauOnglet != "technologique" &&
$niveauOnglet != "tout"
)
throw $this->createNotFoundException("URL interdite [3]");
break;
case 'professionnel':
if (
!$this->slugify->revealLieu($niveauOnglet) &&
$niveauOnglet != "cap" &&
$niveauOnglet != "bac-pro" &&
$niveauOnglet != "formation-pro-continue" &&
$niveauOnglet != "tout"
)
throw $this->createNotFoundException("URL interdite [4]");
break;
}
if (isset($localisation) && !empty($localisation) && !$this->slugify->revealLieu($localisation))
throw $this->createNotFoundException("URL interdite [5]");
// // Détecter les URLs non valides genre /onglet/ain-01/bretagne
// // /onglet/{typeOnglet}/{niveauOnglet}
// $typeOnglet0 = $this->slugify->revealLieu($typeOnglet);
// $niveauOnglet0 = $this->slugify->revealLieu($niveauOnglet);
// if ($niveauOnglet0 instanceof LieuInterface && $typeOnglet0 instanceof LieuInterface)
// return $this->redirectToRoute('', [], 301);
// Récupérer la queryString sous forme de texte afin de la passer aux localisation de la vue
$pathInfo = $request->getPathInfo(); // Exp.: "/enseignement--catholique/alsace"
$requestUri = $request->getRequestUri(); // Exp.: "/enseignement--catholique/alsace?statut%5B%5D=catholique";
$getQueryString = str_replace($pathInfo, "", $requestUri);
// Pour les listes géo il faut supprimer le n° de page (si jamais on a pagination), sinon si par exp
// je suis en région page 10 et je sélectionne un dpt ça va faire 301 vers la racine
$uri = $request->getRequestUri();// Get the current request URI
$queryString = parse_url($uri, PHP_URL_QUERY);// Parse the URI to extract the query parameters
if ($queryString)
{
parse_str($queryString, $params); // Parse the query string into an array
unset($params['page']); // Remove the parameter you want to delete
$newQueryString = http_build_query($params); // Rebuild the query string
// Rebuild the URI with the new query string
$getQueryStringSafe = strtok($uri, '?') . '?' . $newQueryString;
$getQueryStringSafe = str_replace($pathInfo, "", $getQueryStringSafe);
} else {
$getQueryStringSafe = $getQueryString;
}
$currentRoute = $request->attributes->get('_route');
if ($currentRoute == "annuaire_liste_par_onglet_sup" || $currentRoute == "annuaire_liste_par_onglet_sup_localisation") {
$typeOnglet = "superieur";
}
if (
$currentRoute == "annuaire_liste_par_onglet" ||
$currentRoute == "annuaire_liste_par_onglet_localisation"
) {
$goodTypeOnglet = ['ecole', 'college', 'lycee', 'professionnel', 'internat', 'formations-a-distance', 'autre'];
if (!in_array($typeOnglet, $goodTypeOnglet)) {
/* Note de keywo : on prends une catégorie au hasard et on redirige vers celle-ci (la + stratégique). Les laisser en 404 n’est pas idéal, Google continuera de les crawler. Soit on les redirige, soit on les mets en 410 pour que Google arrêtent de les crawler. Les redirections sont recommandées dans ce cas-là.
*/
return $this->redirectToRoute('annuaire_liste_par_onglet', ['niveauOnglet' => 'tout', 'typeOnglet' => 'lycee'], 301);
// throw $this->createNotFoundException("Cette page n'exite pas !");
}
}
// Détecter les diplomes supérieur qui n'existent plus
// ATT : il faut chercher dans ItemsInsertion et non pas Items, car on peut le trouver dans ce dernier mais ça veut pas dire
// qu'on a des étabs qui proposent ce diplome
// RAPPEL : un diplime est un item de de niveau 4, une filière est aussi un item, mais de niv 3
if (
$sousTypeOnglet == "diplome" && (
$currentRoute == "annuaire_liste_par_onglet_sup_localisation" ||
$currentRoute == "annuaire_liste_par_onglet_sup"
)
) {
$diplome = $niveauOnglet;
$itemDiplome = $this->doctrine->getRepository(ItemsInsertion::class)->findOneBy(['identifiant'=>$diplome, 'niveau'=>4]);
if ($itemDiplome == null)
return $this->redirectToRoute("annuaire_liste_par_onglet_sup", [], 301);
}
$currentURL = $request->getPathInfo();
// Le "---", comme le "tout", permet d'achapper à une recherche par mot clé, voir Moteur::filtreTexte()
if ($quoi == null) {
$quoi = $typeOnglet . '---' ?? $niveauOnglet . '---' ?? 'tout';
}
if ($currentRoute != "annuaire_liste" && $currentRoute != "annuaire_catho" && $currentRoute != "annuaire_prive") {
// $quoi = ''; // Faut rien mettre ici
$parametres->disableQuoi = true;
$lieu = 'default'; // Valeur par défaut, ATT doit exister dans aep.region
// Vérifier si on a choisi un lieu
$lieuTemp = $this->slugify->revealLieu($localisation ?? $sousTypeOnglet ?? $niveauOnglet);
if ($lieuTemp) {
$className = get_class($lieuTemp);
if (in_array($className, ['Region', 'Departement', 'Ville']));
$lieu = $localisation ?? $sousTypeOnglet ?? $niveauOnglet;
}
}
//
// Retrocompatibilité avec le slug lieu à l'ancienne
//
$rawLieu = $lieu;
$lieu = $this->slugify->revealLieu($lieu);
$quoi = $this->slugify->revealQuoi($quoi);
//
// Rédirige vers la page d'accueil du $quoi si le lieu n'exixte pas
//
if (!$lieu) {
return $this->redirectToRoute(
'annuaire_quoi',
['quoi' => $quoi->getSlug()],
Response::HTTP_MOVED_PERMANENTLY
);
}
//
// Rédirige ancienne région vers sa nouvelle région
//
if ($lieu instanceof AncienneRegion) {
$region = $lieu->getRegion();
$url = $this->pathBuilder->buildAnnuaireListe($quoi, $region);
return $this->redirect($url);
}
//
// Cherche des établissements
//
$isCrawler = $this->crawlerDetect->isCrawler();
if ($currentRoute == "annuaire_liste") {
//
// Liste de résultat suite à une recherche par le moteur quoi/où
//
$parametres->setQuoiLieu($quoi, $lieu);
} else {
//
// Liste de résultat depuis les onglets (menu principal)
// Si une localisation a déjà été définie il faut la garder comme valeur par défaut
//
if (!$lieu && $lieu->getSlug() != "default" || ($niveauOnglet == "tout" && $sousTypeOnglet == null)) {
// Liste de toutes les régions, car le param lieu est obligatoire !
$regions = $this->getDoctrine()->getManager()->getRepository(Region::class)->findAll();
$parametres->setQuoiLieu($quoi, $lieu, $regions); // Toutes les régions
} else {
$parametres->setQuoiLieu($quoi, $lieu);
}
//
// Appliquer les filtres
//
// avec les écoles on avait $niveauOnglet comme slug (maternelle/eleménatire), mais à un certain moment
// le form est passé en GET pur, mais récupérer cette var n'a pas été adapté
@$niveau = $request->query->get('niveau');
$lesFiltres = [
'typeOnglet' => $typeOnglet,
'niveauOnglet' => isset($niveau) & !empty($niveau) ? $niveau[0] : $niveauOnglet,
'sousTypeOnglet' => $sousTypeOnglet,
'quoi' => $quoi,
'lieu' => $lieu,
];
// dump("typeOnglet: $typeOnglet / niveauOnglet: $niveauOnglet / sousTypeOnglet: $sousTypeOnglet");
// if ($lieu->getSlug() == "default")
// throw $this->createNotFoundException("Cette page n'exite pas !");
$parametres = $this->filtrer($parametres, $request, $lesFiltres, $this->slugify);
}
$parametres->pageActuele = $request->query->getInt('page', 1);
$parametres->maxParPage = $isCrawler ? self::MAX * 2 : self::MAX;
$etablissements = $this->moteur->cherche($parametres);
$lastPage = (int) (ceil($etablissements->getTotalItemCount() / $etablissements->getItemNumberPerPage()));
if($lastPage > 0 && $parametres->pageActuele > $lastPage){
if($currentRoute == 'annuaire_catho' or $currentRoute == 'annuaire_prive'){
return $this->redirectToRoute(
$currentRoute,
['lieu' => $lieu
]);
}
if($currentRoute == 'annuaire_liste'){
return $this->redirectToRoute(
$currentRoute,
[
'quoi' => $quoi,
'lieu' => $lieu,
]);
}
if($currentRoute == 'annuaire_liste_par_onglet_sup'){
return $this->redirectToRoute(
$currentRoute,
[ 'sousTypeOnglet' => $sousTypeOnglet,
'niveauOnglet' => $niveauOnglet,
]);
}
if($currentRoute == 'annuaire_liste_par_onglet_sup_localisation'){
return $this->redirectToRoute(
$currentRoute,
[ 'sousTypeOnglet' => $sousTypeOnglet,
'niveauOnglet' => $niveauOnglet,
'localisation' => $localisation,
]);
}
if($currentRoute == 'annuaire_liste_par_onglet'){
return $this->redirectToRoute(
$currentRoute,
['typeOnglet' => $typeOnglet,
'niveauOnglet' => $niveauOnglet,
]);
}
if($currentRoute == 'annuaire_liste_par_onglet_localisation'){
return $this->redirectToRoute(
$currentRoute,
['typeOnglet' => $typeOnglet,
'niveauOnglet' => $niveauOnglet,
'localisation' => $localisation,
]);
}
}
//
// Contexte de recherche pour permettre naviger entre les fiches
//
$contextRecherche = $this->moteur->createContext($parametres);
$this->userTransient->set(UserTransient::CONTEXTE_RECHERCHE, $contextRecherche);
$repositoryRegion = $this->getDoctrine()->getRepository(Region::class);
$repositoryDepartement = $this->getDoctrine()->getRepository(Departement::class);
$repositoryVille = $this->getDoctrine()->getRepository(Ville::class);
$regions = $repositoryRegion->findAllVisibles($typeOnglet);
$departements = $repositoryDepartement->findRelatifsAuLieu($lieu, $typeOnglet);
// Garder les villes avaec au moins un établissement
// Si on est dans une ville on doit modifier les paramètres afin que le lieu soit le département
$parametresVille = clone $parametres;
if ($lieu instanceof Ville) {
$laVille = $lieu->getDepartement();
$parametresVille->setLieu($laVille);
}
$idsVilleContexte = $this->moteur->getIdsVille($parametresVille); // Id unique des villes du contexte de recherche établissements actuel
$villes = ($lieu instanceof Departement || $lieu instanceof Ville) ? $repositoryVille->findRelatifsAuLieu($lieu, $typeOnglet, $idsVilleContexte) : null;
$idsVilleContexte = \array_slice($idsVilleContexte, 0, 100);
$villesContexte = $idsVilleContexte
? $repositoryVille->findBy(['id' => $idsVilleContexte], ['libelle' => 'ASC'])
: [];
// $this->historique->addRecherche($quoi, $lieu, 'annuaire_liste');
$this->historique->addRecherche($quoi, $lieu, $currentRoute, $requestUri);
//
// Les filtres
//
$niveaux = $this->getDoctrine()->getRepository(Items::class)->getNiveaux($typeOnglet);
$idsFiltresContexte = $this->moteur->getIdsFiltres($parametresVille);
$filieres = $this->getDoctrine()->getRepository(Items::class)->getFilieresFiltred($this->ongletSlug2Id($typeOnglet, $niveauOnglet), $idsFiltresContexte);
$diplomes = $request->query->get('filiere') ?
$this->getDoctrine()->getRepository(Items::class)->getDiplomes($this->ongletSlug2Id($typeOnglet, $niveauOnglet), $request->query->get('filiere'), $idsFiltresContexte) :
null;
//
// Les langues
//
$idsLvaContexte = $this->moteur->getIdsLVx($parametresVille, 'lva');
$lva = $this->getDoctrine()->getRepository(Items::class)->getLVx('LV1', $typeOnglet, $idsLvaContexte);
$idsLvbContexte = $this->moteur->getIdsLVx($parametresVille, 'lvb');
$lvb = $this->getDoctrine()->getRepository(Items::class)->getLVx('LV2', $typeOnglet, $idsLvbContexte);
//
// Enseignements de spécialités (pour les Lycées Généraux seulement)
//
$idsEdsContexte = $this->moteur->getIdsEenseignementsDeSpecialite($parametresVille, 'lva');
$enseignementsDeSpecialite = $this->getDoctrine()->getRepository(Items::class)->getEnseignementsDeSpecialite($idsEdsContexte);
// Traitement pour "onglet/internat/{lieu}" : trouver les types d'internat avec établissements
// pour ne pas afficher les types d'internat vides (ecole, college, lycee, pro, superieur)
$idsTypesInternat = $this->moteur->getIdsTypesInternat($parametresVille);
// Ne pas afficher les filtres et diplomes dans certains cas :
// - onglet/superieur/niveau (tout)
// - onglet/lucee (tout)
if (
($typeOnglet == "superieur" && $niveauOnglet == "tout")
or ($typeOnglet == "superieur" && $sousTypeOnglet != "niveau")
or ($typeOnglet == "professionnel" && !in_array($niveauOnglet, ['cap', 'bac-pro', 'formation-pro-continue']))
// or ($typeOnglet == "lycee" && !in_array($niveauOnglet, ['technologique', 'general']))
) {
$filieres = $diplomes = null;
}
if ($typeOnglet == "lycee" && $niveauOnglet != "technologique")
$filieres = null;
if ($typeOnglet == "lycee" && $niveauOnglet == "general")
$filieres = $diplomes = null;
// QueryString : tous les paramètres (les inputs du filtre)
$qs = $request->query->all();
// Récupérer les anciens filtres
$queryString = \serialize($qs);
// Construire l'url sans localisation si on y est dedans
// Quand on choisi une localisation on ajoute la zone à la fin de l'url
// on l'enlève pour qu'elle puisse être utlisée par les autres lites (on en a 3 : région, dpt, ville)
// ceci fixe le pb de localisation du supérieur
if ($lieu && $lieu->getSlug() != "default" && !$localisation) {
$localisation = $lieu->getSlug();
}
if ($localisation) {
$lieuTemp = $this->slugify->revealLieu($localisation);
} elseif ($niveauOnglet) {
$lieuTemp = $this->slugify->revealLieu($niveauOnglet);
} else {
$urls = explode("/", $currentURL);
$localisationTemp = end($urls);
$lieuTemp = $this->slugify->revealLieu($localisationTemp ?? 'foobar');
}
if (
$lieuTemp != null &&
($lieuTemp instanceof Region || $lieuTemp instanceof Departement || $lieuTemp instanceof Ville)
) {
// Le dernier parmetre de l'url est bien une localisation, on la supprime pour retrouver l'url de l'onglet
$currentURL = explode("/", $currentURL);
array_pop($currentURL);
$currentURL = implode("/", $currentURL);
}
$diplomeLibelle = [];
if (in_array($typeOnglet, ['lycee', 'professionnel', 'superieur']))
$diplomeLibelle = $this->getDoctrine()->getRepository(ItemsInsertion::class)->getDiplomeLibelle($niveauOnglet);
$region = null;
$departement = null;
$ville = null;
$recherche_type = null;
if ($lieu instanceof Ville) {
$recherche_type = "niveau_ville";
$ville = $lieu;
$departement = $lieu->getDepartement();
$region = $departement ? $departement->getRegion() : null;
} elseif ($lieu instanceof Departement) {
$recherche_type = "niveau_departement";
$departement = $lieu;
$region = $lieu->getRegion();
} elseif ($lieu instanceof Region) {
$recherche_type = "niveau_region";
$region = $lieu;
if ($region && $region->getLibelle() == "DEFAULT") {
$region = null;
$recherche_type = null;
}
}
// SEO : ne pas indexer une page résultat vide
// $noindex = count($etablissements) == 0 ? true : false;
// maj : si 0 étabs => si page NON géolocalisée : on indexe, SINON on n'indexe pas
$noindex = false;
if (count($etablissements) == 0) {
if ($lieu->getSlug() != "default") {
// $noindex = true;
$currentRoute = $request->attributes->get('_route');
switch ($currentRoute) {
case 'annuaire_liste_par_onglet_sup':
case 'annuaire_liste_par_onglet_sup_localisation':
return $this->redirectToRoute('annuaire_liste_par_onglet_sup', [
"niveauOnglet" => "tout", //$niveauOnglet, // TODO : si c'est une ville ou dpt, rediriger vers la région
"sousTypeOnglet" => null,
], 301);
break;
case 'annuaire_liste_par_onglet':
case 'annuaire_liste_par_onglet_localisation':
return $this->redirectToRoute('annuaire_liste_par_onglet', [
"typeOnglet" => $typeOnglet,
"niveauOnglet" => "tout", //$niveauOnglet, // TODO : si c'est une ville ou dpt, rediriger vers la région
], 301);
break;
default:
return $this->redirectToRoute('homepage', [], 301);
}
}
}
// Recherche du bon texte de référencement
$formation = self::ongletSlug2Id($typeOnglet, $niveauOnglet);
// Vérifier si on est dans une liste par filière/secteur
$filiere = $request->query->get('filiere'); // Ceci est un tableau
if ($filiere) {
// Protection des URLs
if (!is_array($filiere))
throw new NotFoundHttpException("Cette page n'existe pas ??");
$filiere = $filiere[0];
}
// On prend toujours le 1er !
// Vérifier si on est dans une liste par diplome
$diplome = $request->query->get('diplome');
if ($diplome) {
// Protection des URLs
if (!is_array($diplome))
throw new NotFoundHttpException("Cette page n'existe pas ???");
$diplome = $diplome[0];
// Gérer le cas de ?diplome[]=bac-stav-sciences-et-technologies-de-l-agronomie-et-du-vivant--lyc-bactec-agri-bacstavvi
if (strpos($diplome, '--') !== false) {
$temp = \explode("--", $diplome);
$diplome = strtoupper($temp[1]);
return $this->redirectToRoute(
'annuaire_liste_par_onglet',
['niveauOnglet' => $niveauOnglet, 'typeOnglet' => $typeOnglet, 'diplome[]' => $diplome],
301
);
}
} else {
// Gérer le cas où on tombe sur la page diplome depui un lien direct (et non pas des filtres)
if ($niveauOnglet && strpos($niveauOnglet, '--') !== false) {
$temp = \explode("--", $niveauOnglet);
$diplome = $temp[1];
$formation = $typeOnglet;
return $this->redirectToRoute(
'annuaire_liste_par_onglet',
['niveauOnglet' => $niveauOnglet, 'typeOnglet' => $typeOnglet, 'diplome[]' => $diplome],
301
);
}
}
// Vérifier que le dipôme existe bien
if ($diplome) {
$itemDiplome = $this->getDoctrine()->getRepository(Items::class)->findOneById($diplome);
if (!$itemDiplome)
return $this->redirectToRoute(
'annuaire_liste_par_onglet',
['niveauOnglet' => $niveauOnglet, 'typeOnglet' => $typeOnglet],
301
);
}
// Vérifier que la filiere existe bien
if ($filiere) {
$itemFiliere = $this->getDoctrine()->getRepository(Items::class)->findOneById($filiere);
if (!$itemFiliere)
return $this->redirectToRoute(
'annuaire_liste_par_onglet',
['niveauOnglet' => $niveauOnglet, 'typeOnglet' => $typeOnglet],
301
);
}
// Pouvoir définir un slug pour lui affecter un text SeoTexteReferencementDiplome
if (
$formation === null || trim($formation) == "" ||
/* Un internat avec un niveau donné et qui ne soit pas un lieu : ecole|college|lycee|superieur */
($typeOnglet == "internat" && $niveauOnglet != "tout" && $this->slugify->revealLieu($niveauOnglet) === null)
) {
$formation = $typeOnglet . "-" . $niveauOnglet;
}
// On fait un cas particulier pour lycee-general, on laisse les autres cas (LYC et LYC-BACTEC) car déjà utilisés dans la table Seo
if ($typeOnglet == "lycee" && $niveauOnglet != null && $niveauOnglet == "general") {
$formation = "LYC-GEN";
}
list($seoTitre, $seoTexte) = $this->getDoctrine()->getRepository(SeoTexteReferencementDiplome::class)->getTitreEtTexte($formation, $filiere, $diplome, $lieu);
if ($typeOnglet == "internat" && $lieu instanceof Region or $lieu instanceof Departement) {
$zone1 = ['Alsace', 'Champagne-Ardenne', 'Lorraine', 'Nord-Pas-de-Calais'];
$zone2 = ['Aquitaine', 'Limousin', 'Midi-Pyrénées', 'Poitou-Charentes'];
$zone3 = ['Bretagne', 'Normandie', 'Pays-de-Loire'];
$zone4 = ['Languedoc-Roussillon', 'Provence-Alpes-Côte-d\'Azur', 'Rhône-Alpes'];
$zone5 = ['Auvergne', 'Bourgogne', 'Centre', 'Franche-Comté'];
$zone6 = ['Ile-de-France'];
if ($lieu instanceof Region) {
$regionInternat = $lieu->getLibelle();
} else {
$regionInternat = $lieu->getRegion()->getLibelle();
}
$zone = '';
if (\in_array($regionInternat, $zone1)) {
$zone = 'Z1';
} elseif (\in_array($regionInternat, $zone2)) {
$zone = 'Z2';
} elseif (\in_array($regionInternat, $zone3)) {
$zone = 'Z3';
} elseif (\in_array($regionInternat, $zone4)) {
$zone = 'Z4';
} elseif (\in_array($regionInternat, $zone5)) {
$zone = 'Z5';
} elseif (\in_array($regionInternat, $zone6)) {
$zone = 'Z6';
}
$internats = $this->getDoctrine()->getRepository(ZonesInternat::class)->findByZone($zone);
}
// Récupère tous les diplômes des établissements
$itemsInsertions = null;
if (in_array($typeOnglet, ['lycee', 'professionnel', 'superieur']))
$itemsInsertions = $this->getDoctrine()->getRepository(ItemsInsertion::class)->getDiplomePlusByEtablissements($etablissements);
$contextSlug = $this->get('router')->generate($request->attributes->get('_route'));
//Page
if ($request->query->getInt('page')) {
$contextSlug = $this->get('router')->generate($request->attributes->get('_route'), ['page' => $request->query->get('page')]);
}
// $count = count($etablissements);
$count = $this->moteur->count($parametres);
// << IdKY mais ça retourne un faux nbr quand il n'y a aucun résultat
// ça renvoi _shards.total au lieu de hits.total (si le 2ème = 0 le 1er ne l'est pas !!! )
if(count($etablissements) == 0)
$count = 0;
// Découper le texte SEO en deux via le séparateur <hr /> à insérer depuis l'admin
$seoTextePart1 = $seoTextePart2 = $metadesc = $seoParagId = null;
$countSeo = $count;
if ($seoTexte) {
$seoParagId = $this->extractParagId($seoTexte);
if ($countSeo <=1 )
$countSeo = "";
$seoTexte = str_replace('[nbr-etabs]', $countSeo, $seoTexte);
$seoTexte = str_replace(['[region]', '[dept]', '[ville]'], $lieu->getLibelle(), $seoTexte);
// Remove <div> and </div> tags, Aurlie adds them sametimes, idk why/how !!
$seoTexte = preg_replace("/<\/?div[^>]*>/", "", $seoTexte);
$parts = preg_split("/<hr\s*\/?>/", $seoTexte); // gère <hr /> ou <hr/>
$seoTextePart1 = $parts[0];
$seoTextePart2 = $parts[1] ?? null ;
// Pour le metadesc
$metadesc = $seoTextePart1;
$metadesc = html_entity_decode($metadesc, ENT_QUOTES);
$metadesc = strip_tags($metadesc);
$metadesc = trim(preg_replace('/\s+/', ' ', $metadesc)); // remove \r\n
}
//Context Create for navigation with next & prev
if($count < 3000){
$context = $this->engine->createContext($parametres);
$context->slug = $contextSlug;
$this->userTransient->set(UserTransient::CONTEXTE_RECHERCHE, $context);
}
// TODO : self::MAX requetes sql (INSERT) exécutées ici !!
$this->traceur->add(Trace::ANNUAIRE_AFFICHAGE, $etablissements);
// Redirect page 1 to root URL
if(
$request->query->get('page') == '1' ||
$request->query->get('page') === '0' ||
(int) $request->query->get('page') < 0 ||
(int) $request->query->get('page') > $etablissements->getPageCount()
){
return $this->redirectToRoute(
'annuaire_liste_par_onglet',
['niveauOnglet' => $niveauOnglet, 'typeOnglet' => $typeOnglet],
301
);
}
// Pour vider le cache twig quand c nécessaire
$cacheId = $typeOnglet . "_" . $niveauOnglet . "_" . $count . "_" . $this->moteur->genereGraine($parametres) . "_" . $request->query->getInt('page');
// Pour seulement le bloc localisation, qui ne change pas tt les jours
$cacheIdLocalisation = $lieu->getSlug();
// PoC : ne pas afficher les filieres sans étabs
// $filieresNew = null;
// foreach ($filieres as $filiere) {
// $param = new Parametres();
// $param->setQuoiLieu($filiere, $lieu);
// $etabs = $this->moteur->count($param);
// if ($etabs > 0)
// $filieresNew[] = $filiere;
// }
// $filieres = $filieresNew;
// FAQ
$faqs = $this->getDoctrine()->getRepository(Faq::class)->findBy([
'onglet' => $typeOnglet,
'niveau' => $niveauOnglet != "tout" ? $niveauOnglet : null,
'filiere' => $request->query->get('filiere') ? $request->query->get('filiere')[0] : null,
'diplome' => $request->query->get('diplome') ? $request->query->get('diplome')[0] : null,
'visible' => true
], ['ordre' => 'ASC', 'updatedAt' => 'DESC']);
// Pour dataLyer (plan de marquage)
if ($currentRoute == "annuaire_prive")
$listeType = "annuaire_general";
else
$listeType = "annuaire";
return $this->render('annuaire/liste.html.twig', [
'quoi' => $quoi,
'lieu' => $lieu,
// Pour dataLayer
'region' => $region,
'departement' => $departement,
'ville' => $ville,
'recherche_type' => $recherche_type,
'regions' => $regions,
'departements' => $departements,
'villes' => $villes,
'villesContexte' => $villesContexte,
'parametres' => $parametres,
'etablissements' => $etablissements,
'isCrawler' => $isCrawler,
'niveaux' => $niveaux,
'filieres' => $filieres,
'diplomes' => $diplomes,
'itemsInsertions' => $itemsInsertions,
'lva' => $lva, // Langues vivantes A/B
'lvb' => $lvb, // Langues vivantes A/B
'diplomeLibelle' => $diplomeLibelle,
'enseignementsDeSpecialite' => $enseignementsDeSpecialite,
'typeOnglet' => $typeOnglet,
'sousTypeOnglet' => $sousTypeOnglet,
'niveauOnglet' => $niveauOnglet,
'queryString' => $queryString,
'getQueryString' => $getQueryString,
'getQueryStringSafe' => $getQueryStringSafe,
'currentURL' => $currentURL,
'noindex' => $noindex,
'seoTitre' => $seoTitre,
'seoTextePart1' => $seoTextePart1,
'seoTextePart2' => $seoTextePart2,
'metadesc' => $metadesc,
'seo_parag_id' => $seoParagId,
'formation' => $formation,
'count' => $count,
'internats' => $internats ?? null,
'pageOne' => $request->query->getInt('page') == 1 Or $request->query->getInt('page') == 0 ? true : false,
'cache_id' => $cacheId,
'cache_id_localisation' => $cacheIdLocalisation,
'currentRoute' => $currentRoute,
'diplome' => $diplome,
'faqs' => $faqs,
'idsTypesInternat' => $idsTypesInternat, // pour la liste des internats, afin de savoir quels items afficher dans l'aide au choix
'idsFiltresContexte' => $idsFiltresContexte,
'liste_type' => $listeType
]);
}
/**
* @Route(
* "/annuaire-voir-plus/{quoi}/{lieu}/{page}",
* requirements={"page": "\d+"},
* name="annuaire-liste-voir-plus",
* methods={"GET"},
* options = { "expose" = true }
* )
* @Cache(expires="+1 minute", public=false)
*/
public function voirPlus(
Request $request, string $quoi, string $lieu, int $page
): Response {
$quoi = $quoi == "*" ? "" : $quoi;
$quoi = $this->slugify->revealQuoi($quoi);
$lieu = $this->slugify->revealLieu($lieu);
$typeOnglet = $request->query->get('pTypeOnglet');
$sousTypeOnglet = $request->query->get('pSousTypeOnglet');
$niveauOnglet = $request->query->get('pNiveauOnglet');
$queryString = $request->query->get('pQueryString');
//$qs = $serializer->deserialize($queryString, Request::class, 'json');
$qs = \unserialize($queryString);
$req = new Request();
$req->initialize($qs);
$parametres = new Parametres();
$parametres->pageActuele = $page;
$parametres->maxParPage = self::MAX;
if ($typeOnglet != "") { // Ce param existe toujours si on arrive depuis l'onglet !
// Appliquer les filtres
$lesFiltres = [
'typeOnglet' => $typeOnglet,
'niveauOnglet' => $niveauOnglet,
'sousTypeOnglet' => $sousTypeOnglet,
'quoi' => $quoi,
'lieu' => $lieu,
];
$parametres = $this->filtrer($parametres, $req, $lesFiltres, $this->slugify);
// $parametres->setQuoiLieu($quoi, $lieu);
} elseif (!empty($req)) {
// un résultat annuaire-catho/prive, on a besoin de $req (pour filtrer les catho)
$lesFiltres = [
'typeOnglet' => "",
'niveauOnglet' => "",
'sousTypeOnglet' => "",
'quoi' => $quoi,
'lieu' => $lieu,
];
$parametres = $this->filtrer($parametres, $req, $lesFiltres, $this->slugify);
$parametres->setQuoiLieu($quoi, $lieu);
} else {
// Un résultat du quoi/où
$parametres->setQuoiLieu($quoi, $lieu);
}
$etablissements = $this->moteur->cherche($parametres);
$this->traceur->add(Trace::ANNUAIRE_AFFICHAGE, $etablissements);
return $this->render('annuaire/liste-voir-plus.html.twig', [
'parametres' => $parametres,
'etablissements' => $etablissements,
'lieu' => $lieu,
]);
}
/**
* @Route("/organismes-agrees", name="organismes-agrees", methods={"GET"})
*/
public function organismesAgrees(): Response
{
$quoi = $this->slugify->revealQuoi('selection-d-organismes-agrees');
// Cherche des établissements
$parametres = new Parametres();
$parametres->setQuoi($quoi);
$parametres->pageActuele = 1;
$parametres->maxParPage = 100;
$parametres->payantsSeulement = true;
$etablissements = $this->moteur->cherche($parametres);
// Récupere les actualités
/** @var ActualiteRepository $repositoryActualite */
$repositoryActualite = $this->getDoctrine()->getRepository(Actualite::class);
$actualites = $repositoryActualite->findByQuoiLieu($quoi, null, self::MAX_ACTUALITE);
return $this->render('annuaire/organismes-agrees.html.twig', [
'quoi' => $quoi,
'etablissements' => $etablissements,
'actualites' => $actualites,
'parametres' => $parametres,
]);
}
// Renvoi le code en partant du slug (de l'url)
public static function ongletSlug2Id($typeOnglet, $niveauOnglet)
{
switch ($typeOnglet) {
// Pour le SEO Onglet & Dipmome - Utilisé par SeoTexteReferencementDiplome::getTitreEtTexte pour retrouver
// le texte SEO de la liste (national/regional/departemental)
// Utilisé aussi pour trouver la liste des filières et des diplômes
case 'ecole':
$res = [
'maternelle' => 'ecole-maternelle-',
'elementaire' => 'ecole-elementaire-',
'tout' => 'ecole-',
];
break;
case 'college':
case 'internat':
case 'annuaire-enseignement-catholique':
case 'annuaire-enseignement-prive':
case 'formations-a-distance':
return $typeOnglet . "-";
break;
case 'lycee':
$res = [
'technologique' => 'LYC-BACTEC-',
'general' => 'LYC-',
'tout' => 'LYC-',
];
break;
case 'professionnel':
$res = [
'cap' => 'LYCPRO-CAP-',
'bac-pro' => 'LYCPRO-BACP-',
'formation-pro-continue' => 'LYCPRO-FPC-',
'tout' => 'LYCPRO-',
];
break;
case 'superieur':
$res = [
'bac-2-bts' => 'PBAC-BAC2-',
'bac-3-licence' => 'PBAC-BAC3-',
'bac-4-bac-5-master' => 'PBAC-BAC45-',
'ecoles-d-ingenieurs' => 'PBAC-ING-',
'classes-preparatoires' => 'PBAC-PREPA-',
'formation-professionnelle-continue' => 'PBAC-FPC-',
'niveau' => 'PBAC-',
];
break;
default:
return '%';
}
return $res[$niveauOnglet] ?? $res['tout'] ?? null;
}
public static function filtrer(Parametres $parametres, Request $request, array $lesFiltres = null, $slugify = null)
{
// Crée des variables à partir du tableau associatif
extract($lesFiltres);
$statut = $request->query->get('statut'); // Ceci est un array
if ($statut) {
// Protection des URLs
if (!is_array($statut))
throw new NotFoundHttpException("Cette page n'exite pas ?");
if (\in_array('sous-contrat', $statut)) {
$parametres->sousContrat = true;
}
if (\in_array('hors-contrat', $statut)) {
$parametres->sousContrat = false;
}
if (\in_array('catholique', $statut)) {
$parametres->catholique = true;
}
if (\in_array('laique', $statut)) {
$parametres->catholique = false;
}
}
$autre = $request->query->get('autre'); // Ceci est un array
if ($autre) {
$parametres->filtresShouldMust = "should";
$parametres->addFiltres($autre);
}
$alternance = $request->query->get('alternance'); // Ceci est un array
if ($alternance) {
// Protection des URLs
if (!is_array($alternance))
throw new NotFoundHttpException("Cette page n'exite pas ?");
if (\in_array('oui', $alternance)) {
$parametres->alternance = true;
}
if (\in_array('non', $alternance)) {
$parametres->alternance = false;
}
}
// ECOLES
if ('ecole' == $typeOnglet) {
// Gestion des filtres
$ages = $request->query->get('age');
if (!empty($ages)) {
// Protection des URLs
if (!is_array($ages))
throw new NotFoundHttpException("Cette page n'exite pas ?");
if (count($ages) == 1) {
$parametres->ageAdmission = (int) $ages[0];
}
}
if ('maternelle' == $niveauOnglet || '01-MATER' == $niveauOnglet) {
$parametres->types = ['01-MATER', '03-PRIM'];
} elseif ('elementaire' == $niveauOnglet || '02-ELEM' == $niveauOnglet) {
$parametres->types = ['02-ELEM', '03-PRIM'];
} elseif ('tout' == $niveauOnglet) {
$parametres->types = ['02-ELEM', '03-PRIM', '01-MATER'];
} else {
// $niveauOnglet est un lieu : Dpt, région ou ville
$lieu = $slugify->revealLieu($niveauOnglet);
if ( $lieu == null )
throw new NotFoundHttpException("Cette page n'exite pas !");
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->types = ['02-ELEM', '03-PRIM', '01-MATER'];
}
}
// COLLEGES
elseif ('college' == $typeOnglet) {
if ('tout' == $niveauOnglet) {
$parametres->types = ['04-COLL'];
} else {
$lieu = $slugify->revealLieu($niveauOnglet);
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->types = ['04-COLL'];
}
}
// LYCEES
elseif ('lycee' == $typeOnglet) {
if ('technologique' == $niveauOnglet) {
$parametres->types = ['06-LTECH', '07-LEGT'];
} elseif ('general' == $niveauOnglet) {
$parametres->types = ['05-LGEN', '07-LEGT'];
} elseif ('tout' == $niveauOnglet) {
$parametres->types = ['05-LGEN', '06-LTECH', '07-LEGT'];
} else {
// $niveauOnglet est un lieu : Dpt, région ou ville
$lieu = $slugify->revealLieu($niveauOnglet);
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->types = ['05-LGEN', '06-LTECH', '07-LEGT'];
}
}
// PRO
elseif ('professionnel' == $typeOnglet) {
$parametres->types = ['08-LAGRI', '09-LPROF', '10-LEAP'];
if ('cap' == $niveauOnglet) {
//$parametres->filtres = array_merge( ['LYCPRO-CAP'], $parametres->filtres);
$parametres->addFiltres(['LYCPRO-CAP-']);
} elseif ('bac-pro' == $niveauOnglet) {
$parametres->addFiltres(['LYCPRO-BACP-']);
} elseif ('formation-pro-continue' == $niveauOnglet) {
$parametres->addFiltres(['LYCPRO-FPC-']);
} elseif ('tout' == $niveauOnglet) {
$parametres->types = ['08-LAGRI', '09-LPROF', '10-LEAP'];
} else {
// $niveauOnglet est un lieu : Dpt, région ou ville
$lieu = $slugify->revealLieu($niveauOnglet);
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->types = ['08-LAGRI', '09-LPROF', '10-LEAP'];
}
}
// SUPERIEUR
elseif ('superieur' == $typeOnglet) {
$parametres->types = ['12-SUP'];
// Les Niveaux
if ("niveau" == $sousTypeOnglet) {
if ('bac-2-bts' == $niveauOnglet) {
$parametres->addFiltres(['SOUS_TYPE-BTSA']);
} elseif ('classes-preparatoires' == $niveauOnglet) {
$parametres->addFiltres(['SOUS_TYPE-EPRE']);
} elseif ('ecoles-d-ingenieurs' == $niveauOnglet) {
$parametres->addFiltres(['SOUS_TYPE-EING']);
} elseif ('bac-3-licence' == $niveauOnglet) {
$parametres->addFiltres(['PBAC-BAC3-']);
} elseif ('bac-4-bac-5-master' == $niveauOnglet) {
$parametres->addFiltres(['PBAC-BAC45-']);
} elseif ('formation-professionnelle-continue' == $niveauOnglet) {
$parametres->addFiltres(['PBAC-FPC']);
} elseif (null == $niveauOnglet) {
$lieu = $slugify->revealLieu('default');
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->filtres = ['SOUS_TYPE-BTSA', 'SOUS_TYPE-EPRE', 'SOUS_TYPE-EING', 'PBAC-BAC3-', 'PBAC-BAC45-', 'PBAC-FPC'];
// $parametres->addFiltres(['SOUS_TYPE-BTSA', 'SOUS_TYPE-EPRE','SOUS_TYPE-EING', 'PBAC-BAC3-', 'PBAC-BAC45-', 'PBAC-FPC']);
}
}
// Les filières
if ("filiere" == $sousTypeOnglet) {
// Si on filtre par diplomes on n'aura pas de non-participants dans la liste !
// $parametres->filtres = ['PBAC-'];
if ('commerce' == $niveauOnglet) {
$parametres->formations = ['PBAC-BAC2-CDV', 'PBAC-BAC3-CDV', 'PBAC-BAC45-CDV', 'PBAC-FPC-DISTRI', 'PBAC-PREPA-COM'];
} elseif ('audiovisuel' == $niveauOnglet) {
$parametres->formations = ['PBAC-BAC2-ART', 'PBAC-BAC3-ART', 'PBAC-BAC45-ART', 'PBAC-FPC-ART', 'PBAC-PREPA-ART'];
} elseif ('sciences' == $niveauOnglet) {
$parametres->formations = ['PBAC-BAC2-ENS', 'PBAC-BAC3-ENS', 'PBAC-BAC45-ENS', 'PBAC-FPC-ENS', 'PBAC-PREPA-ENS'];
} elseif ('medecine' == $niveauOnglet) { // peut être mieux changer par "santé" et regrouper medecine, pharmacie, infirmier ...
$parametres->formations = ['PBAC-PREPA-SASO', 'PBAC-FPC-SANT', 'PBAC-BAC3-SASO'];
} elseif ('ingenieur' == $niveauOnglet) {
$parametres->formations = ['PBAC-ING'];
// $parametres->addFiltres(['PBAC-ING']);
}
}
if ("diplome" == $sousTypeOnglet) {
if ("tout" != $niveauOnglet)
// $parametres->formations = [$niveauOnglet]; // je ne sais plus pq on passe par 'formations' alors que pour les diplomes lycée/pro on passe par 'filtres' !! En tout cas ça retourne le meme résultat
{
$parametres->addFiltres([$niveauOnglet]);
}
}
if ("" == $sousTypeOnglet) {
$lieu = $slugify->revealLieu('default');
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->types = ['12-SUP'];
}
}
// INTERNANT
elseif ('internat' == $typeOnglet) {
/*
Pour trouver les internats pour lycée, il faut lister tous les lycée et on aura l'id internat de chacun dans
la colonne 'Etablissement.Internats_Identifiant'
*/
if ("ecole" == $niveauOnglet) {
$parametres->typesInternat = ['01-MATER', '02-ELEM', '03-PRIM'];
} elseif ("college" == $niveauOnglet) {
$parametres->typesInternat = ['04-COLL'];
} elseif ("lycee" == $niveauOnglet) {
$parametres->typesInternat = ['05-LGEN', '06-LTECH', '07-LEGT'];
} elseif ("pro" == $niveauOnglet) {
$parametres->typesInternat = ['08-LAGRI', '09-LPROF', '10-LEAP'];
} elseif ("superieur" == $niveauOnglet) {
$parametres->typesInternat = ['12-SUP'];
} elseif ("tout" == $niveauOnglet) {
$parametres->typesInternat = ['01-MATER', '02-ELEM', '03-PRIM', '04-COLL', '05-LGEN', '06-LTECH', '07-LEGT', '08-LAGRI', '09-LPROF', '10-LEAP', '12-SUP', '00-DEFAULT'];
} else {
$parametres->typesInternat = ['01-MATER', '02-ELEM', '03-PRIM', '04-COLL', '05-LGEN', '06-LTECH', '07-LEGT', '08-LAGRI', '09-LPROF', '10-LEAP', '12-SUP', '00-DEFAULT'];
$parametres->typeRecherche = 'internat-geo';
// $niveauOnglet est un lieu : Dpt, région ou ville
$lieu = $slugify->revealLieu($niveauOnglet);
$parametres->setQuoiLieu($quoi, $lieu);
// $parametres->typesInternat = ['01-MATER', '02-ELEM', '03-PRIM', '04-COLL', '05-LGEN', '06-LTECH', '07-LEGT', '08-LAGRI', '09-LPROF', '10-LEAP', '12-SUP'];
// $parametres->typesInternat = ['04-COLL', '12-SUP'];
}
}
// RATTRAPAGE SCOLAIRE
elseif ('rattrapage-scolaire' == $typeOnglet) {
$parametres->types = ['15-ERSCOL'];
}
// FORMATIONS A DISTANCE
elseif ('formations-a-distance' == $typeOnglet) {
$parametres->types = ['13-EDIST'];
}
// AUTRE - section fourre-tout
elseif ('autre' == $typeOnglet) {
if ('tout' == $niveauOnglet) {
$parametres->types = ['14-ELANG', '15-ERSCOL', '16-ESPEC'];
} else {
$lieu = $slugify->revealLieu($niveauOnglet);
$parametres->setQuoiLieu($quoi, $lieu);
$parametres->types = ['14-ELANG', '15-ERSCOL', '16-ESPEC'];
}
}
// Filtre par Filières et/ou Diplômes
// Vu que ces champs sont en fonction du menu on peut écraser les filtres précédent (relatifs à un menu de l'onglet)
// $filiere = $request->query->get('filiere'); // Ceci est un array
// if ($filiere){
// $parametres->formations = $filiere;
// }
$filieres = $request->query->get('filiere'); // Ceci est un array
if ($filieres) {
// Protection des URLs
if (!is_array($filieres))
throw new NotFoundHttpException("Cette page n'exite pas ?");
$parametres->types = array(); // On n'en a plus besoin car $filieres sont déjà filtrés
$parametres->filtresShouldMust = "should";
$parametres->filtres = $filieres;
}
$diplomes = $request->query->get('diplome'); // Ceci est un array
if ($diplomes) {
// Protection des URLs
if (!is_array($diplomes))
throw new NotFoundHttpException("Cette page n'existe pas ?!?");
$parametres->filtresShouldMust = "should";
$parametres->filtres = $diplomes;
}
// Langues vivantes
$lva = $request->query->get('lva');
$lvb = $request->query->get('lvb');
if ($lva) {
// Protection des URLs
if (!is_array($lva))
throw new NotFoundHttpException("Cette page n'existe pas ??!");
$parametres->lva = $lva;
// $parametres->participantsSeulement = true;
}
if ($lvb) {
// Protection des URLs
if (!is_array($lvb))
throw new NotFoundHttpException("Cette page n'existe pas !??");
$parametres->lvb = $lvb;
// $parametres->participantsSeulement = true;
}
// EdS : Enseignements de spécialité
$eds = $request->query->get('eds');
if ($eds) {
$parametres->eds = $eds;
// $parametres->participantsSeulement = true;
}
// annuaire complet catho/prive
// Quand on affiche une liste générique (tous les types mélangés), le quoi est à "tout", le où est fixé, les autres sont vides
// du coup le code précédent n'entre dans aucune condition et on n'appelle jamais le setQuoiLieu !
if ($quoi->getSlug() == "tout") {
$parametres->setQuoiLieu($quoi, $lieu);
} elseif ($lieu != null) {
$parametres->setLieu($lieu);
}
return $parametres;
}
/**
* En entrée on a le texte SEO avec les données de début, la fonction fait le chemin inverse et récupère l'id de l'item SEO (un seul pour tt la categ, textes gérés ici : /backend/admin/seo-texte-referencement-diplome/ )
*/
private function extractParagId($seoText) {
$pattern = '/<!-- p#(NAT|REG|DPT|VIL)#(\d+) -->/';
// Rechercher les correspondances dans le texte
if (preg_match($pattern, $seoText, $matches))
return $matches[2];
return null;
}
}