<?phpnamespace App\Twig;use App\Services\Core\Core;use App\Services\Core\Tools;use App\Services\Core\Users;use App\Services\Cvs;use App\Services\MarkdownParserService;use App\Repository\Articles\ArticlesRepository;use App\Repository\Cvs\LandingJobsRepository;use App\Repository\Cvs\JobsFiltersRepository;use App\Repository\Cvs\EnterprisesFiltersRepository;use Twig\Extension\AbstractExtension;use Twig\TwigFilter;use Twig\TwigFunction;class CoreExtension extends AbstractExtension{ public function __construct(Core $coreService, Tools $toolService, Users $usersService, Cvs $cvsService, MarkdownParserService $markdownParser, ArticlesRepository $articlesRepository, LandingJobsRepository $landingJobsRepository, JobsFiltersRepository $jobsFiltersRepository, EnterprisesFiltersRepository $enterprisesFiltersRepository ) { $this->core = $coreService; $this->tool = $toolService; $this->users = $usersService; $this->cvs = $cvsService; $this->markdownParser = $markdownParser; $this->articlesRepository = $articlesRepository; $this->landingJobsRepository = $landingJobsRepository; $this->jobsFiltersRepository = $jobsFiltersRepository; $this->enterprisesFiltersRepository = $enterprisesFiltersRepository; } public function getFunctions(): array { return [ new TwigFunction('asset', [$this, 'asset']), new TwigFunction('file_exists', [$this, 'file_exists']), new TwigFunction('cleanSubstr', [$this, 'cleanSubstr']), new TwigFunction('getCoreTool', [$this, 'getCoreTool']), new TwigFunction('ctsToEur', [$this, 'ctsToEur']), new TwigFunction('transformTextToDivs', [$this, 'transformTextToDivs'], ['is_safe' => ['html']]), new TwigFunction('getEnv', [$this, 'getEnv']), new TwigFunction('removehttps', [$this, 'removehttps']), new TwigFunction('getFooterArticles', [$this, 'getFooterArticles']), new TwigFunction('getFooterFeaturedLandingJobs', [$this, 'getFooterFeaturedLandingJobs']), new TwigFunction('getFooterJobsCities', [$this, 'getFooterJobsCities']), new TwigFunction('getFooterEnterprisesCities', [$this, 'getFooterEnterprisesCities']), ]; } public function getFilters() { return [ new TwigFilter('json_decode', [$this, 'GetJsonDecode']), new TwigFilter('parseMarkdown', [$this, 'parseMarkdown']), new TwigFilter('parseMarkdownTag', [$this, 'parseMarkdownTag']), new TwigFilter('strip_query', [$this, 'stripQuery']), ]; } public function getEnv($tag) { return $_ENV[$tag]; } public function parseMarkdown(string $content): string { return $this->markdownParser->parse($content); } public function GetJsonDecode($chain) { return json_decode($chain,true); } public function parseMarkdownTag(string $content, string $interditKey): string { return $this->markdownParser->parseTag($content,$interditKey); } public function getCoreTool($toolID) { return $this->tool->getTool($toolID); } public function cleanSubstr($chain,$number) { return $this->core->cleanSubstr($chain,$number); } public function asset($chain) { return $chain; } public function file_exists($filename) { return file_exists($filename); } public function ctsToEur($montant) { return $this->core->ctsToEur($montant); } public function transformTextToDivs($text) { $labels = explode(';', $text); $output = ''; $index = 1; foreach ($labels as $label) { $label = trim($label); $output .= '<div class="variable-item" draggable="true" ondragstart="drag(event)" id="label' . $index . '">' . htmlspecialchars($label) . '</div> '; $index++; } return $output; } public function removehttps($domain) { $domain = str_replace(['https://', 'http://'], '', $domain); return $domain; } public function stripQuery(?string $url): string { if (empty($url)) { return ''; } return preg_replace('/[?#].*$/', '', $url); } /** * Retourne les articles featured (mis en avant) pour le footer. * Utilise la méthode getLast() existante d'ArticlesRepository qui filtre déjà * sur visibility=true, language=locale, featured=1, publishedAt NOT NULL. * * @return \App\Entity\Articles\Articles[] */ public function getFooterArticles(string $locale, int $limit = 5): array { return $this->articlesRepository->getLast($locale, $limit); } /** * Retourne les landing jobs marquées "featured" pour le footer. * * @return \App\Entity\Cvs\LandingJobs[] */ public function getFooterFeaturedLandingJobs(string $locale, int $limit = 5): array { return $this->landingJobsRepository->findFeaturedByLocale($locale, $limit); } /** * Retourne les filtres "city" actifs pour les jobs (pour le footer). * * @return \App\Entity\Cvs\JobsFilters[] */ public function getFooterJobsCities(string $locale, int $limit = 6): array { return $this->jobsFiltersRepository->findActiveByLocaleAndType($locale, 'city', $limit); } /** * Retourne les filtres "city" actifs pour les entreprises (pour le footer). * * @return \App\Entity\Cvs\EnterprisesFilters[] */ public function getFooterEnterprisesCities(string $locale, int $limit = 6): array { return $this->enterprisesFiltersRepository->findActiveByLocaleAndType($locale, 'city', $limit); }}