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 @@
Tracked by session ID for logged-in users only
+Tracked by session ID (includes both anonymous and logged-in visitors)
No visit data recorded yet.
+No visit data recorded in the last 7 days.
{% endif %}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.