Browse Source

Update visit admin

imwald
Nuša Pukšič 3 months ago
parent
commit
0f7ef22db2
  1. 4
      src/Controller/Administration/VisitorAnalyticsController.php
  2. 13
      src/EventListener/VisitTrackingListener.php
  3. 15
      src/Repository/VisitRepository.php
  4. 14
      templates/admin/analytics.html.twig

4
src/Controller/Administration/VisitorAnalyticsController.php

@ -16,12 +16,12 @@ class VisitorAnalyticsController extends AbstractController
#[IsGranted('ROLE_ADMIN')] #[IsGranted('ROLE_ADMIN')]
public function index(VisitRepository $visitRepository): Response public function index(VisitRepository $visitRepository): Response
{ {
$visitStats = $visitRepository->getVisitCountByRoute();
// Counters for the last 24 hours and last 7 days // Counters for the last 24 hours and last 7 days
$last24h = new \DateTimeImmutable('-24 hours'); $last24h = new \DateTimeImmutable('-24 hours');
$last7d = new \DateTimeImmutable('-7 days'); $last7d = new \DateTimeImmutable('-7 days');
$visitStats = $visitRepository->getVisitCountByRoute($last7d);
$last24hCount = $visitRepository->countVisitsSince($last24h); $last24hCount = $visitRepository->countVisitsSince($last24h);
$last7dCount = $visitRepository->countVisitsSince($last7d); $last7dCount = $visitRepository->countVisitsSince($last7d);

13
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; $sessionId = null;
if ($this->security->getUser()) { if ($request->hasSession()) {
// Start session if not already started $session = $request->getSession();
if (!$request->hasSession() || !$request->getSession()->isStarted()) { // Start session if not already started to get/create a session ID
$request->getSession()->start(); if (!$session->isStarted()) {
$session->start();
} }
$sessionId = $request->getSession()->getId(); $sessionId = $session->getId();
} }
// Create and save the visit record // Create and save the visit record

15
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') ->select('v.route, COUNT(v.id) as count')
->groupBy('v.route') ->groupBy('v.route')
->orderBy('count', 'DESC') ->orderBy('count', 'DESC');
->getQuery()
->getResult(); if ($since) {
$qb->where('v.visitedAt >= :since')
->setParameter('since', $since, Types::DATETIME_IMMUTABLE);
}
return $qb->getQuery()->getResult();
} }
/** /**

14
templates/admin/analytics.html.twig

@ -15,17 +15,17 @@
</div> </div>
<div class="analytics-card"> <div class="analytics-card">
<h2>Unique Logged-In Visitors</h2> <h2>Unique Visitors</h2>
<ul class="analytics-stats"> <ul class="analytics-stats">
<li><strong>Last 24 hours:</strong> {{ uniqueVisitors24h }}</li> <li><strong>Last 24 hours:</strong> {{ uniqueVisitors24h }}</li>
<li><strong>Last 7 days:</strong> {{ uniqueVisitors7d }}</li> <li><strong>Last 7 days:</strong> {{ uniqueVisitors7d }}</li>
<li><strong>All time:</strong> {{ totalUniqueVisitors }}</li> <li><strong>All time:</strong> {{ totalUniqueVisitors }}</li>
</ul> </ul>
<p class="analytics-note">Tracked by session ID for logged-in users only</p> <p class="analytics-note">Tracked by session ID (includes both anonymous and logged-in visitors)</p>
</div> </div>
<div class="analytics-card"> <div class="analytics-card">
<h2>Visit Count by Route</h2> <h2>Visit Count by Route (Last 7 Days)</h2>
{% if visitStats|length > 0 %} {% if visitStats|length > 0 %}
<table class="analytics-table"> <table class="analytics-table">
@ -45,12 +45,12 @@
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<p>No visit data recorded yet.</p> <p>No visit data recorded in the last 7 days.</p>
{% endif %} {% endif %}
</div> </div>
<div class="analytics-card"> <div class="analytics-card">
<h2>User Sessions (Last 7 Days)</h2> <h2>Visitor Sessions (Last 7 Days)</h2>
{% if sessionStats|length > 0 %} {% if sessionStats|length > 0 %}
<table class="analytics-table"> <table class="analytics-table">
<thead> <thead>
@ -73,12 +73,12 @@
</tbody> </tbody>
</table> </table>
{% else %} {% else %}
<p>No logged-in visitor sessions recorded in the last 7 days.</p> <p>No visitor sessions recorded in the last 7 days.</p>
{% endif %} {% endif %}
</div> </div>
<div class="analytics-info"> <div class="analytics-info">
<p>Visit tracking is now automated via event listener. Session IDs are captured for logged-in users to track unique visitors and user engagement patterns.</p> <p>Visit tracking is automated via event listener. Session IDs track all unique visitors (both anonymous and logged-in) for accurate engagement analytics.</p>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

Loading…
Cancel
Save