<?php
namespace Platform\ControlPanelBundle\Provider;
use Cms\CoreBundle\Util\Doctrine\EntityManager;
use Cms\Modules\PageBundle\Entity\Page\PageProxy;
use Cms\TenantBundle\Entity\Tenant;
use Cms\ThemeBundle\Entity\InnerLayout;
use Cms\ThemeBundle\Entity\OuterLayout;
use Cms\WidgetBundle\Service\WidgetManager;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Query\QueryBuilder;
class WidgetStatProvider
{
private const COLOR = '#ff0029';
/**
* @var EntityManager
*/
private EntityManager $entityManager;
/**
* @var WidgetManager
*/
private WidgetManager $widgetManager;
/**
* @param EntityManager $entityManager
* @param WidgetManager $widgetManager
*/
public function __construct(EntityManager $entityManager, WidgetManager $widgetManager)
{
$this->entityManager = $entityManager;
$this->widgetManager = $widgetManager;
}
/**
* @param Tenant|null $tenant
* @return array
* @throws Exception
*/
public function getData(Tenant $tenant = null): array
{
$labels = [];
$datasetData = [];
foreach ($this->widgetManager->gallery() as $widget) {
$labels[$widget['key']] = $widget['name'];
$queryBuilder = $this->getQueryBuilder(PageProxy::class, $tenant);
$count = $queryBuilder
->andWhere(
sprintf('MATCH(entity.data_content) AGAINST("%s\"")', $widget['key'])
)
->fetchOne();
$queryBuilder = $this->getQueryBuilder(OuterLayout::class, $tenant);
$count += $queryBuilder
->andWhere(
sprintf('MATCH(entity.contents) AGAINST("%s\"")', $widget['key'])
)
->fetchOne();
$queryBuilder = $this->getQueryBuilder(InnerLayout::class, $tenant);
$count += $queryBuilder
->andWhere(
sprintf('MATCH(entity.contents) AGAINST("%s\"")', $widget['key'])
)
->fetchOne();
$datasetData[$widget['key']] = $count;
}
$datasets = [
[
'label' => '# of page',
'data' => array_values($datasetData),
'backgroundColor' => self::COLOR,
'borderColor' => self::COLOR,
],
];
return [
'labels' => array_values($labels),
'datasets' => array_values($datasets),
];
}
/**
* @param string $class
* @param Tenant|null $tenant
* @return QueryBuilder
*/
private function getQueryBuilder(string $class, Tenant $tenant = null): QueryBuilder
{
$queryBuilder = $this->entityManager->getConnection()->createQueryBuilder();
$queryBuilder
->select("COUNT(*)")
->from($this->entityManager->getClassMetadata($class)->getTableName(), 'entity');
if ($tenant !== null) {
$queryBuilder
->andWhere('entity.tenant = :tenant')
->setParameter('tenant', $tenant->getId());
}
return $queryBuilder;
}
}