src/Entity/Repository/PageRepository.php line 34

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