From 0f7ef22db232bb1abb5dbaacf0468a145ae2e5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nu=C5=A1a=20Puk=C5=A1i=C4=8D?= Date: Mon, 6 Oct 2025 16:07:36 +0200 Subject: [PATCH] Update visit admin --- .../Administration/VisitorAnalyticsController.php | 4 ++-- src/EventListener/VisitTrackingListener.php | 13 +++++++------ src/Repository/VisitRepository.php | 15 ++++++++++----- templates/admin/analytics.html.twig | 14 +++++++------- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/Controller/Administration/VisitorAnalyticsController.php b/src/Controller/Administration/VisitorAnalyticsController.php index 0d10489..45ec58d 100644 --- a/src/Controller/Administration/VisitorAnalyticsController.php +++ b/src/Controller/Administration/VisitorAnalyticsController.php @@ -16,12 +16,12 @@ class VisitorAnalyticsController extends AbstractController #[IsGranted('ROLE_ADMIN')] public function index(VisitRepository $visitRepository): Response { - $visitStats = $visitRepository->getVisitCountByRoute(); - // Counters for the last 24 hours and last 7 days $last24h = new \DateTimeImmutable('-24 hours'); $last7d = new \DateTimeImmutable('-7 days'); + $visitStats = $visitRepository->getVisitCountByRoute($last7d); + $last24hCount = $visitRepository->countVisitsSince($last24h); $last7dCount = $visitRepository->countVisitsSince($last7d); diff --git a/src/EventListener/VisitTrackingListener.php b/src/EventListener/VisitTrackingListener.php index 7ade5be..6fbf77d 100644 --- a/src/EventListener/VisitTrackingListener.php +++ b/src/EventListener/VisitTrackingListener.php @@ -47,14 +47,15 @@ class VisitTrackingListener } } - // Get session ID if user is logged in + // Get session ID for all visitors (both logged-in and anonymous) $sessionId = null; - if ($this->security->getUser()) { - // Start session if not already started - if (!$request->hasSession() || !$request->getSession()->isStarted()) { - $request->getSession()->start(); + if ($request->hasSession()) { + $session = $request->getSession(); + // Start session if not already started to get/create a session ID + if (!$session->isStarted()) { + $session->start(); } - $sessionId = $request->getSession()->getId(); + $sessionId = $session->getId(); } // Create and save the visit record diff --git a/src/Repository/VisitRepository.php b/src/Repository/VisitRepository.php index 7ae525c..613dd68 100644 --- a/src/Repository/VisitRepository.php +++ b/src/Repository/VisitRepository.php @@ -26,14 +26,19 @@ class VisitRepository extends ServiceEntityRepository } } - public function getVisitCountByRoute(): array + public function getVisitCountByRoute(\DateTimeImmutable $since = null): array { - return $this->createQueryBuilder('v') + $qb = $this->createQueryBuilder('v') ->select('v.route, COUNT(v.id) as count') ->groupBy('v.route') - ->orderBy('count', 'DESC') - ->getQuery() - ->getResult(); + ->orderBy('count', 'DESC'); + + if ($since) { + $qb->where('v.visitedAt >= :since') + ->setParameter('since', $since, Types::DATETIME_IMMUTABLE); + } + + return $qb->getQuery()->getResult(); } /** diff --git a/templates/admin/analytics.html.twig b/templates/admin/analytics.html.twig index 7dbb8db..c0b8ecb 100644 --- a/templates/admin/analytics.html.twig +++ b/templates/admin/analytics.html.twig @@ -15,17 +15,17 @@
-

Unique Logged-In Visitors

+

Unique Visitors

-

Tracked by session ID for logged-in users only

+

Tracked by session ID (includes both anonymous and logged-in visitors)

-

Visit Count by Route

+

Visit Count by Route (Last 7 Days)

{% if visitStats|length > 0 %} @@ -45,12 +45,12 @@
{% else %} -

No visit data recorded yet.

+

No visit data recorded in the last 7 days.

{% endif %}
-

User Sessions (Last 7 Days)

+

Visitor Sessions (Last 7 Days)

{% if sessionStats|length > 0 %} @@ -73,12 +73,12 @@
{% else %} -

No logged-in visitor sessions recorded in the last 7 days.

+

No visitor sessions recorded in the last 7 days.

{% endif %}
-

Visit tracking is now automated via event listener. Session IDs are captured for logged-in users to track unique visitors and user engagement patterns.

+

Visit tracking is automated via event listener. Session IDs track all unique visitors (both anonymous and logged-in) for accurate engagement analytics.

{% endblock %}