<?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\Common\LieuInterface;
use DateTime;
use App\Entity\JPO;
use App\Entity\Ville;
use App\Entity\Region;
use App\Service\Slugify;
use Gaufrette\Filesystem;
use App\Entity\Departement;
use App\Entity\Etablissement;
use App\Entity\SeoTexteReferencementDiplome;
use Gaufrette\Adapter\Local as LocalAdapter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
final class JPOController extends AbstractController
{
private const LIMIT = 900;
private const HEADERLIMIT = 2; // Nbre de JPO à afficher dans l'onglet du header
private $router;
/** @var Slugify */
private $slugify;
public function __construct(Slugify $slugify, RouterInterface $router)
{
$this->slugify = $slugify;
$this->router = $router;
}
/**
* @Route("/portes-ouvertes/liste/{lieu}/{etablissement}", name="jpo-liste", defaults={"etablissement": null, "lieu":"default"}, methods={"GET", "POST"})
*/
public function list(?Etablissement $etablissement, Request $request, string $lieu=null): Response
{
// if (!$etablissement && $id) {
// return $this->redirectToRoute('jpo-liste');
// }
$filter = [];
if ($etablissement) {
$filter['etablissement'] = $etablissement->getId();
}
$currentURL = $request->getPathInfo();
if ($lieu != 'default') {
$currentURL = explode("/", $currentURL );
array_pop($currentURL);
$currentURL = implode("/", $currentURL );
}
$types = [];
$ecole = [];
$college = [];
$lycee = [];
$professionnel = [];
$superieur = [];
$niveaux = $request->query->get('niveau');
if($niveaux){
if(in_array('ecole', $niveaux))
$ecole = ['02-ELEM', '03-PRIM', '01-MATER'];
if(in_array('college', $niveaux))
$college = ['04-COLL'];
if(in_array('lycee', $niveaux))
$lycee = ['05-LGEN', '06-LTECH', '07-LEGT'];
if(in_array('professionnel', $niveaux))
$professionnel = ['08-LAGRI', '09-LPROF', '10-LEAP'];
if(in_array('superieur', $niveaux))
$superieur = ['12-SUP'];
$types = array_merge($ecole, $college, $lycee, $professionnel, $superieur);
}
$lieu = $this->slugify->revealLieu($lieu);
$regions = $this->getDoctrine()->getRepository(Region::class)->findAll();
$repositoryDepartement = $this->getDoctrine()->getRepository(Departement::class);
$repositoryVille = $this->getDoctrine()->getRepository(Ville::class);
$departements = $repositoryDepartement->findRelatifsAuLieu($lieu);
$villes = [];
$uniqueJpos = [];
$addedIds = [];
$repositoryJPO = $this->getDoctrine()->getRepository(JPO::class);
$jpos = $repositoryJPO->findByLieu($lieu, self::LIMIT, $filter, $types);
$jposTemp = $jpos;
$count = count($jpos);
// redirection si pas de jpos
if (!$jpos && $lieu instanceof Ville)
throw $this->createNotFoundException("Aucune Journée Porte Ouverte trouvée !");
// Garder uniquement les villes ayant au moins une JPO
if ($lieu instanceof Departement || $lieu instanceof Ville) {
// Si on est dans une ville on doit relance la recherche des JPOS pour le dpt de la ville en cours, sinon on aura les jpo du dpt et non pas de la ville !
if($lieu instanceof Ville)
$jposTemp = $repositoryJPO->findByLieu($lieu->getDepartement(), self::LIMIT, $filter, $types);
foreach ($jposTemp as $jpo) {
$idVille = $jpo->getEtablissement()->getVille()->getId();
// traitement pour filtrer les doublons des villes
if(!in_array($idVille, $addedIds)) {
$uniqueJpos[] = $jpo;
$addedIds[] = $idVille;
}
}
// boucle sur les villes filtrées
foreach ($uniqueJpos as $uniqueJpo) {
$ville = $uniqueJpo->getEtablissement()->getVille();
$villes[] = $ville;
}
}
list($seoTitre, $seoTexte) = $this->getDoctrine()->getRepository(SeoTexteReferencementDiplome::class)->getTitreEtTexte('jpo', null, null, $lieu);
if ($count <= 1)
$count = '';
if ($seoTitre){
$seoTitre = str_replace(['[region]', '[dept]', '[ville]'], $lieu->getLibelle(), $seoTitre);
$seoTitre = str_replace('[nbr-jpo]', $count, $seoTitre);
}
if ($seoTexte) {
$seoTexte = str_replace(['[region]', '[dept]', '[ville]'], $lieu->getLibelle(), $seoTexte);
$seoTexte = str_replace('[nbr-jpo]', $count, $seoTexte);
}
$robotsTag = null;
if ($lieu instanceof Ville)
$robotsTag = "noindex,follow";
return $this->render('jpo/list.html.twig', [
'etablissement' => $etablissement,
'jpos' => $jpos,
'regions' => $regions,
'departements' => $departements,
'villes' => $villes,
'niveaux' => $niveaux,
'currentURL' => $currentURL,
'lieu' => $lieu,
'seoTitre' => $seoTitre,
'seoTexte' => $seoTexte,
'robots_tag' => $robotsTag,
]);
}
/**
* @Route("/portes-ouvertes/fiche/{id}", name="jpo-etab", methods={"GET", "POST"})
*/
public function fiche(?JPO $jpo): Response
{
if (!$jpo)
return $this->redirectToRoute('jpo-liste', [], 301);
$currentURL = $this->router->generate('jpo-liste');
// Ne plus afficher une ancienne JPO
$now = new \DateTime("now");
if ($jpo->getDate()->format('Y-m-d') < $now->format('Y-m-d')) // ne pas comparer l'heure sinon les jpo d'aujourd'hui ne seront pas affichées !
return $this->redirectToRoute('jpo-liste', [], 301);
// $this->etabNonLuService->markAsRead($actualite);
return $this->render('jpo/fiche.html.twig', [
'jpo' => $jpo,
'currentURL' => $currentURL,
'lieu' => $jpo->getEtablissement()->getVille(),
]);
}
/**
* @Route(
* "/jpo/header",
* name="jpo-header",
* methods={"GET"}
* )
* @Cache(expires="+120 minutes")
*/
public function headerList(LieuInterface $lieu = null): Response
{
// Afficher les 2 dernières JPO en se basant sur la géoloc, on cherche dans ville sinon on monte plus haut
$jpos = null;
// dump($lieu);
if ($lieu and $lieu->getSlug() != "default") {
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
// dump($jpos);
if ($lieu instanceof Ville && count($jpos) <= 1) {
$lieu = $lieu->getDepartement();
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
// dump($jpos);
if (count($jpos) <= 1) {
$lieu = $lieu->getRegion();
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
// dump($jpos);
}
} elseif ($lieu instanceof Departement && count($jpos) <= 1) {
$lieu = $lieu->getRegion();
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
// dump($jpos);
} else { // région
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
// dump($jpos);
}
}
if (empty($jpos)) { // toutes les JPOs
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findBy(
[],
['date' => 'DESC'],
self::HEADERLIMIT
);
// dump($jpos);
}
return $this->render('jpo/dropdown.html.twig', [
'jpos' => $jpos,
]);
}
public function blocJPOsALaUne($type = null): Response
{
// Bloc "JPOs à la une"
$jpos = $this->getDoctrine()->getRepository(JPO::class)->findAlaUne(35);
if ( (!$jpos || empty($jpos)) && $type=='home')
$jpos = $this->getDoctrine()->getRepository(JPO::class)->getLast(6);
return $this->render('partial/jpo-une.html.twig', [
'jpos' => $jpos,
'type' => $type
]);
}
/**
* @Route("/portes-ouvertes/fiche/{id}/download", name="jpo-doc", methods={"GET", "POST"})
* @return RedirectResponse|Response
*/
public function download(?JPO $jpo)
{
$fileName = $jpo->getFileName();
/* dd($this->container->get('knp_gaufrette.filesystem_map')->get('jpo_fs'));
$filesystem =$this->container->get('gaufrette.jpo_fs_filesystem');*/
$fileStream = sprintf('gaufrette://jpo_fs/%s', 'public/storage/jpo/'.$fileName);
$response = new BinaryFileResponse($fileStream);
$response->headers->set('Content-Type', 'text/pdf');
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, null, $fileName);
return $response;
}
/**
* @Route("/portes-ouvertes/{lieu}/{etablissement}", name="jpo-liste-root", defaults={"etablissement": null, "lieu":"default"}, methods={"GET", "POST"})
*/
public function listRedirect(?Etablissement $etablissement, Request $request, string $lieu=null): Response
{
return $this->redirectToRoute('jpo-liste', ['etablissement' => $etablissement, 'lieu' => $lieu], 301);
}
}