vendor/orbitale/cms-bundle/Controller/PageController.php line 43

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the OrbitaleCmsBundle package.
  4. *
  5. * (c) Alexandre Rock Ancelet <alex@orbitale.io>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Orbitale\Bundle\CmsBundle\Controller;
  11. use Orbitale\Bundle\CmsBundle\Entity\Page;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. class PageController extends AbstractCmsController
  15. {
  16.     /**
  17.      * @var Request
  18.      */
  19.     protected $request;
  20.     /**
  21.      * @param Request     $request
  22.      * @param string      $slugs
  23.      * @param string|null $_locale
  24.      *
  25.      * @return Response
  26.      */
  27.     public function indexAction(Request $requeststring $slugs ''string $_locale null): Response
  28.     {
  29.         if (preg_match('~/$~'$slugs)) {
  30.             return $this->redirect($this->generateUrl('orbitale_cms_page', ['slugs' => rtrim($slugs'/')]));
  31.         }
  32.         $this->request $request;
  33.         $this->request->setLocale($_locale ?: $this->request->getLocale());
  34.         $slugsArray preg_split('~/~'$slugs, -1PREG_SPLIT_NO_EMPTY);
  35.         $pages $this->getPages($slugsArray);
  36.         $currentPage $this->getCurrentPage($pages$slugsArray);
  37.         // If we have slugs and the current page is homepage,
  38.         //  we redirect to homepage for "better" url and SEO management.
  39.         // Example: if "/home" is a homepage, "/home" url is redirected to "/".
  40.         if ($slugs && $currentPage->isHomepage()) {
  41.             $params = ['slugs' => ''];
  42.             if ($currentPage->getLocale()) {
  43.                 // Force locale if the Page has one
  44.                 $params['_locale'] = $currentPage->getLocale();
  45.             }
  46.             return $this->redirect($this->generateUrl('orbitale_cms_page'$params));
  47.         }
  48.         return $this->render('@OrbitaleCms/Front/index.html.twig', [
  49.             'pages' => $pages,
  50.             'page'  => $currentPage,
  51.         ]);
  52.     }
  53.     /**
  54.      * Retrieves the page list based on slugs.
  55.      * Also checks the hierarchy of the different pages.
  56.      *
  57.      * @param array $slugsArray
  58.      *
  59.      * @return Page[]
  60.      */
  61.     protected function getPages(array $slugsArray = [])
  62.     {
  63.         /** @var Page[] $pages */
  64.         $pages $this->get('orbitale_cms.page_repository')
  65.             ->findFrontPages($slugsArray$this->request->getHost(), $this->request->getLocale())
  66.         ;
  67.         if (!count($pages) || (count($slugsArray) && count($pages) !== count($slugsArray))) {
  68.             throw $this->createNotFoundException(count($slugsArray)
  69.                 ? 'Page not found'
  70.                 'No homepage has been configured. Please check your existing pages or create a homepage in your application.');
  71.         }
  72.         return $pages;
  73.     }
  74.     /**
  75.      * Retrieves the current page based on page list and entered slugs.
  76.      *
  77.      * @param Page[] $pages
  78.      * @param array  $slugsArray
  79.      *
  80.      * @return Page
  81.      */
  82.     protected function getCurrentPage(array $pages, array $slugsArray): Page
  83.     {
  84.         if (count($pages) === count($slugsArray)) {
  85.             $currentPage $this->getFinalTreeElement($slugsArray$pages);
  86.         } else {
  87.             $currentPage current($pages);
  88.         }
  89.         return $currentPage;
  90.     }
  91. }