diff --git a/src/Analytic/DateRangeAnalytic.php b/src/Analytic/DateRangeAnalytic.php new file mode 100644 index 0000000..4b47438 --- /dev/null +++ b/src/Analytic/DateRangeAnalytic.php @@ -0,0 +1,38 @@ + + */ +class DateRangeAnalytic extends BaseDateRangeAnalytic +{ + protected string $page; + + public function setPath(string $path): self + { + $this->path = $path; + $this->reload = true; + + return $this; + } + + protected function getEntities(string $type): array + { + $entities = parent::getEntities($type); + + foreach ($entities as $key => $entity) { + if ('view' === $type) { + if ($entity->getPath() !== $this->path) { + unset($entities[$key]); + } + } + } + + return $entities; + } +} diff --git a/src/Controller/Blog/PostAdminController.php b/src/Controller/Blog/PostAdminController.php index 6d2ff96..7906daa 100644 --- a/src/Controller/Blog/PostAdminController.php +++ b/src/Controller/Blog/PostAdminController.php @@ -21,6 +21,8 @@ use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Form\Form; use App\Core\Entity\EntityInterface; use App\Entity\Blog\Post; +use App\Analytic\DateRangeAnalytic; +use App\Core\Repository\Site\NodeRepository; /** * @Route("/admin/blog/post") @@ -43,6 +45,7 @@ class PostAdminController extends CrudController ->setPageRoute('filter', 'admin_blog_post_filter') ->setPageRoute('batch', 'admin_blog_post_batch') ->setPageRoute('fetch_quick_data', 'admin_blog_post_fetch_quick_data') + ->setPageRoute('analytic_stats', 'admin_blog_post_analytic_stats') ->setForm('new', PostType::class, []) ->setForm('edit', PostType::class, []) @@ -52,6 +55,7 @@ class PostAdminController extends CrudController ->setView('form', 'blog/post_admin/_form.html.twig') ->setView('edit', 'blog/post_admin/edit.html.twig') ->setView('show', 'blog/post_admin/show.html.twig') + ->setView('index', 'blog/post_admin/index.html.twig') ->setDefaultSort('index', 'id', 'desc') ->setField('index', 'Titre', TextField::class, [ @@ -228,6 +232,42 @@ class PostAdminController extends CrudController return $this->doDelete($entity, $entityManager, $request); } + /** + * @Route("/analytic_stats/{entity}", name="admin_blog_post_analytic_stats") + */ + public function stats( + Entity $entity, + DateRangeAnalytic $analytic, + NodeRepository $nodeRepository, + string $range = '7days' + ): Response + { + if (!in_array($range, ['7days', '30days', '90days', '1year'])) { + throw $this->createNotFoundException(); + } + + $node = $nodeRepository->findOneBy([ + 'code' => 'post', + ]); + + $analytic + ->setDateRange(new \DateTime('now - '.$range), new \DateTime()) + ->setPath($this->generateUrl('blog_menu_post', [ + 'post' => $entity->getId(), + 'slug' => $entity->getSlug(), + ])) + ->setNode($node) + ; + + return $this->render('@Core/analytic/stats.html.twig', [ + 'range' => $range, + 'views' => $analytic->getViews(), + 'pathViews' => $analytic->getPathViews(), + 'referers' => [], + 'node' => $node, + ]); + } + public function getSection(): string { return 'blog_post'; diff --git a/templates/blog/post_admin/index.html.twig b/templates/blog/post_admin/index.html.twig new file mode 100644 index 0000000..d8f7d1f --- /dev/null +++ b/templates/blog/post_admin/index.html.twig @@ -0,0 +1,14 @@ +{% extends '@Core/admin/crud/index.html.twig' %} + +{% block list_item_actions_before %} + {% if configuration.action(context, 'analytic_stats', true) %} + {% set analytics = path( + configuration.pageRoute('analytic_stats'), + {entity: item.id}|merge(configuration.pageRouteParams('analytic_stats')) + ) %} + + + {% endif %} +{% endblock %}