src/Controller/JPOController.php line 250

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * Copyright (C) Office National de Publication et de Communication - All Rights Reserved
  5.  *
  6.  * Unauthorized copying of this file, via any medium is strictly prohibited by law
  7.  * This file is proprietary and confidential
  8.  */
  9. namespace App\Controller;
  10. use App\Common\LieuInterface;
  11. use DateTime;
  12. use App\Entity\JPO;
  13. use App\Entity\Ville;
  14. use App\Entity\Region;
  15. use App\Service\Slugify;
  16. use Gaufrette\Filesystem;
  17. use App\Entity\Departement;
  18. use App\Entity\Etablissement;
  19. use App\Entity\SeoTexteReferencementDiplome;
  20. use Gaufrette\Adapter\Local as LocalAdapter;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Routing\RouterInterface;
  25. use Symfony\Component\HttpFoundation\RedirectResponse;
  26. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  27. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  28. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  29. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  30. final class JPOController extends AbstractController
  31. {
  32.     private const LIMIT 900;
  33.     private const HEADERLIMIT 2// Nbre de JPO à afficher dans l'onglet du header
  34.     private $router;
  35.     /** @var Slugify */
  36.     private $slugify;
  37.     public function __construct(Slugify $slugifyRouterInterface $router)
  38.     {
  39.         $this->slugify $slugify;
  40.         $this->router $router;
  41.     }
  42.     /**
  43.      * @Route("/portes-ouvertes/liste/{lieu}/{etablissement}", name="jpo-liste", defaults={"etablissement": null, "lieu":"default"}, methods={"GET", "POST"})
  44.      */
  45.     public function list(?Etablissement $etablissementRequest $requeststring $lieu=null): Response
  46.     {
  47.         // if (!$etablissement && $id) {
  48.         //     return $this->redirectToRoute('jpo-liste');
  49.         // }
  50.         $filter = [];
  51.         if ($etablissement) {
  52.             $filter['etablissement'] = $etablissement->getId();
  53.         }
  54.         $currentURL $request->getPathInfo();
  55.         if ($lieu != 'default') {
  56.             $currentURL explode("/"$currentURL );
  57.             array_pop($currentURL);
  58.             $currentURL implode("/"$currentURL );
  59.         }
  60.         $types = [];
  61.         $ecole = [];
  62.         $college = [];
  63.         $lycee = [];
  64.         $professionnel = [];
  65.         $superieur = [];
  66.         $niveaux $request->query->get('niveau');
  67.         if($niveaux){
  68.           if(in_array('ecole'$niveaux))
  69.               $ecole = ['02-ELEM''03-PRIM''01-MATER'];
  70.           if(in_array('college'$niveaux))
  71.               $college = ['04-COLL'];
  72.           if(in_array('lycee'$niveaux))
  73.               $lycee = ['05-LGEN''06-LTECH''07-LEGT'];
  74.           if(in_array('professionnel'$niveaux))
  75.               $professionnel = ['08-LAGRI''09-LPROF''10-LEAP'];
  76.           if(in_array('superieur'$niveaux))
  77.               $superieur = ['12-SUP'];
  78.           $types array_merge($ecole$college$lycee$professionnel$superieur);
  79.         }
  80.         $lieu $this->slugify->revealLieu($lieu);
  81.         $regions $this->getDoctrine()->getRepository(Region::class)->findAll();
  82.         $repositoryDepartement $this->getDoctrine()->getRepository(Departement::class);
  83.         $repositoryVille $this->getDoctrine()->getRepository(Ville::class);
  84.         $departements $repositoryDepartement->findRelatifsAuLieu($lieu);
  85.         $villes = [];
  86.         $uniqueJpos = [];
  87.         $addedIds = [];
  88.         $repositoryJPO $this->getDoctrine()->getRepository(JPO::class);
  89.         $jpos $repositoryJPO->findByLieu($lieuself::LIMIT$filter$types);
  90.         $jposTemp $jpos;
  91.         $count count($jpos);
  92.         // redirection si pas de jpos
  93.         if (!$jpos && $lieu instanceof Ville)
  94.             throw $this->createNotFoundException("Aucune Journée Porte Ouverte trouvée !");
  95.     
  96.         // Garder uniquement les villes ayant au moins une JPO
  97.         if ($lieu instanceof Departement || $lieu instanceof Ville) {
  98.             // 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 !
  99.             if($lieu instanceof Ville)
  100.                 $jposTemp $repositoryJPO->findByLieu($lieu->getDepartement(), self::LIMIT$filter$types);
  101.             foreach ($jposTemp as $jpo) {
  102.                 $idVille $jpo->getEtablissement()->getVille()->getId();
  103.                 // traitement pour filtrer les doublons des villes
  104.                 if(!in_array($idVille$addedIds)) {
  105.                     $uniqueJpos[] = $jpo;
  106.                     $addedIds[] = $idVille;
  107.                 }
  108.             }
  109.             // boucle sur les villes filtrées
  110.             foreach ($uniqueJpos as $uniqueJpo) {
  111.                 $ville $uniqueJpo->getEtablissement()->getVille();
  112.                 $villes[] = $ville;
  113.             }
  114.         }
  115.         list($seoTitre$seoTexte) = $this->getDoctrine()->getRepository(SeoTexteReferencementDiplome::class)->getTitreEtTexte('jpo'nullnull$lieu);
  116.         if ($count <= 1)
  117.             $count '';
  118.         if ($seoTitre){
  119.             $seoTitre str_replace(['[region]''[dept]''[ville]'], $lieu->getLibelle(), $seoTitre);
  120.             $seoTitre str_replace('[nbr-jpo]'$count$seoTitre); 
  121.         }
  122.         if ($seoTexte) {
  123.             $seoTexte str_replace(['[region]''[dept]''[ville]'], $lieu->getLibelle(), $seoTexte);
  124.             $seoTexte str_replace('[nbr-jpo]'$count$seoTexte); 
  125.         }
  126.         $robotsTag null;
  127.         if ($lieu instanceof Ville)
  128.             $robotsTag "noindex,follow";
  129.         return $this->render('jpo/list.html.twig', [
  130.             'etablissement' => $etablissement,
  131.             'jpos' => $jpos,
  132.             'regions' => $regions,
  133.             'departements' => $departements,
  134.             'villes' => $villes,
  135.             'niveaux' => $niveaux,
  136.             'currentURL' => $currentURL,
  137.             'lieu' => $lieu,
  138.             'seoTitre' => $seoTitre,
  139.             'seoTexte' => $seoTexte,
  140.             'robots_tag' => $robotsTag,         
  141.         ]);
  142.     }
  143.     /**
  144.      * @Route("/portes-ouvertes/fiche/{id}", name="jpo-etab", methods={"GET", "POST"})
  145.      */
  146.     public function fiche(?JPO $jpo): Response
  147.     {
  148.         if (!$jpo)
  149.             return $this->redirectToRoute('jpo-liste', [], 301);
  150.         $currentURL $this->router->generate('jpo-liste');
  151.         // Ne plus afficher une ancienne JPO
  152.         $now = new \DateTime("now");
  153.         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 !
  154.             return $this->redirectToRoute('jpo-liste', [], 301);
  155.         // $this->etabNonLuService->markAsRead($actualite);
  156.         return $this->render('jpo/fiche.html.twig', [
  157.             'jpo' => $jpo,
  158.             'currentURL' => $currentURL,
  159.             'lieu' => $jpo->getEtablissement()->getVille(),
  160.         ]);
  161.     }
  162.     /**
  163.      * @Route(
  164.      *     "/jpo/header",
  165.      *     name="jpo-header",
  166.      *     methods={"GET"}
  167.      * )
  168.      * @Cache(expires="+120 minutes")
  169.      */
  170.     public function headerList(LieuInterface $lieu null): Response
  171.     {
  172.         // Afficher les 2 dernières JPO en se basant sur la géoloc, on cherche dans ville sinon on monte plus haut
  173.         $jpos null;
  174.         // dump($lieu);
  175.         if ($lieu and $lieu->getSlug() != "default") {
  176.             $jpos $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
  177.             // dump($jpos);
  178.             if ($lieu instanceof Ville && count($jpos) <= 1) {
  179.                 $lieu $lieu->getDepartement();
  180.                 $jpos $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
  181.                 // dump($jpos);
  182.                 if (count($jpos) <= 1) {
  183.                     $lieu $lieu->getRegion();
  184.                     $jpos $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
  185.                     // dump($jpos);
  186.                 }
  187.             } elseif ($lieu instanceof Departement && count($jpos) <= 1) {
  188.                 $lieu $lieu->getRegion();
  189.                 $jpos $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
  190.                 // dump($jpos);
  191.             } else { // région
  192.                 $jpos $this->getDoctrine()->getRepository(JPO::class)->findByLieu($lieu);
  193.                 // dump($jpos);
  194.             }
  195.         }
  196.         if (empty($jpos)) { // toutes les JPOs
  197.             $jpos $this->getDoctrine()->getRepository(JPO::class)->findBy(
  198.                 [],
  199.                 ['date' => 'DESC'],
  200.                 self::HEADERLIMIT
  201.             );
  202.             // dump($jpos);
  203.         
  204.         return $this->render('jpo/dropdown.html.twig', [
  205.             'jpos' => $jpos,
  206.         ]);
  207.     }
  208.     public function blocJPOsALaUne($type null): Response
  209.     {
  210.         // Bloc "JPOs à la une"
  211.         $jpos $this->getDoctrine()->getRepository(JPO::class)->findAlaUne(35);
  212.         if ( (!$jpos || empty($jpos)) && $type=='home')
  213.             $jpos $this->getDoctrine()->getRepository(JPO::class)->getLast(6);
  214.         return $this->render('partial/jpo-une.html.twig', [
  215.             'jpos' => $jpos,
  216.             'type' => $type
  217.         ]);
  218.     }
  219.     /**
  220.      * @Route("/portes-ouvertes/fiche/{id}/download", name="jpo-doc", methods={"GET", "POST"})
  221.      * @return RedirectResponse|Response
  222.      */
  223.     public function download(?JPO $jpo)
  224.     {
  225.         $fileName $jpo->getFileName();
  226.    /*     dd($this->container->get('knp_gaufrette.filesystem_map')->get('jpo_fs'));
  227.         $filesystem =$this->container->get('gaufrette.jpo_fs_filesystem');*/
  228.         $fileStream sprintf('gaufrette://jpo_fs/%s''public/storage/jpo/'.$fileName);
  229.         $response = new BinaryFileResponse($fileStream);
  230.         $response->headers->set('Content-Type''text/pdf');
  231.         $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENTnull$fileName);
  232.         return $response;
  233.     }
  234.     /**
  235.      * @Route("/portes-ouvertes/{lieu}/{etablissement}", name="jpo-liste-root", defaults={"etablissement": null, "lieu":"default"}, methods={"GET", "POST"})
  236.      */
  237.     public function listRedirect(?Etablissement $etablissementRequest $requeststring $lieu=null): Response
  238.     {
  239.         return $this->redirectToRoute('jpo-liste', ['etablissement' => $etablissement'lieu' => $lieu], 301);
  240.     }    
  241. }