vendor/akyos/cms-bundle/Controller/Front/FrontController.php line 77

Open in your IDE?
  1. <?php
  2. namespace Akyos\CmsBundle\Controller\Front;
  3. use Akyos\BuilderBundle\AkyosBuilderBundle;
  4. use Akyos\BuilderBundle\Entity\BuilderOptions;
  5. use Akyos\BuilderBundle\Entity\Component;
  6. use Akyos\CmsBundle\Entity\Page;
  7. use Akyos\CmsBundle\Repository\CmsOptionsRepository;
  8. use Akyos\CmsBundle\Repository\PageRepository;
  9. use Akyos\CmsBundle\Repository\SeoRepository;
  10. use Akyos\CmsBundle\Service\CmsService;
  11. use Akyos\CmsBundle\Service\FrontControllerService;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Gedmo\Translatable\Entity\Translation;
  14. use Knp\Component\Pager\PaginatorInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\Filesystem\Filesystem;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpKernel\KernelInterface;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Twig\Environment;
  22. class FrontController extends AbstractController
  23. {
  24.     /**
  25.      * @param CmsOptionsRepository $cmsOptionsrepository
  26.      * @param PageRepository $pageRepository
  27.      * @param SeoRepository $seoRepository
  28.      * @param Environment $environment
  29.      * @param EntityManagerInterface $entityManager
  30.      * @param CmsService $cmsService
  31.      * @return Response
  32.      */
  33.     #[Route(path'/'name'home'methods: ['GET''POST'])]
  34.     public function home(CmsOptionsRepository $cmsOptionsrepositoryPageRepository $pageRepositorySeoRepository $seoRepositoryEnvironment $environmentEntityManagerInterface $entityManagerCmsService $cmsService): Response
  35.     {
  36.         // FIND HOMEPAGE
  37.         $entity Page::class;
  38.         $cmsOptions $cmsOptionsrepository->findAll();
  39.         $homePage $cmsOptions $cmsOptions[0]->getHomepage() : $pageRepository->findOneBy([], ['position' => "ASC"]);
  40.         if (!$homePage) {
  41.             throw $this->createNotFoundException("Cette page n'existe pas! ( Accueil )");
  42.         }
  43.         // GET COMPONENTS OR CONTENT
  44.         $components null;
  45.         if ($cmsService->checkIfBundleEnable(AkyosBuilderBundle::class, BuilderOptions::class, $entity)) {
  46.             $components $entityManager->getRepository(Component::class)->findBy(['type' => $entity'typeId' => $homePage->getId(), 'isTemp' => false'parentComponent' => null], ['position' => 'ASC']);
  47.         }
  48.         // GET TEMPLATE
  49.         $view $homePage->getTemplate() ? 'home/' $homePage->getTemplate() . '.html.twig' '@AkyosCms/front/content.html.twig';
  50.         $environment->addGlobal('global_page'$homePage);
  51.         // RENDER
  52.         return $this->render($view, ['seo' => $seoRepository->findOneBy(['type' => $entity'typeId' => $homePage->getId()]), 'page' => $homePage'components' => $components'content' => $homePage->getContent(), 'slug' => 'accueil']);
  53.     }
  54.     /**
  55.      * @param string $slug
  56.      * @param FrontControllerService $frontControllerService
  57.      * @return Response
  58.      */
  59.     #[Route(path'/page_preview/{slug}'name'page_preview'methods: ['GET''POST'])]
  60.     public function pagePreview(string $slugFrontControllerService $frontControllerService): Response
  61.     {
  62.         return new Response($frontControllerService->pageAndPreview($slug'page_preview'));
  63.     }
  64.     /**
  65.      * @param string $slug
  66.      * @param FrontControllerService $frontControllerService
  67.      * @return Response
  68.      */
  69.     #[Route(path'/{slug}'methods: ['GET''POST'], requirements: ['slug' => '^(?!admin\/|_profiler\/|_wdt\/|app\/|recaptcha\/|page_preview\/|archive\/|details\/|details_preview\/|categorie\/|tag\/|file-manager\/|secured_files\/|en\/).+'], priority: -1name'page')]
  70.     public function page(string $slugFrontControllerService $frontControllerService): Response
  71.     {
  72.         return new Response($frontControllerService->pageAndPreview($slug'page'));
  73.     }
  74.     /**
  75.      * @param Filesystem $filesystem
  76.      * @param string $entitySlug
  77.      * @param CmsService $cmsService
  78.      * @param Request $request
  79.      * @param PaginatorInterface $paginator
  80.      * @param EntityManagerInterface $entityManager
  81.      * @param KernelInterface $kernel
  82.      * @return Response
  83.      */
  84.     #[Route(path'/archive/{entitySlug}'name'archive'methods: ['GET''POST'])]
  85.     public function archive(Filesystem $filesystemstring $entitySlugCmsService $cmsServiceRequest $requestPaginatorInterface $paginatorEntityManagerInterface $entityManagerKernelInterface $kernel): Response
  86.     {
  87.         // GET ENTITY NAME AND FULLNAME FROM SLUG
  88.         [$entityFullName$entity] = $cmsService->getEntityAndFullString($entitySlug);
  89.         if (!$entityFullName || !$entity) {
  90.             throw $this->createNotFoundException("Cette page n'existe pas! ( Archive )");
  91.         }
  92.         if (!$cmsService->checkIfArchiveEnable($entityFullName)) {
  93.             throw $this->createNotFoundException('La page archive n\'est pas activée pour cette entité ');
  94.         }
  95.         // GET ELEMENTS
  96.         // Pour avoir la fonction de recherche, ajouter dans le repository de l'entité visée la méthode "search"
  97.         if (method_exists($entityManager->getRepository($entityFullName), 'search')) {
  98.             $elements $paginator->paginate($entityManager->getRepository($entityFullName)->search($request->query->get('search')), $request->query->getInt('page'1), 10);
  99.         } else {
  100.             $param = [];
  101.             $order = [];
  102.             if (property_exists($entityFullName'published')) {
  103.                 $param['published'] = true;
  104.             }
  105.             if (property_exists($entityFullName'publishedAt')) {
  106.                 $order['publishedAt'] = 'ASC';
  107.             }
  108.             $elements $paginator->paginate($entityManager->getRepository($entityFullName)->findBy($param$order), $request->query->getInt('page'1), 10);
  109.         }
  110.         if (!$elements) {
  111.             throw $this->createNotFoundException('Aucun élément pour cette entité! ');
  112.         }
  113.         // GET TEMPLATE
  114.         $view $filesystem->exists($kernel->getProjectDir() . '/templates/' $entity '/archive.html.twig') ? "/${entity}/archive.html.twig" '@AkyosCms/front/archive.html.twig';
  115.         // RENDER
  116.         return $this->render($view, ['elements' => $elements'entity' => $entity'slug' => $entitySlug]);
  117.     }
  118.     /**
  119.      * @param string $entitySlug
  120.      * @param string $slug
  121.      * @param FrontControllerService $frontControllerService
  122.      * @return Response
  123.      */
  124.     #[Route(path'/details_preview/{entitySlug}/{slug}'name'single_preview'methods: ['GET''POST'])]
  125.     public function singlePreview(string $entitySlugstring $slugFrontControllerService $frontControllerService): Response
  126.     {
  127.         return new Response($frontControllerService->singleAndPreview($entitySlug$slug'single_preview'));
  128.     }
  129.     /**
  130.      * @param string $entitySlug
  131.      * @param string $slug
  132.      * @param FrontControllerService $frontControllerService
  133.      * @return Response
  134.      */
  135.     #[Route(path'/details/{entitySlug}/{slug}'name'single'methods: ['GET''POST'])]
  136.     public function single(string $entitySlugstring $slugFrontControllerService $frontControllerService): Response
  137.     {
  138.         return new Response($frontControllerService->singleAndPreview($entitySlug$slug'single'));
  139.     }
  140.     /**
  141.      * @param Filesystem $filesystem
  142.      * @param string $entitySlug
  143.      * @param string $category
  144.      * @param CmsService $cmsService
  145.      * @param Request $request
  146.      * @param PaginatorInterface $paginator
  147.      * @param EntityManagerInterface $entityManager
  148.      * @param KernelInterface $kernel
  149.      * @return Response
  150.      */
  151.     #[Route(path'/categorie/{entitySlug}/{category}'name'taxonomy'methods: ['GET''POST'])]
  152.     public function category(Filesystem $filesystemstring $entitySlugstring $categoryCmsService $cmsServiceRequest $requestPaginatorInterface $paginatorEntityManagerInterface $entityManagerKernelInterface $kernel): Response
  153.     {
  154.         // GET ENTITY NAME AND FULLNAME FROM SLUG
  155.         $meta $entityManager->getMetadataFactory()->getAllMetadata();
  156.         [$entityFullName$entity] = $cmsService->getEntityAndFullString($entitySlug);
  157.         if (!$entityFullName || !$entity) {
  158.             throw $this->createNotFoundException("Cette page n'existe pas! ( Catégorie )");
  159.         }
  160.         // GET CATEGORY FULLNAME FROM ENTITY SLUG
  161.         $categoryFullName null;
  162.         foreach ($meta as $m) {
  163.             if (preg_match('/\x5c' $entity 'Category$/i'$m->getName())) {
  164.                 $categoryFullName $m->getName();
  165.             }
  166.         }
  167.         if (!$categoryFullName) {
  168.             throw $this->createNotFoundException("Cette page n'existe pas! ( Catégorie )");
  169.         }
  170.         // FIND ELEMENTS FROM CATEGORY OBJECT
  171.         $categoryObject $entityManager->getRepository($categoryFullName)->findOneBy(['slug' => $category]) ?? (!$entityManager->getMetadataFactory()->isTransient(Translation::class) ? $entityManager->getRepository(Translation::class)->findObjectByTranslatedField('slug'$category$categoryFullName) : null);
  172.         if (!$categoryObject) {
  173.             throw $this->createNotFoundException("Cette page n'existe pas! ( Catégorie )");
  174.         }
  175.         // GET ELEMENTS
  176.         // Pour avoir la fonction de recherche, ajouter dans le repository de l'entité visée la méthode "searchByCategory"
  177.         if (method_exists($entityManager->getRepository($entityFullName), 'searchByCategory')) {
  178.             $elements $paginator->paginate($entityManager->getRepository($entityFullName)->searchByCategory($categoryObject$request->query->get('search')), $request->query->getInt('page'1), 10);
  179.         } else {
  180.             $qb $entityManager->getRepository($entityFullName)->createQueryBuilder('a');
  181.             $params = [];
  182.             if (property_exists($entityFullName'postCategories')) {
  183.                 $qb->innerJoin('a.postCategories''apc')->andWhere($qb->expr()->eq('apc'':cat'));
  184.                 $params['cat'] = $categoryObject;
  185.             }
  186.             if (property_exists($entityFullName'published')) {
  187.                 $qb->andWhere($qb->expr()->eq('a.published'true));
  188.             }
  189.             if (property_exists($entityFullName'publishedAt')) {
  190.                 $qb->orderBy('a.publishedAt''ASC');
  191.             }
  192.             $elements $paginator->paginate($qb->setParameters($params)->getQuery(), $request->query->getInt('page'1), 10);
  193.         }
  194.         // GET TEMPLATE
  195.         $view $filesystem->exists($kernel->getProjectDir() . '/templates/' $entity '/category.html.twig') ? "${entity}/category.html.twig" '@AkyosCms/front/category.html.twig';
  196.         // RENDER
  197.         return $this->render($view, ['elements' => $elements'entity' => $entity'slug' => $category'category' => $categoryObject]);
  198.     }
  199.     /**
  200.      * @param Filesystem $filesystem
  201.      * @param string $entitySlug
  202.      * @param string $tag
  203.      * @param CmsService $cmsService
  204.      * @param EntityManagerInterface $entityManager
  205.      * @param KernelInterface $kernel
  206.      * @return Response
  207.      */
  208.     #[Route(path'/tag/{entitySlug}/{tag}'name'tag'methods: ['GET''POST'])]
  209.     public function tag(Filesystem $filesystemstring $entitySlugstring $tagCmsService $cmsServiceEntityManagerInterface $entityManagerKernelInterface $kernel): Response
  210.     {
  211.         // GET ENTITY NAME AND FULLNAME FROM SLUG
  212.         $meta $entityManager->getMetadataFactory()->getAllMetadata();
  213.         [$entityFullName$entity] = $cmsService->getEntityAndFullString($entitySlug);
  214.         if (!$entityFullName || !$entity) {
  215.             throw $this->createNotFoundException("Cette page n'existe pas! ( Étiquette )");
  216.         }
  217.         $parentEntity str_replace('Tag'''$entity);
  218.         // GET TAG FULLNAME FROM ENTITY SLUG
  219.         $tagFullName null;
  220.         foreach ($meta as $m) {
  221.             if (preg_match('/' $entity '$/i'$m->getName())) {
  222.                 $tagFullName $m->getName();
  223.             }
  224.         }
  225.         if (!$tagFullName) {
  226.             throw $this->createNotFoundException("Cette page n'existe pas! ( Étiquette )");
  227.         }
  228.         // FIND ELEMENTS FROM TAG OBJECT
  229.         $tagObject $entityManager->getRepository($tagFullName)->findOneBy(['slug' => $tag]) ?? (!$entityManager->getMetadataFactory()->isTransient(Translation::class) ? $entityManager->getRepository(Translation::class)->findObjectByTranslatedField('slug'$tag$tagFullName) : null);
  230.         if (!$tagObject) {
  231.             throw $this->createNotFoundException("Cette page n'existe pas! ( Étiquette )");
  232.         }
  233.         if (str_ends_with($entity"y")) {
  234.             $getter 'get' ucfirst(substr($parentEntity0, -1)) . 'ies';
  235.         } else {
  236.             $getter 'get' ucfirst($parentEntity) . 's';
  237.         }
  238.         $elements $tagObject->$getter();
  239.         // GET TEMPLATE
  240.         $view $filesystem->exists($kernel->getProjectDir() . '/templates/' $parentEntity '/tag.html.twig') ? "${parentEntity}/tag.html.twig" '@AkyosCms/front/tag.html.twig';
  241.         // RENDER
  242.         return $this->render($view, ['elements' => $elements'entity' => $entity'slug' => $tag'tag' => $tagObject]);
  243.     }
  244. }