<?php
namespace Kobizo\Bundle\CmsBundle\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;
use Kobizo\Bundle\ECommerceBundle\Entity\Store;
use Kobizo\Component\Attributes\Status\PageStatusAttribute;
use Kobizo\Component\Entity\CmsBaseEntityInterface;
use Kobizo\Component\Entity\Page;
/**
* @method Page|null find($id, $lockMode = null, $lockVersion = null)
* @method Page|null findOneBy(array $criteria, array $orderBy = null)
* @method Page[] findAll()
* @method Page[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PageRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Page::class);
}
public function getSearchQueryBuilder(array $filters = []): QueryBuilder
{
$qb = $this->createQueryBuilder('page')
->leftJoin('page.author', 'author')
->leftJoin('page.translations', 'translation');
if (isset($filters['user'])) {
$qb->andWhere('page.author = :user')
->setParameter('user', $filters['user']);
}
if (isset($filters['isMine'])) {
if ($filters['isMine']) {
$qb->andWhere('author.id = :userId');
$qb->setParameter('userId', $filters['userId']);
}
} elseif (isset($filters['isPublish'])) {
if ($filters['isPublish']) {
$qb->andWhere('page.status = :status');
$qb->setParameter('status', PageStatusAttribute::PUBLISHED);
}
} elseif (isset($filters['isSticky'])) {
if ($filters['isSticky']) {
$qb->andWhere('page.status = :status');
$qb->setParameter('status', PageStatusAttribute::STICKY);
}
} elseif (isset($filters['isDraft'])) {
if ($filters['isDraft']) {
$qb->andWhere('page.status = :status');
$qb->setParameter('status', PageStatusAttribute::DRAFT);
}
} elseif (isset($filters['isPending'])) {
if ($filters['isPending']) {
$qb->andWhere('page.status = :status');
$qb->setParameter('status', PageStatusAttribute::PENDING);
}
} elseif (isset($filters['isDeleted'])) {
if ($filters['isDeleted']) {
$qb->andWhere('page.status = :deletedStatus');
} else {
$qb->andWhere('page.status != :deletedStatus');
}
$qb->setParameter('deletedStatus', PageStatusAttribute::DELETED);
}
if (isset($filters['term'])) {
$qb->andWhere('translation.title LIKE :term OR translation.content LIKE :term')
->setParameter('term', '%'.$filters['term'].'%');
}
return $qb;
}
public function findAllMatchingPageByTitle(string $term, int $limit = 20)
{
return $this->createQueryBuilder('page')
->leftJoin('page.translations', 'translations')
->where('translations.title LIKE :term')
->andWhere('page.status != :deletedStatus')
->setParameter('deletedStatus', PageStatusAttribute::DELETED)
->setParameter('term', "%$term%")
->setMaxResults($limit)
->getQuery()
->getResult();
}
public function findByStores(array $stores)
{
if (count($stores) <= 0) {
return [];
}
$qb = $this->createQueryBuilder('page')
->leftJoin('page.translations', 'translation');
if (isset($filters['status'])) {
$qb->where('page.status =: status')->setParameter('status', $filters['status']);
}
foreach ($stores as $store) {
$qb->orWhere('translation.slug LIKE :store')
->setParameter('store', sprintf('store-%s', $store->getCode()).'%');
}
return $qb->getQuery()->getResult();
}
}