src/Platform/ControlPanelBundle/Provider/WidgetStatProvider.php line 42

Open in your IDE?
  1. <?php
  2. namespace Platform\ControlPanelBundle\Provider;
  3. use Cms\CoreBundle\Util\Doctrine\EntityManager;
  4. use Cms\Modules\PageBundle\Entity\Page\PageProxy;
  5. use Cms\TenantBundle\Entity\Tenant;
  6. use Cms\ThemeBundle\Entity\InnerLayout;
  7. use Cms\ThemeBundle\Entity\OuterLayout;
  8. use Cms\WidgetBundle\Service\WidgetManager;
  9. use Doctrine\DBAL\Exception;
  10. use Doctrine\DBAL\Query\QueryBuilder;
  11. class WidgetStatProvider
  12. {
  13.     private const COLOR '#ff0029';
  14.     /**
  15.      * @var EntityManager
  16.      */
  17.     private EntityManager $entityManager;
  18.     /**
  19.      * @var WidgetManager
  20.      */
  21.     private WidgetManager $widgetManager;
  22.     /**
  23.      * @param EntityManager $entityManager
  24.      * @param WidgetManager $widgetManager
  25.      */
  26.     public function __construct(EntityManager $entityManagerWidgetManager $widgetManager)
  27.     {
  28.         $this->entityManager $entityManager;
  29.         $this->widgetManager $widgetManager;
  30.     }
  31.     /**
  32.      * @param Tenant|null $tenant
  33.      * @return array
  34.      * @throws Exception
  35.      */
  36.     public function getData(Tenant $tenant null): array
  37.     {
  38.         $labels = [];
  39.         $datasetData = [];
  40.         foreach ($this->widgetManager->gallery() as $widget) {
  41.             $labels[$widget['key']] = $widget['name'];
  42.             $queryBuilder $this->getQueryBuilder(PageProxy::class, $tenant);
  43.             $count $queryBuilder
  44.                 ->andWhere(
  45.                     sprintf('MATCH(entity.data_content) AGAINST("%s\"")'$widget['key'])
  46.                 )
  47.                 ->fetchOne();
  48.             $queryBuilder $this->getQueryBuilder(OuterLayout::class, $tenant);
  49.             $count += $queryBuilder
  50.                 ->andWhere(
  51.                     sprintf('MATCH(entity.contents) AGAINST("%s\"")'$widget['key'])
  52.                 )
  53.                 ->fetchOne();
  54.             $queryBuilder $this->getQueryBuilder(InnerLayout::class, $tenant);
  55.             $count += $queryBuilder
  56.                 ->andWhere(
  57.                     sprintf('MATCH(entity.contents) AGAINST("%s\"")'$widget['key'])
  58.                 )
  59.                 ->fetchOne();
  60.             $datasetData[$widget['key']] = $count;
  61.         }
  62.         $datasets = [
  63.             [
  64.                 'label' => '# of page',
  65.                 'data' => array_values($datasetData),
  66.                 'backgroundColor' => self::COLOR,
  67.                 'borderColor' => self::COLOR,
  68.             ],
  69.         ];
  70.         return [
  71.             'labels' => array_values($labels),
  72.             'datasets' => array_values($datasets),
  73.         ];
  74.     }
  75.     /**
  76.      * @param string $class
  77.      * @param Tenant|null $tenant
  78.      * @return QueryBuilder
  79.      */
  80.     private function getQueryBuilder(string $classTenant $tenant null): QueryBuilder
  81.     {
  82.         $queryBuilder $this->entityManager->getConnection()->createQueryBuilder();
  83.         $queryBuilder
  84.             ->select("COUNT(*)")
  85.             ->from($this->entityManager->getClassMetadata($class)->getTableName(), 'entity');
  86.         if ($tenant !== null) {
  87.             $queryBuilder
  88.                 ->andWhere('entity.tenant = :tenant')
  89.                 ->setParameter('tenant'$tenant->getId());
  90.         }
  91.         return $queryBuilder;
  92.     }
  93. }