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.         return $qb
  54.             ->getQuery()
  55.             ->getResult();
  56.     }
  57.     /**
  58.      * @return FreePage[]
  59.      */
  60.     public function findAllActiveSorted()
  61.     {
  62.         return $this->getActiveOnlyQBuilder('f')
  63.             ->orderBy('f.position''ASC')
  64.             ->getQuery()
  65.             ->getResult();
  66.     }
  67.     public function findOneActiveByRoute($route, ?User $user null): ?FreePage
  68.     {
  69.         return $this->getActiveOnlyQBuilder('f'$user)
  70.             ->andWhere('f.route = :route')
  71.             ->setParameter('route'$route)
  72.             ->getQuery()
  73.             ->getOneOrNullResult();
  74.     }
  75.     public function persistAtLastPos(FreePage $instance)
  76.     {
  77.         $em $this->getEntityManager();
  78.         $em->transactional(function ($em) use ($instance) {
  79.             $qb $em->createQueryBuilder();
  80.             $qb
  81.                 ->from('App:FreePage''p')
  82.                 ->select('MAX(p.position)');
  83.             $query $qb->getQuery();
  84.             $res $query->getOneOrNullResult();
  85.             $current $res array_pop($res) : 0;
  86.             $instance->setPosition($current 1);
  87.             $em->persist($instance);
  88.         });
  89.     }
  90.     private static function swapPositions(?FreePage $page1, ?FreePage $page2)
  91.     {
  92.         $pos1 $page1->getPosition();
  93.         $pos2 $page2->getPosition();
  94.         $page1->setPosition($pos2);
  95.         $page2->setPosition($pos1);
  96.         return [$page1$page2];
  97.     }
  98.     private function movePage(string $directionFreePage $page)
  99.     {
  100.         $em $this->getEntityManager();
  101.         $em->transactional(function ($em) use ($page$direction) {
  102.             $qb $em->createQueryBuilder();
  103.             $qb
  104.                 ->from('App:FreePage''p')
  105.                 ->addSelect('p')
  106.                 ->setMaxResults(1)
  107.                 ->setParameter('current_pos'$page->getPosition());
  108.             if ($direction == self::DOWN) {
  109.                 $qb->orderBy('p.position''ASC');
  110.                 $qb->andWhere('p.position > :current_pos');
  111.             } else {
  112.                 $qb->orderBy('p.position''DESC');
  113.                 $qb->andWhere('p.position < :current_pos');
  114.             }
  115.             $query $qb->getQuery();
  116.             $next $query->getOneOrNullResult();
  117.             if (!is_null($next)) {
  118.                 list($b1$b2) = self::swapPositions($page$next);
  119.                 $em->persist($b1);
  120.                 $em->persist($b2);
  121.             }
  122.         });
  123.     }
  124.     public function movePageDown(FreePage $page)
  125.     {
  126.         $this->movePage(self::DOWN$page);
  127.     }
  128.     public function movePageUp(FreePage $page)
  129.     {
  130.         $this->movePage(self::UP$page);
  131.     }
  132. }