lib/boab/cms-bundle/src/Repository/ContentRepository.php line 316

Open in your IDE?
  1. <?php
  2. namespace Boab\CmsBundle\Repository;
  3. use Boab\CmsBundle\Repository\BaseRepository;
  4. use Boab\CmsBundle\Entity\ParentableInterface;
  5. use Boab\CmsBundle\Entity\Page;
  6. use Doctrine\ORM\Query\ResultSetMapping;
  7. use Doctrine\DBAL\Connection;
  8. use Boab\CmsBundle\Entity\Content;
  9. use Boab\CmsBundle\Entity\ContentInterface;
  10. use Boab\CmsBundle\Service\PaginationInterface;
  11. use Boab\CmsBundle\Util\DataTable\DataTableContextInterface;
  12. use Boab\CmsBundle\Repository\ContentRepositoryInterface;
  13. class ContentRepository extends BaseRepository implements ContentRepositoryInterface
  14. {   
  15.     public function findContents(array $params)
  16.     {
  17.         $qb $this->addContentQueryCriteria($params["order"], $params["sortColumn"]);
  18.         return $this->pagination
  19.             ->setLimit($params["limit"])
  20.             ->setOffset($params["offset"])
  21.             ->paginate($qb);
  22.     }  
  23.     private function addContentQueryCriteria($order$sortColumn)
  24.     {
  25.         $qb $this->getContentQuery();
  26.         if($sortColumn == 'contentType'){
  27.             $qb->addSelect('Type(c) as HIDDEN contentType');
  28.             $qb->addOrderBy($sortColumn$order);
  29.         }elseif($sortColumn == 'author'){
  30.             $qb->addSelect("CONCAT(u.firstname,' ',u.lastname) as HIDDEN author");
  31.             $qb->addOrderBy($sortColumn$order);
  32.         }else{
  33.             $qb->addOrderBy(sprintf('c.%s',$sortColumn), $order);
  34.         }
  35.  
  36.         return $qb;
  37.     }
  38.     public function findContentBySearchTerm(array $params)
  39.     {
  40.         $qb $this->addContentQueryCriteria($params["order"], $params["sortColumn"]);
  41.         $qb->where('1 = 1');
  42.         if(isset($params["searchTerm"])){
  43.             $qb->andWhere('c.title LIKE :search_term')
  44.             ->setParameter('search_term''%'.$params["searchTerm"].'%');         
  45.         }
  46.         if(isset($params["startDate"])){
  47.             $qb->andWhere('c.dateCreated BETWEEN :start AND :end')
  48.             //->orWhere('c.summary LIKE :criteria')
  49.             ->setParameter("start"$params["startDate"], \Doctrine\DBAL\Types\Type::DATETIME)
  50.             ->setParameter("end"$params["endDate"], \Doctrine\DBAL\Types\Type::DATETIME);
  51.         }
  52.         return $this->pagination
  53.             ->setLimit($params["limit"])
  54.             ->setOffset($params["offset"])
  55.             ->paginate($qb);        
  56.     }
  57.     public function findContentsByType(string $typeint $pagestring $status=ContentInterface::STATUS_PUBLISHED)
  58.     {
  59.         $qb $this->getContentQuery($type)
  60.             ->andWhere('c.status = :status')
  61.             ->setParameter('status'$status)
  62.             ->orderBy('c.dateCreated''DESC');
  63.         return $this->pagination->paginate($qb$page);
  64.     }
  65.     public function findContentInArray(array $ids$limit$order)
  66.     {
  67.         return $this->getContentQuery(Page::class)
  68.             ->where('c.id IN (:ids)')
  69.             ->andWhere('c.status = :status')
  70.             ->setParameter('ids'$idsConnection::PARAM_STR_ARRAY)
  71.             ->setParameter('status'ContentInterface::STATUS_PUBLISHED)
  72.             ->orderBy('c.datePublished'$order)
  73.             ->getQuery()
  74.             ->getResult();
  75.     }
  76.     public function findPossiblePageParent(string $contentTypeint $parentId=null): ?array
  77.     {
  78.         $qb $this->getContentQuery(Page::class);
  79.         if(!empty($id)){
  80.             $qb->where('c.id NOT IN (:id)')
  81.             ->setParameter('id'$parentId);
  82.         }
  83.         return $qb->orderBy('c.dateCreated''DESC')
  84.             ->getQuery()
  85.             ->getResult();      
  86.     }
  87.     public function findAllContentByType(string $contentType):?iterable
  88.     {
  89.         $qb $this->getContentQuery($contentType)
  90.             ->orderBy('c.dateCreated''DESC');
  91.         return $qb->getQuery()->getResult();
  92.     }
  93.     public function findContentById(int $id): ContentInterface
  94.     {
  95.         $qb $this->getContentQuery()
  96.                     ->where('c.id = :id')
  97.                     ->setParameter('id',$id);
  98.         return $qb->getQuery()->getOneOrNullResult();
  99.     }
  100.     
  101.     public function findContentByRouteId($id): ?ContentInterface
  102.     {
  103.         $qb $this->getContentQuery(Page::class)
  104.             ->addSelect('m')
  105.             ->leftJoin('c.route''m')
  106.             ->where('m.id = :id')
  107.             ->andWhere('c.status = :status')
  108.             ->setParameter('id'$id)
  109.             ->setParameter('status'Content::STATUS_PUBLISHED);
  110.         return $qb->getQuery()->getOneOrNullResult();
  111.     }
  112.     public function findContentBySlug(string $slug): ContentInterface
  113.     {
  114.         $qb $this->getContentQuery()
  115.             ->where('c.slug = :slug')
  116.             ->andWhere('c.status = :status')
  117.             ->setParameter('slug',$slug)
  118.             ->setParameter('status'Content::STATUS_PUBLISHED);
  119.         return $qb->getQuery()->getOneOrNullResult();
  120.     }
  121.     public function findContentByUserId($userId)
  122.     {
  123.         $qb $this->getContentQuery()
  124.             ->where('u.id = :id')
  125.             ->setParameter('id',$userId);
  126.         return $qb->getQuery()->getResult();
  127.     }
  128.     public function findLatestContent($contentType$limit)
  129.     {
  130.         $qb $this->getContentQuery($contentType)
  131.             ->where('c.status = :status')
  132.             ->orderBy('c.datePublished''DESC')
  133.             ->setParameter('status'Content::STATUS_PUBLISHED)
  134.             ->getQuery()
  135.             ->setFirstResult(0)
  136.             ->setMaxResults($limit);
  137.         return $qb->getResult();
  138.     }
  139.     public function findRelatedContentType($contentType$limit$excludeIds=[])
  140.     {
  141.         $ids implode(',',$excludeIds);
  142.         $qb $this->getContentQuery($contentType)
  143.             ->where('c.status = :status')
  144.             ->andWhere('c.id NOT IN (:ids)')
  145.             ->orderBy('c.datePublished''DESC')
  146.             ->setParameter('status'Content::STATUS_PUBLISHED)
  147.             ->setParameter('ids'$ids)
  148.             ->getQuery()
  149.             ->setFirstResult(0)
  150.             ->setMaxResults($limit);
  151.         return $qb->getResult();
  152.     }
  153.     public function findContentByTerm($contentType$term$page)
  154.     {
  155.         $qb $this->getContentQuery($contentType);
  156.         $qb->where('t.slug = :slug')
  157.             ->andWhere('c.status = :status')
  158.             ->setParameter('slug'$term)
  159.             ->setParameter('status'Content::STATUS_PUBLISHED)
  160.             ->orderBy('c.datePublished''DESC');
  161.         return $this->paginate($qb->getQuery(), $page);
  162.     }
  163.     public function findFeaturedContent()
  164.     {
  165.         $qb $this->getContentQuery()
  166.             ->where('c.isFeatured = :featured')
  167.             ->andWhere('c.status = :status')
  168.             ->setParameter('featured',1)
  169.             ->setParameter('status'Content::STATUS_PUBLISHED)
  170.             ->setFirstResult(0)
  171.             ->setMaxResults(1);
  172.         return $qb->getQuery()->getOneOrNullResult();
  173.     }
  174.     public function findFeaturedContentsByType($contentType$limit$order)
  175.     {
  176.         $qb $this->getContentQuery($contentType)
  177.             ->where('c.isFeatured = :featured')
  178.             ->andWhere('c.status = :status')
  179.             ->orderBy('c.datePublished'$order)
  180.             ->setParameter('featured'Content::IS_FEATURED)
  181.             ->setParameter('status'Content::STATUS_PUBLISHED)
  182.             ->setFirstResult(0)
  183.             ->setMaxResults($limit);
  184.         return $qb->getQuery()->getResult();
  185.     }    
  186.     public function getPromotedContents()
  187.     {
  188.         $qb $this->getContentQuery()
  189.             ->where('c.promoted = :promoted')
  190.             ->andWhere('c.status = :status')
  191.             ->setParameter('promoted',1)
  192.             ->setParameter('status'Content::STATUS_PUBLISHED)
  193.             ->orderBy('c.datePublished''DESC');
  194.         return $qb->getQuery()->getResult();
  195.     }
  196.     public function findChildContentsByParent(ParentableInterface $content$limit=0)
  197.     {
  198.         $qb $this->getContentQuery(Content::class)
  199.             ->where('c.parentId = :parentId')
  200.             ->andWhere('c.status = :status')
  201.             ->setParameter('parentId'$content->getId())
  202.             ->setParameter('status'Content::STATUS_PUBLISHED)
  203.             ->orderBy('c.datePublished''DESC');
  204.         if($limit 0){
  205.             $qb->setFirstResult(0)
  206.             ->setMaxResults($limit); 
  207.         }
  208.         return $qb->getQuery()->getResult();
  209.     }
  210.     public function findPublishedContentByType($contentType$page$params=[])
  211.     {  
  212.         $qb $this->getContentQuery($contentType)
  213.                 ->where('c.status = :status');
  214.         $this->addParams($qb$params);
  215.         $qb->orderBy('c.datePublished''DESC')
  216.                 ->setParameter('status'Content::STATUS_PUBLISHED);
  217.         return $this->paginate($qb->getQuery(), $page);      
  218.     } 
  219.     public function findContentCollection(array $classesint $page): PaginationInterface
  220.     {
  221.         $dql $this->getContentByEntitiesDql($classes);
  222.         $qb $this->createQuery($dql);
  223.         $qb->setParameter('status'Content::STATUS_PUBLISHED);
  224.         return $this->pagination->paginate($qb);          
  225.     }  
  226.     public function findContentByClasses($classes$page)    
  227.     {
  228.         $dql $this->getContentByEntitiesDql($classes);
  229.         $qb $this->createQuery($dql);
  230.         $qb->setParameter('status'Content::STATUS_PUBLISHED);
  231.         return $this->paginate($qb$page);            
  232.     }
  233.     private function getContentByEntitiesDql($classes$order='DESC')
  234.     {
  235.         $dql sprintf('SELECT c, u
  236.                 FROM  %s c
  237.                 LEFT JOIN c.user u
  238.                 WHERE (c INSTANCE OF %s)
  239.                 AND c.status = :status
  240.                 ORDER BY c.datePublished %s'Content::class,
  241.         implode(' OR c INSTANCE OF '$classes), $order);
  242.         return $dql;        
  243.     }
  244.     public function findContentByEntitiesWidget($entityClasses$limit=3$order='DESC')
  245.     {
  246.         $dql $this->getContentByEntitiesDql($entityClasses$order);
  247.         $qb $this->createQuery($dql);
  248.         $qb->setParameter('status'Content::STATUS_PUBLISHED)
  249.            ->setFirstResult(0)
  250.            ->setMaxResults($limit); 
  251.         return $qb->getResult();
  252.     }
  253.     public function hasChildContents(ParentableInterface $page)
  254.     {
  255.         $query $this->_em->createQueryBuilder()
  256.             ->select('COUNT(c.id)')
  257.             ->from(Contents::class, 'c')
  258.             ->where('c.parentId = :parentId')
  259.             ->setParameter('parentId'$page->getId());
  260.         return $query->getQuery()->getSingleScalarResult();
  261.     }
  262.     public function findContentCount()
  263.     {
  264.         $query $this->_em->createQueryBuilder()
  265.             ->select('COUNT(c.id)')
  266.             ->from('BoabCmsBundle:Content''c');
  267.         return $query->getQuery()->getSingleScalarResult();
  268.     }    
  269.     public function findContentsByParentId($parentId$limit=0$orderBy="datePublished"$order):iterable
  270.     {
  271.         $qb $this->getContentQuery(Page::class)
  272.             //->leftJoin('c.parent', 'p')
  273.             ->where('c.parentId = :parentId')
  274.             ->andWhere('c.status = :status')
  275.             //->andWhere('c.id NOT IN (:ids)')
  276.             ->setParameter('parentId'$parentId)
  277.             //->setParameter('ids', $excludeIds, Connection::PARAM_STR_ARRAY)
  278.             ->setParameter('status'Content::STATUS_PUBLISHED)
  279.             ->orderBy(sprintf('c.%s'$orderBy), $order);
  280.         if($limit 0){
  281.             $qb->setFirstResult(0)
  282.             ->setMaxResults($limit); 
  283.         }
  284.         return $qb->getQuery()->getResult();
  285.     } 
  286.     public function findTotalContentByYear()
  287.     {
  288.         $sql "SELECT 
  289.                     c.content_type AS type, 
  290.                     count(c.id) as count  
  291.                 FROM contents c 
  292.                 GROUP BY type";
  293.         $rsm = new ResultSetMapping;
  294.         $rsm->addScalarResult('type''type');
  295.         $rsm->addScalarResult('count''count');
  296.         $query $this->_em->createNativeQuery($sql$rsm);
  297.         return $query->getResult();
  298.         //$dql = 'SELECT SUBSTRING(c.dateCreated, 1, 4) AS year, count(c) as total  FROM BoabCmsBundle:Content c GROUP BY year';
  299.         $dql 'SELECT c.discr AS type, count(c) as total  FROM BoabCmsBundle:Content c GROUP BY type';
  300.         $query $this->_em->createQuery($dql);
  301.         return $query->getArrayResult();
  302.         //return $query->getResult();
  303.     }
  304.     public function publishContent(array $references=[])  
  305.     {
  306.         $qb $this->_em->createQueryBuilder();
  307.         $q $qb->update(Content::class, 'c')
  308.                 ->set('c.datePublish'$qb->expr()->literal('verify'))
  309.                 ->where('m.id IN (:ids)')
  310.                 ->setParameter('ids'$references)
  311.                 ->getQuery();
  312.         return $q->execute();        
  313.     } 
  314.     public function findContentByTermId($termId$limit=0$dateOrder='DESC'):?PaginationInterface
  315.     {
  316.         $qb $this->getContentQuery()
  317.             ->leftJoin('c.term''t')
  318.             ->where('t = :termId')
  319.             ->andWhere('c.status = :status')
  320.             ->setParameter('termId'$termId)
  321.             ->setParameter('status'Content::STATUS_PUBLISHED)
  322.             ->orderBy('c.datePublished'$dateOrder);
  323.             
  324.             return $this->pagination->paginate($qb);       
  325.     }
  326.     public function findAllSocialMediaPost()
  327.     {
  328.         $qb $this->getContentQuery()
  329.             ->andWhere('c.status = :status')
  330.             ->andWhere('c.publishOnSocialMedia = :onSocialMedia')
  331.             ->setParameter('status'Content::STATUS_PUBLISHED)
  332.             ->setParameter('onSocialMedia'true)
  333.             ->orderBy('c.datePublished''ASC');
  334.         return $qb->getQuery()->getResult();          
  335.     }
  336.         
  337. }