src/Twig/CoreExtension.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Twig;
  3. use App\Services\Core\Core;
  4. use App\Services\Core\Tools;
  5. use App\Services\Core\Users;
  6. use App\Services\Cvs;
  7. use App\Services\MarkdownParserService;
  8. use App\Repository\Cvs\LandingJobsRepository;
  9. use App\Repository\Cvs\JobsFiltersRepository;
  10. use App\Repository\Cvs\EnterprisesFiltersRepository;
  11. use Twig\Extension\AbstractExtension;
  12. use Twig\TwigFilter;
  13. use Twig\TwigFunction;
  14. class CoreExtension extends AbstractExtension
  15. {
  16. public function __construct(Core $coreService,
  17. Tools $toolService,
  18. Users $usersService,
  19. Cvs $cvsService,
  20. LandingJobsRepository $landingJobsRepository,
  21. JobsFiltersRepository $jobsFiltersRepository,
  22. EnterprisesFiltersRepository $enterprisesFiltersRepository
  23. ) {
  24. $this->core = $coreService;
  25. $this->tool = $toolService;
  26. $this->users = $usersService;
  27. $this->cvs = $cvsService;
  28. $this->landingJobsRepository = $landingJobsRepository;
  29. $this->jobsFiltersRepository = $jobsFiltersRepository;
  30. $this->enterprisesFiltersRepository = $enterprisesFiltersRepository;
  31. }
  32. public function getFunctions(): array
  33. {
  34. return [
  35. new TwigFunction('asset', [$this, 'asset']),
  36. new TwigFunction('file_exists', [$this, 'file_exists']),
  37. new TwigFunction('cleanSubstr', [$this, 'cleanSubstr']),
  38. new TwigFunction('getCoreTool', [$this, 'getCoreTool']),
  39. new TwigFunction('ctsToEur', [$this, 'ctsToEur']),
  40. new TwigFunction('transformTextToDivs', [$this, 'transformTextToDivs'], ['is_safe' => ['html']]),
  41. new TwigFunction('getEnv', [$this, 'getEnv']),
  42. new TwigFunction('removehttps', [$this, 'removehttps']),
  43. new TwigFunction('getFooterArticles', [$this, 'getFooterArticles']),
  44. new TwigFunction('getFooterFeaturedLandingJobs', [$this, 'getFooterFeaturedLandingJobs']),
  45. new TwigFunction('getFooterJobsCities', [$this, 'getFooterJobsCities']),
  46. new TwigFunction('getFooterEnterprisesCities', [$this, 'getFooterEnterprisesCities']),
  47. ];
  48. }
  49. public function getFilters()
  50. {
  51. return [
  52. new TwigFilter('json_decode', [$this, 'GetJsonDecode']),
  53. new TwigFilter('parseMarkdown', [$this, 'parseMarkdown']),
  54. new TwigFilter('parseMarkdownTag', [$this, 'parseMarkdownTag']),
  55. new TwigFilter('strip_query', [$this, 'stripQuery']),
  56. ];
  57. }
  58. public function getEnv($tag)
  59. {
  60. return $_ENV[$tag];
  61. }
  62. public function parseMarkdown(string $content): string
  63. {
  64. return $this->markdownParser->parse($content);
  65. }
  66. public function GetJsonDecode($chain)
  67. {
  68. return json_decode($chain,true);
  69. }
  70. public function parseMarkdownTag(string $content, string $interditKey): string
  71. {
  72. return $this->markdownParser->parseTag($content,$interditKey);
  73. }
  74. public function getCoreTool($toolID)
  75. {
  76. return $this->tool->getTool($toolID);
  77. }
  78. public function cleanSubstr($chain,$number)
  79. {
  80. return $this->core->cleanSubstr($chain,$number);
  81. }
  82. public function asset($chain)
  83. {
  84. return $chain;
  85. }
  86. public function file_exists($filename)
  87. {
  88. return file_exists($filename);
  89. }
  90. public function ctsToEur($montant)
  91. {
  92. return $this->core->ctsToEur($montant);
  93. }
  94. public function transformTextToDivs($text)
  95. {
  96. $labels = explode(';', $text);
  97. $output = '';
  98. $index = 1;
  99. foreach ($labels as $label) {
  100. $label = trim($label);
  101. $output .= '<div class="variable-item" draggable="true" ondragstart="drag(event)" id="label' . $index . '">' . htmlspecialchars($label) . '</div> ';
  102. $index++;
  103. }
  104. return $output;
  105. }
  106. public function removehttps($domain)
  107. {
  108. $domain = str_replace(['https://', 'http://'], '', $domain);
  109. return $domain;
  110. }
  111. public function stripQuery(?string $url): string
  112. {
  113. if (empty($url)) {
  114. return '';
  115. }
  116. return preg_replace('/[?#].*$/', '', $url);
  117. }
  118. /**
  119. * Retourne les articles featured (mis en avant) pour le footer.
  120. * Utilise la méthode getLast() existante d'ArticlesRepository qui filtre déjà
  121. * sur visibility=true, language=locale, featured=1, publishedAt NOT NULL.
  122. *
  123. * @return \App\Entity\Articles\Articles[]
  124. */
  125. public function getFooterArticles(string $locale, int $limit = 5): array
  126. {
  127. return $this->articlesRepository->getLast($locale, $limit);
  128. }
  129. /**
  130. * Retourne les landing jobs marquées "featured" pour le footer.
  131. *
  132. * @return \App\Entity\Cvs\LandingJobs[]
  133. */
  134. public function getFooterFeaturedLandingJobs(string $locale, int $limit = 5): array
  135. {
  136. return $this->landingJobsRepository->findFeaturedByLocale($locale, $limit);
  137. }
  138. /**
  139. * Retourne les filtres "city" actifs pour les jobs (pour le footer).
  140. *
  141. * @return \App\Entity\Cvs\JobsFilters[]
  142. */
  143. public function getFooterJobsCities(string $locale, int $limit = 6): array
  144. {
  145. return $this->jobsFiltersRepository->findActiveByLocaleAndType($locale, 'city', $limit);
  146. }
  147. /**
  148. * Retourne les filtres "city" actifs pour les entreprises (pour le footer).
  149. *
  150. * @return \App\Entity\Cvs\EnterprisesFilters[]
  151. */
  152. public function getFooterEnterprisesCities(string $locale, int $limit = 6): array
  153. {
  154. return $this->enterprisesFiltersRepository->findActiveByLocaleAndType($locale, 'city', $limit);
  155. }
  156. }