src/Twig/GcsExtension.php line 372

Open in your IDE?
  1. <?php
  2. namespace App\Twig;
  3. use App\Entity\AdvertsCategory;
  4. use App\Entity\Beach;
  5. use App\Entity\ClubsCategory;
  6. use App\Entity\EventsPageFrequencyInstance;
  7. use App\Entity\JobsCategory;
  8. use App\Entity\NewsCategory;
  9. use App\Entity\Pages\ClubsPage;
  10. use App\Entity\Pages\EventsPage;
  11. use App\Repository\ClubsPageRepository;
  12. use App\Repository\EventsPageFrequencyInstanceRepository;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use Symfony\Component\Routing\RouterInterface;
  17. use Twig\Extension\AbstractExtension;
  18. use Twig\TwigFilter;
  19. use Twig\TwigFunction;
  20. class GcsExtension extends AbstractExtension
  21. {
  22.     /** @var EntityManagerInterface $em */
  23.     private $em;
  24.     /**
  25.      * @var RouterInterface
  26.      */
  27.     private $router;
  28.     /**
  29.      * ArticleTwigExtension constructor.
  30.      *
  31.      * @param EntityManagerInterface $em
  32.      * @param RouterInterface $router
  33.      */
  34.     public function __construct(EntityManagerInterface $emRouterInterface $router)
  35.     {
  36.         $this->em $em;
  37.         $this->router $router;
  38.         if (func_num_args() > 2) {
  39.             @trigger_error(
  40.                 sprintf(
  41.                     'Passing the "request_stack" service as the third argument in "%s" is deprecated in KunstmaanArticleBundle 5.1 and will be removed in KunstmaanArticleBundle 6.0. Remove the "request_stack" argument from your service definition.',
  42.                     __METHOD__
  43.                 ),
  44.                 E_USER_DEPRECATED
  45.             );
  46.         }
  47.     }
  48.     public function getFunctions()
  49.     {
  50.         return [
  51.             new TwigFunction('get_nearest_event_date', [$this'getNearestEventDate']),
  52.             new TwigFunction('get_default_article_image', [$this'getDefaultArticleImage']),
  53.             new TwigFunction('check_for_clubs_from_category', [$this'checkForClubsFromCategory']),
  54.             new TwigFunction('get_news_from_categories', [$this'getNewsFromCategories']),
  55.             new TwigFunction('get_adverts_from_categories', [$this'getAdvertsFromCategories']),
  56.             new TwigFunction('get_jobs_from_categories', [$this'getJobsFromCategories']),
  57.             new TwigFunction('get_events_sport_categories', [$this'getEventsSportCategories']),
  58.             new TwigFunction('get_beaches', [$this'getBeaches']),
  59.             new TwigFunction(
  60.                 'get_article_tag_path', array($this'getArticleTagRouterPath')
  61.             ),
  62.             new TwigFunction(
  63.                 'get_article_category_path', array($this'getArticleCategoryRouterPath')
  64.             ),
  65.             new TwigFunction(
  66.                 'get_article_categories', array($this'getCategories')
  67.             ),
  68.             new TwigFunction(
  69.                 'get_article_tags', array($this'getTags')
  70.             ),
  71.             new TwigFunction('asset_timestamp', [$this'getAssetTimestamp']),
  72.         ];
  73.     }
  74.     public function getFilters()
  75.     {
  76.         return [
  77.             new TwigFilter('remove_script_tags', [$this'removeScriptTags'])
  78.         ];
  79.     }
  80.     public function removeScriptTags(?string $content null): string
  81.     {
  82.         if (!is_string($content)) {
  83.             return "";
  84.         }
  85.         return preg_replace('#<script(.*?)>(.*?)</script>#is'''$content);
  86.     }
  87.     public function getDefaultArticleImage()
  88.     {
  89.         return '/frontend/img/general/default-article.jpg';
  90.     }
  91.     public function getNearestEventDate(EventsPage $eventsPage)
  92.     {
  93.         $nearestDate $eventsPage->getStartDate();
  94.         /**
  95.          * @var EventsPageFrequencyInstanceRepository $pageInsRepository
  96.          */
  97.         $pageInsRepository $this->em->getRepository(EventsPageFrequencyInstance::class);
  98.         $instance $pageInsRepository->findClosestForEvent($eventsPage);
  99.         if ($instance) {
  100.             return $instance->getDate();
  101.         }
  102.         /*$now = new \DateTime("now");
  103.         $dateRange = new \DatePeriod(
  104.             $eventsPage->getStartDate(),
  105.             $eventsPage->getDateFrequency(),
  106.             $eventsPage->getEndDate()
  107.         );
  108.         foreach ($dateRange as $date) {
  109.             if ($date < $now) {
  110.                 continue;
  111.             }
  112.             return $date;
  113.             break;
  114.         }*/
  115.         return $nearestDate;
  116.     }
  117.     private function find_closest($array, \DateTimeInterface $date)
  118.     {
  119.         //$count = 0;
  120.         foreach ($array as $day) {
  121.             //$interval[$count] = abs(strtotime($date) - strtotime($day));
  122.             $interval[] = abs($date->getTimestamp() - $day->getTimestamp());
  123.             //$count++;
  124.         }
  125.         asort($interval);
  126.         $closest key($interval);
  127.         return $array[$closest];
  128.     }
  129.     public function getNewsFromCategories($categories$lang 'pl'$limit null)
  130.     {
  131.         $em $this->em;
  132.         $pageRepository $em->getRepository('App:Pages\NewsPage');
  133.         $categoriesArray null;
  134.         /** @var NewsCategory $category */
  135.         foreach ($categories as $category) {
  136.             $categoriesArray[] = $category->getId();
  137.         }
  138.         return $pageRepository->getArticles($langnull$limit$categoriesArraynullfalse);
  139.     }
  140.     public function checkForClubsFromCategory(ClubsCategory $category$lang 'pl')
  141.     {
  142.         $em $this->em;
  143.         /** @var ClubsPageRepository $pageRepository */
  144.         $pageRepository $em->getRepository(ClubsPage::class);
  145.         $categoriesArray null;
  146.         /** @var NewsCategory $category */
  147.         $categoriesArray[] = $category->getId();
  148.         return $pageRepository->getArticles($langnullnull$categoriesArray);
  149.     }
  150.     public function getAdvertsFromCategories($categories$lang 'pl'$limit null)
  151.     {
  152.         $em $this->em;
  153.         $pageRepository $em->getRepository('App:Pages\AdvertsPage');
  154.         $categoriesArray null;
  155.         /** @var AdvertsCategory $category */
  156.         foreach ($categories as $category) {
  157.             $categoriesArray[] = $category->getId();
  158.         }
  159.         return $pageRepository->getArticles($langnull$limit$categoriesArray);
  160.     }
  161.     public function getJobsFromCategories($categories$lang 'pl'$limit null)
  162.     {
  163.         $em $this->em;
  164.         $pageRepository $em->getRepository('App:Pages\JobsPage');
  165.         $categoriesArray null;
  166.         /** @var JobsCategory $category */
  167.         foreach ($categories as $category) {
  168.             $categoriesArray[] = $category->getId();
  169.         }
  170.         return $pageRepository->getArticles($langnull$limit$categoriesArray);
  171.     }
  172.     public function getEventsSportCategories()
  173.     {
  174.         $em $this->em;
  175.         $pageRepository $em->getRepository('App:Pages\EventsPage');
  176.         return $pageRepository->getDistinctValues('sports');
  177.     }
  178.     /**
  179.      * Get tags array for view.
  180.      *
  181.      * @param Request $request
  182.      * @param string $className
  183.      *
  184.      * @return array
  185.      */
  186.     public function getTags(Request $request$className)
  187.     {
  188.         $context = array();
  189.         $tagRepository $this->em->getRepository($className);
  190.         $context['tags'] = $tagRepository->findBy(array(), array('name' => 'ASC'));
  191.         $searchTag $request->get('tag') ? explode(','$request->get('tag')) : null;
  192.         if ($searchTag) {
  193.             $context['activeTag'] = true;
  194.             $context['activeTags'] = $searchTag;
  195.         }
  196.         return $context;
  197.     }
  198.     /**
  199.      * Get categories array for view.
  200.      *
  201.      * @param Request $request
  202.      * @param string $className
  203.      *
  204.      * @return array
  205.      */
  206.     public function getCategories(Request $request$className)
  207.     {
  208.         $context = array();
  209.         $categoryRepository $this->em->getRepository($className);
  210.         $context['categories'] = $categoryRepository->findBy(array(), array('name' => 'ASC'));
  211.         $searchCategory $request->get('category') ? explode(','$request->get('category')) : null;
  212.         if ($searchCategory) {
  213.             $context['activeCategory'] = true;
  214.             $context['activeCategories'] = $searchCategory;
  215.         }
  216.         return $context;
  217.     }
  218.     /**
  219.      * @param string $slug
  220.      * @param string $tag
  221.      * @param string $locale
  222.      * @param array $parameters
  223.      * @param int $referenceType
  224.      *
  225.      * @return string
  226.      */
  227.     public function getArticleTagRouterPath(
  228.         $slug,
  229.         $tag,
  230.         $locale,
  231.         $parameters = [],
  232.         $referenceType UrlGeneratorInterface::ABSOLUTE_PATH
  233.     )
  234.     {
  235.         $routeName sprintf('_slug_tag_%s'$locale);
  236.         return $this->getArticleRouterPath($routeName'tag'$slug$tag$locale$parameters$referenceType);
  237.     }
  238.     /**
  239.      * @param string $slug
  240.      * @param string $category
  241.      * @param string $locale
  242.      * @param array $parameters
  243.      * @param int $referenceType
  244.      *
  245.      * @return string
  246.      */
  247.     public function getArticleCategoryRouterPath(
  248.         $slug,
  249.         $category,
  250.         $locale,
  251.         $parameters = [],
  252.         $referenceType UrlGeneratorInterface::ABSOLUTE_PATH
  253.     )
  254.     {
  255.         $routeName sprintf('_slug_category_%s'$locale);
  256.         return $this->getArticleRouterPath(
  257.             $routeName,
  258.             'category',
  259.             $slug,
  260.             $category,
  261.             $locale,
  262.             $parameters,
  263.             $referenceType
  264.         );
  265.     }
  266.     /**
  267.      * @return string
  268.      */
  269.     public function getName()
  270.     {
  271.         return 'article_twig_extension';
  272.     }
  273.     /**
  274.      * @param string $routeName
  275.      * @param string $type
  276.      * @param string $slug
  277.      * @param string $tagOrCategory
  278.      * @param string $locale
  279.      * @param array $parameters
  280.      * @param int $referenceType
  281.      *
  282.      * @return string
  283.      */
  284.     protected function getArticleRouterPath(
  285.         $routeName,
  286.         $type,
  287.         $slug,
  288.         $tagOrCategory,
  289.         $locale,
  290.         $parameters = [],
  291.         $referenceType UrlGeneratorInterface::ABSOLUTE_PATH
  292.     )
  293.     {
  294.         if (!$this->articleRouteExists($type$locale)) {
  295.             $routeName '_slug';
  296.         }
  297.         if (!isset($parameters[$type])) {
  298.             $parameters[$type] = $tagOrCategory;
  299.         }
  300.         if (!isset($parameters['url'])) {
  301.             $parameters['url'] = $slug;
  302.         }
  303.         if (!isset($parameters['_locale'])) {
  304.             $parameters['_locale'] = $locale;
  305.         }
  306.         return $this->router->generate($routeName$parameters$referenceType);
  307.     }
  308.     /**
  309.      * @param string $type
  310.      * @param string $locale
  311.      *
  312.      * @return bool
  313.      */
  314.     protected function articleRouteExists($type$locale)
  315.     {
  316.         $routeName sprintf('_slug_%s_%s'$type$locale);
  317.         try {
  318.             return !is_null($this->router->getRouteCollection()->get($routeName));
  319.         } catch (\Exception $e) {
  320.             return false;
  321.         }
  322.     }
  323.     public function getBeaches()
  324.     {
  325.         $beachRepo $this->em->getRepository(Beach::class);
  326.         $beaches $beachRepo->findAll();
  327.         return $beaches;
  328.     }
  329.     public function getAssetTimestamp(string $path): int
  330.     {
  331.         try {
  332.             return filemtime(ltrim($path'/')) ?: 0;
  333.         } catch (\Exception $exception) {
  334.             return 0;
  335.         }
  336.     }
  337. }