<?php
namespace App\Twig;
use Twig\TwigFilter;
use App\Entity\Items;
use Twig\TwigFunction;
use Twig\Extension\AbstractExtension;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class SeoTwigExtension extends AbstractExtension
{
// public function getFilters(): array
// {
// return [
// new TwigFilter('filter_name', [$this, 'doSomething']),
// ];
// }
/** @var EntityManagerInterface */
private $em;
/** @var RequestStack */
private $requestStack;
public function __construct(EntityManagerInterface $entityManager, RequestStack $requestStack)
{
$this->em = $entityManager;
$this->requestStack = $requestStack;
}
public function getFunctions(): array
{
return [
new TwigFunction('seoTypeOnglet', [$this, 'seoRuleOnglet']),
new TwigFunction('seoNiveauOnglet', [$this, 'seoRuleNiveauOnglet']),
new TwigFunction('seoFiliere', [$this, 'seoRuleFiliere']),
new TwigFunction('seoDiplome', [$this, 'seoRuleDiplome']),
new TwigFunction('seo_h1', [$this, 'seoRuleGlobal']),
];
}
public function getFilters(): array
{
return [
new TwigFilter('clean_whitespace', [$this, 'cleanWhitespace']),
];
}
// gestion {type-etab}
public function seoRuleOnglet(string $onglet): ?string
{
if (!$onglet) {
return 'none';
}
switch ($onglet) {
case 'ecole':
return 'Trouvez une école primaire privée';
case 'college':
return 'Trouvez un collège privé';
case 'lycee':
return 'Trouvez un lycée privé';
case 'professionnel':
return 'Trouvez un lycée professionnel privé';
case 'superieur':
return 'Trouvez un enseignement supérieur';
case 'internat':
return 'Trouvez un internat dans le privé';
case 'formations-a-distance':
return 'Trouvez une formation à distance';
case 'autre':
return 'Etablissements divers';
default:
return '';
break;
}
}
// gestion {niveau-etab}, {filiere}, {diplôme}
public function seoRuleNiveauOnglet(string $niveauOnglet): ?string
{
if (!$niveauOnglet) {
return 'none';
}
switch ($niveauOnglet) {
case 'maternelle':
return 'Trouvez une école maternelle privée';
case 'elementaire':
return 'Trouvez une école élémentaire privée';
case 'general':
return 'Trouvez un lycée général privé';
case 'technologique':
return 'Trouvez un lycée technologique privé';
case 'professionnel':
return 'Trouvez un lycée professionnel';
case 'cap':
return 'Trouvez un CAP dans le privé';
case 'bac-pro':
return 'Trouvez un Bac Pro dans le privé';
case 'formation-pro-continue':
return 'Trouvez une Formation Pro continue dans le privé';
case 'bac-2-bts':
return 'Trouvez un BTS - BAC+2 dans le privé';
case 'classes-preparatoires':
return 'Trouvez une classe préparatoire aux concours des écoles dans le privé';
case 'bac-3-licence':
return 'Trouvez une Licence - BAC+3 dans le privé';
case 'bac-4-bac-5-master':
return 'Trouvez un Master - BAC+4/5 dans le privé';
case 'ecoles-d-ingenieurs':
return 'Trouvez une école d\'ingénieurs dans le privé';
case 'formation-professionnelle-continue':
return 'Trouvez une Formation Pro Supérieur Continue dans le privé';
case 'commerce':
return 'Trouvez une formation Commerce dans le privé';
case 'audiovisuel':
return 'Trouvez une formation Audiovisuel dans le privé';
case 'medecine':
return 'Trouvez une formation Médecine dans le privé';
case 'ingenieur':
return 'Trouvez une formation Ingenieur dans le privé';
case 'sciences':
return 'Trouvez une formation Sciences dans le privé';
case 'education':
return 'Trouvez une formation Education dans le privé';
case 'ecole':
return 'Trouver une école primaire privée avec internat';
case 'college':
return 'Trouver un collège privé avec internat';
case 'lycee':
return 'Trouver un lycée privé avec internat';
case 'pro':
return 'Trouver un lycée professionnel privé avec internat';
case 'superieur':
return 'Trouver un enseignement supérieur privé avec internat';
default:
return '';
break;
}
}
// gestion filtre {filiere}
public function seoRuleFiliere(string $filiere): ?string
{
if (!$filiere) {
return 'none';
}
switch ($filiere) {
case 'general':
return 'Préparer dans le privé un bac général avec une spécialité';
case 'technologique':
return 'Préparer dans le privé un bac technologique avec une spécialité';
case 'cap':
return 'Préparer dans le privé un CAP';
case 'bac-pro':
return 'Préparer dans le privé un Bac Pro';
case 'formation-pro-continue':
return 'Préparer dans le privé une formation pro continue';
case 'bac-2-bts':
return 'Préparer dans le privé un BTS - Bac+2';
case 'classes-preparatoires':
return 'Préparer dans le privé une Classe préparatoire aux concours des écoles';
case 'bac-3-licence':
return 'Préparer dans le privé une Licence - Bac+3';
case 'bac-4-bac-5-master':
return 'Préparer dans le privé un Master - Bac+4/5';
case 'ecoles-d-ingenieurs':
return 'Préparer dans le privé une Ecole d\'ingénieurs -';
case 'formation-professionnelle-continue':
return 'Préparer dans le privé une Formation pro supérieur continue -';
default:
return '';
break;
}
}
// gestion filtres {diplôme}
public function seoRuleDiplome(string $diplome): ?string
{
if (!$diplome) {
return 'none';
}
switch ($diplome) {
case 'general':
return 'Préparer dans le privé un bac général avec une spécialité';
case 'technologique':
return 'Préparer dans le privé un';
case 'cap':
return 'Préparer dans le privé -';
case 'bac-pro':
return 'Préparer dans le privé un';
case 'formation-pro-continue':
return 'Préparer dans le privé une formation pro continue -';
case 'bac-2-bts':
return 'Préparer dans le privé un Bac+2 -';
case 'classes-preparatoires':
return 'Préparer dans le privé une Classe préparatoire aux concours des écoles';
case 'bac-3-licence':
return 'Préparer dans le privé un Bac+3 -';
case 'bac-4-bac-5-master':
return 'Préparer dans le privé un Bac+4/5 -';
case 'ecoles-d-ingenieurs':
return 'Préparer dans le privé une Ecole d\'ingénieurs -';
case 'formation-professionnelle-continue':
return 'Préparer dans le privé une Formation pro supérieur continue -';
default:
return '';
break;
}
}
public function seoRuleGlobal(): ?string {
$request = $this->requestStack->getCurrentRequest();
// Checked items :
$checkedFilieres = $request->query->get('filiere');
$checkedDiplomes = $request->query->get('diplome');
$checkedEds = $request->query->get('eds');
$checkedItem = $checkedFilieres ?? $checkedDiplomes ?? $checkedEds;
if (!$checkedItem || empty($checkedItem))
return null;
$checkedItem = $checkedItem[0];
$item = $this->em->getRepository(Items::class)->findOneById($checkedItem);
if (!$item)
return null;
return $item->getLibelleMep() ?? $item->getLibelle();
}
public function cleanWhitespace(string $text): string
{
// Remove line breaks and tabs
$text = str_replace(["\n", "\r", "\t"], '', $text);
// Decode HTML entities so we can process actual characters
$text = html_entity_decode($text, ENT_QUOTES | ENT_HTML5);
// Remove unwanted special characters, keep basic punctuation
// $text = preg_replace('/[^A-Za-z0-9\s\-\(\)&]/u', '', $text); // ça fait sauter les accents !!!
// Collapse multiple spaces into one
$text = preg_replace('/ {2,}/', ' ', $text);
// Trim leading/trailing spaces
return trim($text);
}
}