src/Entity/Repository/PageRepository.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Repository;
  3. use App\Entity\Page;
  4. use App\Entity\Route;
  5. use Doctrine\ORM\Query;
  6. use Gedmo\Translatable\Query\TreeWalker\TranslationWalker;
  7. use Gedmo\Tree\Entity\Repository\NestedTreeRepository;
  8. class PageRepository extends NestedTreeRepository
  9. {
  10.     private bool $multilingual false;
  11.     /**
  12.      * @return Page[]
  13.      */
  14.     public function getTree()
  15.     {
  16.         $queryBuilder $this->getNodesHierarchyQueryBuilder();
  17.         $queryBuilder->orderBy('node.lft');
  18.         return $queryBuilder->getQuery()->getResult();
  19.     }
  20.     /**
  21.      * @param null $locale
  22.      *
  23.      * @return Page[]
  24.      */
  25.     public function getHeaderNavigation($locale null)
  26.     {
  27.         $headerNavigation $this->findOneBy([
  28.             'alias' => Page::GROUP_TYPE_HEADER_NAVIGATION,
  29.         ]);
  30.         $pages $this->getNavigation($headerNavigationtrue'lft');
  31.         foreach ($pages as &$page) {
  32.             $this->filterChildrenByShowInMenu($page);
  33.             $this->realSymlink($page);
  34.         }
  35.         return $pages;
  36.     }
  37.     private function filterChildrenByShowInMenu(Page $page): Page
  38.     {
  39.         $page->setChildren($page->getChildren()->filter(function (Page $page) {
  40.             return $page->isShowInMenu();
  41.         }));
  42.         foreach ($page->getChildren() as $child) {
  43.             $this->filterChildrenByShowInMenu($child);
  44.         }
  45.         return $page;
  46.     }
  47.     /**
  48.      * @param null $locale
  49.      *
  50.      * @return Page[]
  51.      */
  52.     public function getFooterNavigation($locale null)
  53.     {
  54.         $footerNavigation $this->findOneBy([
  55.             'alias' => Page::GROUP_TYPE_FOOTER_NAVIGATION,
  56.         ]);
  57.         if (!$footerNavigation) {
  58.             return [];
  59.         }
  60.         $pages $this->getNavigation($footerNavigationfalse'lft');
  61.         /** @var Page $page */
  62.         foreach ($pages as &$page) {
  63.             if ($locale) {
  64.                 $page->setRoutes($page->getRoutes()->filter(function (Route $route) use ($locale) {
  65.                     return $route->getLocale() === $locale;
  66.                 }));
  67.                 if (Page::PAGETYPE_SYMLINK === $page->getType()) {
  68.                     $symLinkedPage $page->getSymlinkedPage();
  69.                     $symLinkedPage->setRoutes($symLinkedPage->getRoutes()
  70.                         ->filter(function (Route $route) use ($locale) {
  71.                             return $route->getLocale() === $locale;
  72.                         }));
  73.                 }
  74.             }
  75.             $this->realSymlink($page);
  76.         }
  77.         return $pages;
  78.     }
  79.     /**
  80.      * @param null $locale
  81.      *
  82.      * @return Page[]
  83.      */
  84.     public function getFooterBottomNavigation($locale null)
  85.     {
  86.         $footerBottomNavigation $this->findOneBy([
  87.             'alias' => Page::GROUP_TYPE_FOOTER_BOTTOM_NAVIGATION,
  88.         ]);
  89.         if (!$footerBottomNavigation) {
  90.             return [];
  91.         }
  92.         $pages $this->getNavigation($footerBottomNavigationfalse'lft');
  93.         foreach ($pages as &$page) {
  94.             if ($locale) {
  95.                 $page->setRoutes($page->getRoutes()->filter(function (Route $route) use ($locale) {
  96.                     return $route->getLocale() === $locale;
  97.                 }));
  98.                 if (Page::PAGETYPE_SYMLINK === $page->getType()) {
  99.                     $symLinkedPage $page->getSymlinkedPage();
  100.                     $symLinkedPage->setRoutes($symLinkedPage->getRoutes()
  101.                         ->filter(function (Route $route) use ($locale) {
  102.                             return $route->getLocale() === $locale;
  103.                         }));
  104.                 }
  105.             }
  106.             $this->realSymlink($page);
  107.         }
  108.         return $pages;
  109.     }
  110.     /**
  111.      * @param null $locale
  112.      *
  113.      * @return Page[]
  114.      */
  115.     public function getTopNavigation($locale null)
  116.     {
  117.         $topNavigation $this->findOneBy([
  118.             'alias' => Page::GROUP_TYPE_WEBRING,
  119.         ]);
  120.         $pages $this->getNavigation($topNavigationtrue'lft');
  121.         foreach ($pages as &$page) {
  122.             if ($locale) {
  123.                 $page->setRoutes($page->getRoutes()->filter(function (Route $route) use ($locale) {
  124.                     return $route->getLocale() === $locale;
  125.                 }));
  126.                 if (Page::PAGETYPE_SYMLINK === $page->getType()) {
  127.                     $symLinkedPage $page->getSymlinkedPage();
  128.                     $symLinkedPage->setRoutes($symLinkedPage->getRoutes()
  129.                         ->filter(function (Route $route) use ($locale) {
  130.                             return $route->getLocale() === $locale;
  131.                         }));
  132.                 }
  133.             }
  134.             $this->filterChildrenByShowInMenu($page);
  135.             $this->realSymlink($page);
  136.         }
  137.         return $pages;
  138.     }
  139.     public function findDeleted(): array
  140.     {
  141.         $this->_em->getFilters()->disable('softdeleteable');
  142.         $qb $this->createQueryBuilder('p');
  143.         $qb->where('p.deletedAt IS NOT NULL')
  144.             ->andWhere('p.type = :type')
  145.             ->setParameter('type''page');
  146.         return $qb->getQuery()
  147.             ->getResult();
  148.     }
  149.     /**
  150.      * @throws \Doctrine\ORM\NoResultException
  151.      * @throws \Doctrine\ORM\NonUniqueResultException
  152.      */
  153.     public function findOneDeleted(int $id): Page
  154.     {
  155.         $this->_em->getFilters()->disable('softdeleteable');
  156.         $qb $this->createQueryBuilder('p');
  157.         $qb->where('p.id = :id')
  158.             ->setParameter('id'$id);
  159.         return $qb->getQuery()
  160.             ->getSingleResult();
  161.     }
  162.     private function realSymlink(Page $page)
  163.     {
  164.         if (
  165.             'symlink' === $page->getType() &&
  166.             $page->getSymlinkedPage()->getRoutes()->first() &&
  167.             '' !== $page->getSymlinkedPage()->getRoutes()->first()->getName()
  168.         ) {
  169.             foreach ($page->getSymlinkedPage()->getRoutes() as &$route) {
  170.                 $route->setName(
  171.                     str_replace(Route::ALIAS_PREFIX''$route->getName())
  172.                 );
  173.             }
  174.         }
  175.         return $page;
  176.     }
  177.     /**
  178.      * @param null   $node
  179.      * @param false  $direct
  180.      * @param null   $sortByField
  181.      * @param string $direction
  182.      * @param false  $includeNode
  183.      *
  184.      * @return int|mixed|string
  185.      */
  186.     public function getNavigation(
  187.         $node null,
  188.         $direct false,
  189.         $sortByField null,
  190.         $direction 'ASC',
  191.         $includeNode false
  192.     ) {
  193.         $queryBuilder $this->getChildrenQueryBuilder($node$direct$sortByField$direction,
  194.             $includeNode);
  195.         $queryBuilder->andWhere('node.showInMenu = true');
  196.         $queryBuilder->leftJoin('node.routes''routes');
  197.         $queryBuilder->addSelect('routes');
  198.         $query $queryBuilder->getQuery();
  199.         if ($this->multilingual) {
  200.             $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKERTranslationWalker::class);
  201.         }
  202.         /* @var Page[] $pages */
  203.         return $query->getResult();
  204.     }
  205.     /**
  206.      * Temporary solution to set multilingual.
  207.      */
  208.     public function setMultilingual(bool $multilingual)
  209.     {
  210.         $this->multilingual $multilingual;
  211.     }
  212. }