src/Repository/FreePageRepository.php line 55

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\FreePage;
  4. use App\Entity\User;
  5. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  6. use Doctrine\ORM\NonUniqueResultException;
  7. use Doctrine\ORM\QueryBuilder;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. use App\Repository\SiteConfigRepository;
  10. use Symfony\Component\Security\Core\Security;
  11. use Symfony\Component\HttpFoundation\Request;
  12. /**
  13.  * @method FreePage|null find($id, $lockMode = null, $lockVersion = null)
  14.  * @method FreePage|null findOneBy(array $criteria, array $orderBy = null)
  15.  * @method FreePage[]    findAll()
  16.  * @method FreePage[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  17.  */
  18. class FreePageRepository extends ServiceEntityRepository
  19. {
  20.     const UP 'up';
  21.     const DOWN 'down';
  22.     public function __construct(ManagerRegistry $registry, private SiteConfigRepository $siteConfigRepository)
  23.     {
  24.         parent::__construct($registryFreePage::class);
  25.     }
  26.     public function getActiveOnlyQBuilder(string $alias 'f', ?User $user null): QueryBuilder
  27.     {
  28.         $qb $this->createQueryBuilder($alias);
  29.         $roles $user $user->getRoles() : ['ANONYMOUS'];
  30.         $role reset($roles);
  31.         if ($role === User::ROLE_ADMIN) {
  32.             return $qb;
  33.         }else {
  34.             $qb->andWhere($qb->expr()->eq($alias '.isPublic'true));
  35.         }
  36.         $qb->andWhere($alias '.active = true');
  37.         return $qb;
  38.     }
  39.     /**
  40.      * @return FreePage[]
  41.      */
  42.     public function findAllActive(?User $user nullRequest $request null)
  43.     {
  44.         $siteConfig $this->siteConfigRepository->findOneBy([]);
  45.         $isInstanceActive $siteConfig $siteConfig->isInstanceActive() : false;
  46.         $instanceId $request->getSession()->get('selected_instance_id');
  47.         $qb $this->getActiveOnlyQBuilder('f'$user);
  48.         $qb->where('f.active = true');
  49.         if ($isInstanceActive && $instanceId !== null) {
  50.             $qb->andWhere('f.instance = :instanceId')
  51.                ->setParameter('instanceId'$instanceId);
  52.         }
  53.         $freePages $qb
  54.             ->getQuery()
  55.             ->getResult();
  56.              $userRoles $user?->getRoles() ?? ['ANONYMOUS'];
  57.         return array_values(array_filter($freePages, static function (FreePage $freePage) use ($userRoles) {
  58.             if ($freePage->getIsPublic()) {
  59.                 return true;
  60.             }
  61.             $pageRoles $freePage->getRoles();
  62.             return !empty(array_intersect($userRoles$pageRoles));
  63.         }));
  64.     }
  65.     /**
  66.      * @return FreePage[]
  67.      */
  68.     public function findAllActiveSorted()
  69.     {
  70.         return $this->getActiveOnlyQBuilder('f')
  71.             ->orderBy('f.position''ASC')
  72.             ->getQuery()
  73.             ->getResult();
  74.     }
  75.     public function findOneActiveByRoute($route, ?User $user null): ?FreePage
  76.     {
  77.         return $this->getActiveOnlyQBuilder('f'$user)
  78.             ->andWhere('f.route = :route')
  79.             ->setParameter('route'$route)
  80.             ->getQuery()
  81.             ->getOneOrNullResult();
  82.     }
  83.     public function persistAtLastPos(FreePage $instance)
  84.     {
  85.         $em $this->getEntityManager();
  86.         $em->transactional(function ($em) use ($instance) {
  87.             $qb $em->createQueryBuilder();
  88.             $qb
  89.                 ->from('App:FreePage''p')
  90.                 ->select('MAX(p.position)');
  91.             $query $qb->getQuery();
  92.             $res $query->getOneOrNullResult();
  93.             $current $res array_pop($res) : 0;
  94.             $instance->setPosition($current 1);
  95.             $em->persist($instance);
  96.         });
  97.     }
  98.     private static function swapPositions(?FreePage $page1, ?FreePage $page2)
  99.     {
  100.         $pos1 $page1->getPosition();
  101.         $pos2 $page2->getPosition();
  102.         $page1->setPosition($pos2);
  103.         $page2->setPosition($pos1);
  104.         return [$page1$page2];
  105.     }
  106.     private function movePage(string $directionFreePage $page)
  107.     {
  108.         $em $this->getEntityManager();
  109.         $em->transactional(function ($em) use ($page$direction) {
  110.             $qb $em->createQueryBuilder();
  111.             $qb
  112.                 ->from('App:FreePage''p')
  113.                 ->addSelect('p')
  114.                 ->setMaxResults(1)
  115.                 ->setParameter('current_pos'$page->getPosition());
  116.             if ($direction == self::DOWN) {
  117.                 $qb->orderBy('p.position''ASC');
  118.                 $qb->andWhere('p.position > :current_pos');
  119.             } else {
  120.                 $qb->orderBy('p.position''DESC');
  121.                 $qb->andWhere('p.position < :current_pos');
  122.             }
  123.             $query $qb->getQuery();
  124.             $next $query->getOneOrNullResult();
  125.             if (!is_null($next)) {
  126.                 list($b1$b2) = self::swapPositions($page$next);
  127.                 $em->persist($b1);
  128.                 $em->persist($b2);
  129.             }
  130.         });
  131.     }
  132.     public function movePageDown(FreePage $page)
  133.     {
  134.         $this->movePage(self::DOWN$page);
  135.     }
  136.     public function movePageUp(FreePage $page)
  137.     {
  138.         $this->movePage(self::UP$page);
  139.     }
  140. }