src/Twig/SeoTwigExtension.php line 292

Open in your IDE?
  1. <?php
  2. namespace App\Twig;
  3. use Twig\TwigFilter;
  4. use App\Entity\Items;
  5. use Twig\TwigFunction;
  6. use Twig\Extension\AbstractExtension;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. class SeoTwigExtension extends AbstractExtension
  10. {
  11.     // public function getFilters(): array
  12.     // {
  13.     //     return [
  14.     //         new TwigFilter('filter_name', [$this, 'doSomething']),
  15.     //     ];
  16.     // }
  17.     /** @var EntityManagerInterface */
  18.     private $em;
  19.     /** @var RequestStack */
  20.     private $requestStack;
  21.     public function __construct(EntityManagerInterface $entityManagerRequestStack $requestStack)
  22.     {
  23.         $this->em $entityManager;
  24.         $this->requestStack $requestStack;
  25.     }
  26.     public function getFunctions(): array
  27.     {
  28.         return [
  29.             new TwigFunction('seoTypeOnglet', [$this'seoRuleOnglet']),
  30.             new TwigFunction('seoNiveauOnglet', [$this'seoRuleNiveauOnglet']),
  31.             new TwigFunction('seoFiliere', [$this'seoRuleFiliere']),
  32.             new TwigFunction('seoDiplome', [$this'seoRuleDiplome']),
  33.             new TwigFunction('seo_h1', [$this'seoRuleGlobal']),
  34.         ];
  35.     }
  36.     public function getFilters(): array
  37.     {
  38.         return [
  39.             new TwigFilter('clean_whitespace', [$this'cleanWhitespace']),
  40.         ];
  41.     }    
  42.     // gestion {type-etab}
  43.     public function seoRuleOnglet(string $onglet): ?string
  44.     {
  45.         if (!$onglet) {
  46.             return 'none';
  47.         }
  48.         switch ($onglet) {
  49.             case 'ecole':
  50.                 return 'Trouvez une école primaire privée';
  51.             
  52.             case 'college':
  53.                 return 'Trouvez un collège privé';
  54.             case 'lycee':
  55.                 return 'Trouvez un lycée privé';
  56.             case 'professionnel':
  57.                 return 'Trouvez un lycée professionnel privé';
  58.             case 'superieur':
  59.                 return 'Trouvez un enseignement supérieur';
  60.             case 'internat':
  61.                 return 'Trouvez un internat dans le privé';
  62.             case 'formations-a-distance':
  63.                 return 'Trouvez une formation à distance';
  64.             case 'autre':
  65.                 return 'Etablissements divers';
  66.             default:
  67.                 return '';
  68.             
  69.             break;
  70.         }
  71.     }
  72.     // gestion {niveau-etab}, {filiere}, {diplôme}
  73.     public function seoRuleNiveauOnglet(string $niveauOnglet): ?string
  74.     {
  75.         if (!$niveauOnglet) {
  76.             return 'none';
  77.         }
  78.         switch ($niveauOnglet) {
  79.             case 'maternelle':
  80.                 return 'Trouvez une école maternelle privée';
  81.             case 'elementaire':
  82.                 return 'Trouvez une école élémentaire privée';
  83.             case 'general':
  84.                 return 'Trouvez un lycée général privé';
  85.             case 'technologique':
  86.                 return 'Trouvez un lycée technologique privé';
  87.             case 'professionnel':
  88.                 return 'Trouvez un lycée professionnel';
  89.             case 'cap':
  90.                 return 'Trouvez un CAP dans le privé';
  91.             case 'bac-pro':
  92.                 return 'Trouvez un Bac Pro dans le privé';
  93.             case 'formation-pro-continue':
  94.                 return 'Trouvez une Formation Pro continue dans le privé';
  95.             case 'bac-2-bts':
  96.                 return 'Trouvez un BTS - BAC+2 dans le privé';
  97.             case 'classes-preparatoires':
  98.                 return 'Trouvez une classe préparatoire aux concours des écoles dans le privé';
  99.             case 'bac-3-licence':
  100.                 return 'Trouvez une Licence - BAC+3 dans le privé';
  101.             case 'bac-4-bac-5-master':
  102.                 return 'Trouvez un Master - BAC+4/5 dans le privé';
  103.             case 'ecoles-d-ingenieurs':
  104.                 return 'Trouvez une école d\'ingénieurs dans le privé';
  105.             case 'formation-professionnelle-continue':
  106.                 return 'Trouvez une Formation Pro Supérieur Continue dans le privé';
  107.             case 'commerce':
  108.                 return 'Trouvez une formation Commerce dans le privé';
  109.             case 'audiovisuel':
  110.                 return 'Trouvez une formation Audiovisuel dans le privé';
  111.             case 'medecine':
  112.                 return 'Trouvez une formation Médecine dans le privé';
  113.             case 'ingenieur':
  114.                 return 'Trouvez une formation Ingenieur dans le privé';
  115.             case 'sciences':
  116.                 return 'Trouvez une formation Sciences dans le privé';
  117.             case 'education':
  118.                 return 'Trouvez une formation Education dans le privé';
  119.             case 'ecole':
  120.                 return 'Trouver une école primaire privée avec internat';
  121.             case 'college':
  122.                 return 'Trouver un collège privé avec internat';
  123.             case 'lycee':
  124.                 return 'Trouver un lycée privé avec internat';
  125.             case 'pro':
  126.                 return 'Trouver un lycée professionnel privé avec internat';
  127.             case 'superieur':
  128.                 return 'Trouver un enseignement supérieur privé avec internat';
  129.             default:
  130.                 return '';
  131.             
  132.             break;
  133.         }
  134.     }
  135.     // gestion filtre {filiere}
  136.     public function seoRuleFiliere(string $filiere): ?string
  137.     {
  138.         if (!$filiere) {
  139.             return 'none';
  140.         }
  141.         switch ($filiere) {
  142.             case 'general':
  143.                 return 'Préparer dans le privé un bac général avec une spécialité';
  144.             case 'technologique':
  145.                 return 'Préparer dans le privé un bac technologique avec une spécialité';
  146.             case 'cap':
  147.                 return 'Préparer dans le privé un CAP';
  148.             case 'bac-pro':
  149.                 return 'Préparer dans le privé un Bac Pro';
  150.             case 'formation-pro-continue':
  151.                 return 'Préparer dans le privé une formation pro continue';
  152.             case 'bac-2-bts':
  153.                 return 'Préparer dans le privé un BTS - Bac+2';
  154.             case 'classes-preparatoires':
  155.                 return 'Préparer dans le privé une Classe préparatoire aux concours des écoles';
  156.             case 'bac-3-licence':
  157.                 return 'Préparer dans le privé une Licence - Bac+3';
  158.             case 'bac-4-bac-5-master':
  159.                 return 'Préparer dans le privé un Master - Bac+4/5';
  160.             case 'ecoles-d-ingenieurs':
  161.                 return 'Préparer dans le privé une Ecole d\'ingénieurs -';
  162.             case 'formation-professionnelle-continue':
  163.                 return 'Préparer dans le privé une Formation pro supérieur continue -';
  164.             default:
  165.                 return '';
  166.             
  167.             break;
  168.         }
  169.     }
  170.     // gestion filtres {diplôme}
  171.     public function seoRuleDiplome(string $diplome): ?string
  172.     {
  173.         if (!$diplome) {
  174.             return 'none';
  175.         }
  176.         switch ($diplome) {
  177.             case 'general':
  178.                 return 'Préparer dans le privé un bac général avec une spécialité';
  179.             case 'technologique':
  180.                 return 'Préparer dans le privé un';
  181.             case 'cap':
  182.                 return 'Préparer dans le privé -';
  183.             case 'bac-pro':
  184.                 return 'Préparer dans le privé un';
  185.             case 'formation-pro-continue':
  186.                 return 'Préparer dans le privé une formation pro continue -';
  187.             case 'bac-2-bts':
  188.                 return 'Préparer dans le privé un Bac+2 -';
  189.             case 'classes-preparatoires':
  190.                 return 'Préparer dans le privé une Classe préparatoire aux concours des écoles';
  191.             case 'bac-3-licence':
  192.                 return 'Préparer dans le privé un Bac+3 -';
  193.             case 'bac-4-bac-5-master':
  194.                 return 'Préparer dans le privé un Bac+4/5 -';
  195.             case 'ecoles-d-ingenieurs':
  196.                 return 'Préparer dans le privé une Ecole d\'ingénieurs -';
  197.             case 'formation-professionnelle-continue':
  198.                 return 'Préparer dans le privé une Formation pro supérieur continue -';
  199.             default:
  200.                 return '';
  201.             
  202.             break;
  203.         }
  204.     }
  205.     public function seoRuleGlobal(): ?string {
  206.         $request $this->requestStack->getCurrentRequest();
  207.         // Checked items : 
  208.         $checkedFilieres $request->query->get('filiere');
  209.         $checkedDiplomes $request->query->get('diplome');
  210.         $checkedEds $request->query->get('eds');
  211.         $checkedItem $checkedFilieres ?? $checkedDiplomes ?? $checkedEds;
  212.         if (!$checkedItem || empty($checkedItem))
  213.             return null;
  214.         
  215.         $checkedItem $checkedItem[0];
  216.         $item $this->em->getRepository(Items::class)->findOneById($checkedItem);
  217.         if (!$item)
  218.             return null;
  219.         return $item->getLibelleMep() ?? $item->getLibelle();
  220.     }
  221.     public function cleanWhitespace(string $text): string
  222.     {
  223.         // Remove line breaks and tabs
  224.         $text str_replace(["\n""\r""\t"], ''$text);
  225.         // Decode HTML entities so we can process actual characters
  226.         $text html_entity_decode($textENT_QUOTES ENT_HTML5);
  227.         // Remove unwanted special characters, keep basic punctuation
  228.         // $text = preg_replace('/[^A-Za-z0-9\s\-\(\)&]/u', '', $text); // ça fait sauter les accents !!!
  229.         // Collapse multiple spaces into one
  230.         $text preg_replace('/ {2,}/'' '$text);
  231.         // Trim leading/trailing spaces
  232.         return trim($text);
  233.     }    
  234. }