src/DataProvider/ArticleCollectionDataProvider.php line 196

Open in your IDE?
  1. <?php
  2. namespace App\DataProvider;
  3. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
  4. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryResultCollectionExtensionInterface;
  5. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
  6. use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
  7. use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
  8. use ApiPlatform\Core\Exception\RuntimeException;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use App\Entity\Api\Article as Article;
  12. use Score\CmsBundle\Entity\Article as CmsArticle;
  13. use stdClass;
  14. /*
  15. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
  16. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryResultCollectionExtensionInterface;
  17. use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
  18. use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
  19. use App\Entity\Api\Article as Article;
  20. use Score\CmsBundle\Entity\Article as CmsArticle;
  21. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryResultItemExtensionInterface;
  22. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGenerator;
  23. use Doctrine\Persistence\ManagerRegistry;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use ApiPlatform\Core\Exception\RuntimeException;
  26. */
  27. final class ArticleCollectionDataProvider implements ContextAwareCollectionDataProviderInterfaceRestrictedDataProviderInterface
  28. {
  29.     private $collectionExtensions;
  30.     private $managerRegistry;
  31.    
  32.     public function __construct(ManagerRegistry $managerRegistryiterable $collectionExtensions = [])
  33.     {
  34.         $this->managerRegistry $managerRegistry;
  35.         $this->collectionExtensions $collectionExtensions;
  36.     }
  37.     
  38.     public function supports(string $resourceClassstring $operationName null, array $context = []): bool
  39.     {
  40.         return Article::class === $resourceClass;
  41.     }
  42.     public function getCollection(string $resourceClassstring $operationName null, array $context = []): iterable
  43.     {
  44.         $manager $this->managerRegistry->getManagerForClass($resourceClass);
  45.         $repository $manager->getRepository($resourceClass);
  46.         $cmsResourceClass CmsArticle::class; 
  47.         $cmsArticleRepository $manager->getRepository($cmsResourceClass);
  48.         $queryBuilder $cmsArticleRepository->createQueryBuilder('o');
  49.         $queryBuilder->leftJoin('o.siteItemArticle','a');
  50.         $queryBuilder->leftJoin('App\Entity\LanguageInfo''l''WITH''o.id = l.entityId AND l.entity = \'Article\'');
  51.         $pageSize 20;
  52.         $currentPage 1;
  53.         if(array_key_exists('page',$context['filters']))
  54.         {
  55.             $currentPage $context['filters']['page'];
  56.         }
  57.         if(array_key_exists('itemsPerPage',$context['filters']))
  58.         {
  59.             $pageSize $context['filters']['itemsPerPage'];
  60.         }
  61.         if(array_key_exists('filters',$context))
  62.         {
  63.             if(null != $this->getFilterCriteria('category',$context['filters']))
  64.             {
  65.                 if(is_array($context['filters']['category']))
  66.                 {
  67.                     $orX $queryBuilder->expr()->orX();
  68.                     foreach($context['filters']['category'] as  $key => $site)
  69.                     {
  70.                         $orX->add($queryBuilder->expr()->eq('o.category'':category'.$key ));
  71.                     }
  72.                     foreach($context['filters']['category'] as  $key => $site)
  73.                     {
  74.                         $queryBuilder->setParameter('category'.$key,$site);
  75.                     }
  76.                     $queryBuilder->andWhere($orX);
  77.                 }
  78.                 else
  79.                 {
  80.                     $queryBuilder->andWhere('o.category = :category');
  81.                     $queryBuilder->setParameter('category',$context['filters']['category']);
  82.                 }
  83.             }
  84.         
  85.             if(null != $this->getFilterCriteria('slug',$context['filters']))
  86.             {
  87.                 if(is_array($context['filters']['slug']))
  88.                 {
  89.                     $orX $queryBuilder->expr()->orX();
  90.                     foreach($context['filters']['slug'] as  $key => $site)
  91.                     {
  92.                         $orX->add($queryBuilder->expr()->eq('o.slug'':slug'.$key ));
  93.                     }
  94.                     foreach($context['filters']['slug'] as  $key => $site)
  95.                     {
  96.                         $queryBuilder->setParameter('slug'.$key,$site);
  97.                     }
  98.                     $queryBuilder->andWhere($orX);
  99.                 }
  100.                 else
  101.                 {
  102.                     $queryBuilder->andWhere('o.slug = :slug');
  103.                     $queryBuilder->setParameter('slug',$context['filters']['slug']);
  104.                 }
  105.             }
  106.             if(null != $this->getFilterCriteria('site',$context['filters']))
  107.             {
  108.                 if(is_array($context['filters']['site']))
  109.                 {
  110.                     $orX $queryBuilder->expr()->orX();
  111.                     foreach($context['filters']['site'] as  $key => $site)
  112.                     {
  113.                         $orX->add($queryBuilder->expr()->eq('a.site'':site'.$key ));
  114.                     }
  115.                     foreach($context['filters']['site'] as  $key => $site)
  116.                     {
  117.                         $queryBuilder->setParameter('site'.$key,$site);
  118.                     }
  119.                     $queryBuilder->andWhere($orX);
  120.                 }
  121.                 else
  122.                 {
  123.                     $queryBuilder->andWhere('a.site = :site');
  124.                     $queryBuilder->setParameter('site',$context['filters']['site']);
  125.                 }
  126.             }
  127.             if(null != $this->getFilterCriteria('publishedFrom',$context['filters']))
  128.             {
  129.                 //dump($context['filters']['publishedFrom']);
  130.                 if(array_key_exists('before',$context['filters']['publishedFrom']) )
  131.                 {
  132.                     $queryBuilder->andWhere('o.publishedFrom <= :publishedFromBefore');
  133.                     $queryBuilder->setParameter('publishedFromBefore',$context['filters']['publishedFrom']['before'].' 23:59:59');
  134.                 }
  135.                 if(array_key_exists('strictly_before',$context['filters']['publishedFrom']) )
  136.                 {
  137.                     $queryBuilder->andWhere('o.publishedFrom <= :publishedFromStrictlyBefore');
  138.                     $queryBuilder->setParameter('publishedFromStrictlyBefore',$context['filters']['publishedFrom']['strictly_before'].' 00:00:00');
  139.                 }
  140.                 if(array_key_exists('after',$context['filters']['publishedFrom']) )
  141.                 {
  142.                     $queryBuilder->andWhere('o.publishedFrom >= :publishedFromAfter');
  143.                     $queryBuilder->setParameter('publishedFromAfter',$context['filters']['publishedFrom']['after'].' 00:00:00');
  144.                 }
  145.                 if(array_key_exists('strictly_after',$context['filters']['publishedFrom']) )
  146.                 {
  147.                     $queryBuilder->andWhere('o.publishedFrom >= :publishedFromStrictlyAfter');
  148.                     $queryBuilder->setParameter('publishedFromStrictlyAfter',$context['filters']['publishedFrom']['strictly_after'].' 23:59:59');
  149.                 }
  150.             }
  151.             if(null != $this->getFilterCriteria('published',$context['filters']))
  152.             {
  153.                 $queryBuilder->andWhere('o.published = :published');
  154.                 $queryBuilder->setParameter('published',$context['filters']['published']);
  155.             }
  156.         }
  157.         if(null != $this->getFilterCriteria('lang',$context['filters']))
  158.         {
  159.             $queryBuilder->andWhere('l.language = :lang');
  160.             $queryBuilder->setParameter('lang',$context['filters']['lang']);
  161.         }
  162.         
  163.         if(array_key_exists('filters',$context) and array_key_exists('order',$context['filters']))
  164.         {
  165.             foreach($context['filters']['order'] as $col => $direction)
  166.             {
  167.                 $queryBuilder->addOrderBy('o.'.$col$direction);
  168.             }
  169.         }
  170.        
  171.         $pageFrom $pageSize * ($currentPage-1);
  172.         
  173.         $cmsArticles =  $queryBuilder->getQuery()
  174.         ->setFirstResult($pageFrom// set the offset
  175.         ->setMaxResults($pageSize// set the limit
  176.         ->getResult();
  177.         $queryBuilder->select('COUNT(o)');
  178.         $queryBuilder->resetDQLPart('orderBy');
  179.         $totalSize $queryBuilder->getQuery()->getResult();
  180.         $total $totalSize[0][1];
  181.         $lastPage ceil($total/$pageSize);
  182.         $collection = [];
  183.         foreach($cmsArticles  as $cmsArticle)
  184.         {
  185.             $article $repository->getArticleFromCmsArticle($cmsArticle);
  186.             $collection[] = $article;
  187.         }
  188.         $meta = [
  189.             'current_page' => (int)$currentPage,
  190.             'from' => $pageFrom,
  191.             'to' => $pageFrom+$pageSize,
  192.             'per_page' => $pageSize,
  193.             'last_page' => $lastPage,
  194.             'total' =>  $total
  195.         ];
  196.         $result = ['data' => $collection,'meta' => $meta];
  197.        
  198.         return $result;
  199.     }
  200.     private function getFilterCriteria($index,$filterData)
  201.     {
  202.         $criteria null;
  203.         
  204.         if(array_key_exists($index,$filterData) and $filterData[$index] != null)
  205.         {
  206.             if(is_array($filterData[$index]))
  207.             {
  208.                 $values array_filter($filterData[$index]);
  209.                 if(!empty($values ))
  210.                 {
  211.                    $criteria $values ;
  212.                 }
  213.             }
  214.             else
  215.             {
  216.                 $criteria trim($filterData[$index]);
  217.             }
  218.         }
  219.         if(null != $criteria and !empty($criteria))
  220.         {
  221.             return $criteria;
  222.         }
  223.         else
  224.         {
  225.             return null;
  226.         }
  227.     }
  228.     
  229. }