<?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\Service;
use App\Common\LieuInterface;
use App\Common\QuoiInterface;
use App\Entity\Actualite;
use App\Entity\Banniere;
use App\Entity\Etablissement;
use Cocur\Slugify\Slugify;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
final class PathBuilder
{
/** @var RouterInterface */
private $router;
/** @var Slugify */
private $slugifier;
/** @var UserTransient */
private $userTransient;
public function __construct(RouterInterface $router, Slugify $slugifier, UserTransient $userTransient)
{
$this->router = $router;
$this->slugifier = $slugifier;
$this->userTransient = $userTransient;
}
// ----- Établissement -----------------------------------------------------
public function buildAnnuaire($quoi, $lieu, array $parametres = [], string $route = null, int $referenceType = null): string
{
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
// Lien vers la liste de mots cles
$quoi = $quoi instanceof QuoiInterface ? $quoi->getSlug() : (string) $quoi;
if (!$quoi) {
return $this->router->generate(
'annuaire',
$parametres,
$referenceType
);
}
// Lien vers la page d'accueil d'un "quoi"
$lieu = $lieu instanceof LieuInterface ? $lieu->getSlug() : (string) $lieu;
if (!$lieu) {
return $this->router->generate('annuaire_quoi', array_merge($parametres, [
'quoi' => $quoi,
]), $referenceType);
}
$route = !$route ? $this->userTransient->get(UserTransient::ROUTE_ANNUAIRE) : $route;
return $this->router->generate($route, array_merge($parametres, [
'quoi' => $quoi,
'lieu' => $lieu,
]), $referenceType);
}
public function buildAnnuaireCarte($quoi, $lieu, array $parametres = [], int $referenceType = null): string
{
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
return $this->buildAnnuaire($quoi, $lieu, $parametres, 'annuaire_carte', $referenceType);
}
public function buildAnnuaireListe($quoi, $lieu, array $parametres = [], int $referenceType = null): string
{
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
return $this->buildAnnuaire($quoi, $lieu, $parametres, 'annuaire_liste', $referenceType);
}
public function buildFiche(Etablissement $etablissement, array $parametres = [], int $referenceType = null): string
{
// TODO : lancer la cmd app:sync:etablissement:path lors de la 1ère utilisation, sinon pour info le consommateur va se charger d'init cet attribut
// PB : ça ne gère pas le 3ème param $referenceType ! On laisse tomber cette optimisation
/*
if ($etablissement->getPath() && $etablissement->getPath() != "") {
$url = $etablissement->getPath();
if ( $parametres && count($parametres) > 0 ) {
$queryString = http_build_query($parametres);
$url = $url . '?' . $queryString;
}
return $url;
}
*/
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
$denomination =
$etablissement->getDenomination() ??
$etablissement->getDenominationAbregee() ??
$etablissement->getDenominationSigle();
$ville = $etablissement->getVille();
$slug = $this->slugifier->slugify(implode('-', array_filter([
$denomination,
$ville ? $ville->getLibelle() : null,
// $ville ? $ville->getCodePostal() : null,
])));
return $this->router->generate('fiche', array_merge($parametres, [
'id' => $etablissement->getId(),
'slug' => $slug ?: 'etablissement',
]), $referenceType);
}
public function buildFicheInternat(Etablissement $etablissement, array $parametres = [], int $referenceType = null): string
{
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
$denomination =
$etablissement->getDenomination() ??
$etablissement->getDenominationAbregee() ??
$etablissement->getDenominationSigle();
$ville = $etablissement->getVille();
$slug = $this->slugifier->slugify(implode('-', array_filter([
$denomination,
$ville ? $ville->getLibelle() : null,
// $ville ? $ville->getCodePostal() : null,
])));
return $this->router->generate('fiche', array_merge($parametres, [
'id' => $etablissement->getInternat(),
'slug' => $slug ?: 'etablissement',
]), $referenceType);
}
public function buildFicheExterne(Etablissement $etablissement): ?string
{
$url = $etablissement->getUrl();
if (!$url) {
return null;
}
// Vérifie URL
$pieces = parse_url($url);
if (!$pieces) {
return null;
}
// Vérifie domaines bloqué
$blacklist = '#('.implode('|', [
'^paris\.fr$',
'\.paris\.fr$',
'\.adseniors\.com$',
]).')#';
if (preg_match($blacklist, $pieces['host'])) {
return $url;
}
// Ajoute utm_source, si possible
parse_str($pieces['query'] ?? '', $query);
if (empty($query['utm_source'])) {
$query['utm_source'] = 'enseignement-prive.info';
}
return
(!empty($pieces['scheme']) ? $pieces['scheme'].'://' : '').
(!empty($pieces['host']) ? $pieces['host'] : '').
(!empty($pieces['port']) ? ':'.$pieces['port'] : '').
(!empty($pieces['path']) ? ':'.$pieces['path'] : '').
'?'.http_build_query($query).
(!empty($pieces['fragment']) ? '#'.$pieces['fragment'] : '');
}
public function buildLogoListe(?string $identifiant): ?string
{
if (!$identifiant) {
return null;
}
// return sprintf(
// 'https://www.enseignement-prive.info/jouve/jpg_logos_liste/%s.jpg',
// $identifiant
// );
return sprintf(
'https://backoffice-jouve.onpc.fr/ano-images/logo-liste/%s.jpg',
$identifiant
);
}
public function buildLogoFiche(?string $identifiant): ?string
{
if (!$identifiant) {
return null;
}
// return sprintf(
// 'https://www.enseignement-prive.info/jouve/jpg_logos_fiche/%s.jpg',
// $identifiant
// );
return sprintf(
'https://backoffice-jouve.onpc.fr/ano-images/logo-fiche/%s.jpg',
$identifiant
);
}
public function buildPhoto(?string $identifiant): ?string
{
if (!$identifiant) {
return null;
}
// return sprintf(
// 'https://www.enseignement-prive.info/jouve/jpg_photos_fiche/%s.jpg',
// $identifiant
// );
return sprintf(
'https://backoffice-jouve.onpc.fr/ano-images/photo/%s.jpg',
$identifiant
);
}
// ----- Bannière ----------------------------------------------------------
public function buildBanniere(?Banniere $banniere): ?string
{
if (!$banniere) {
return null;
}
$image = $banniere->getImage();
if (!$image) {
return null;
}
return sprintf(
'https://backoffice-jouve.onpc.fr/ano/mep/images/bannieres/%s',
$image
);
}
// ----- Actualite ---------------------------------------------------------
public function buildActualiteEtablissement(Actualite $actualite, array $parametres = [], int $referenceType = null): string
{
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
$etablissement = $actualite->getEtablissement();
if ($etablissement)
return $this->buildFiche($etablissement);
else
return $this->router->generate('homepage');
}
public function buildActualiteEtablissementAmp(Actualite $actualite, array $parametres = [], int $referenceType = null): string
{
$referenceType = null !== $referenceType ? $referenceType : UrlGeneratorInterface::ABSOLUTE_PATH;
return $this->router->generate('actu-etab-amp', array_merge(
$parametres,
$this->buildActualiteEtablissementParameters($actualite)
), $referenceType);
}
private function buildActualiteEtablissementParameters(Actualite $actualite): array
{
$date = $actualite->getDatePublication();
$slug = $this->slugifier->slugify($actualite->getTitre());
return [
'id' => $actualite->getId(),
'slug' => $slug,
];
}
public function buildDefaultPath(Etablissement $e) {
if ($e->getTypeClient() == "internat")
return "/onglet/internat/";
if (null == $e->getType() || '' == $e->getType())
return "/#buildDefaultPath-404";
$niveau1 = [
'01-MATER' => 'ecole',
'02-ELEM' => 'ecole',
'03-PRIM' => 'ecole',
'04-COLL' => 'college',
'05-LGEN' => 'lycee',
'06-LTECH' => 'lycee',
'07-LEGT' => 'lycee',
'08-LAGRI' => 'professionnel',
'09-LPROF' => 'professionnel',
'10-LEAP' => 'professionnel',
'11-CFA' => 'superieur',
'12-SUP' => 'superieur',
'13-EDIST' => 'superieur',
'14-ELANG' => 'superieur',
'15-ERSCOL' => 'superieur',
'16-ESPEC' => 'superieur'
];
$url = "/onglet/" . $niveau1[$e->getType()];
// TODO: spécifier la région|dpt|ville en fonction du type/onglet
return $url;
}
public function buildOngletPath(string $route, string $typeOnglet, string $niveauOnglet, LieuInterface $lieu = null) {
if ($typeOnglet != "superieur" ) {
$lieu = $lieu instanceof LieuInterface ? $lieu->getSlug() : (string) $lieu;
if ($route === 'annuaire_liste_par_onglet' || $niveauOnglet === 'tout') {
return $this->router->generate(
'annuaire_liste_par_onglet',
['typeOnglet' => $typeOnglet, 'niveauOnglet' => $lieu ? $lieu : $niveauOnglet],
UrlGeneratorInterface::ABSOLUTE_URL
);
}
else if ($route === 'annuaire_liste_par_onglet_localisation') {
return $this->router->generate(
'annuaire_liste_par_onglet_localisation',
['typeOnglet' => $typeOnglet, 'niveauOnglet' => $niveauOnglet, 'localisation' => $lieu],
UrlGeneratorInterface::ABSOLUTE_URL
);
}
}
}
public function buildOngletPathEcole(string $typeOnglet, string $niveauOnglet, LieuInterface $lieu = null) {
if ($typeOnglet != "superieur" )
return $this->router->generate(
'annuaire_liste_par_onglet_localisation',
['typeOnglet' => $typeOnglet, 'niveauOnglet' => $niveauOnglet , 'localisation' => $lieu->getSlug()],
UrlGeneratorInterface::ABSOLUTE_PATH
);
}
public function buildLocalisationPath($route, $lieu): string
{
$lieu = $lieu instanceof LieuInterface ? $lieu->getSlug() : (string) $lieu;
return $this->router->generate(
$route, ['lieu' => $lieu],
UrlGeneratorInterface::ABSOLUTE_URL
);
}
}