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 @@ -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);

13
src/EventListener/VisitTrackingListener.php

@ -47,14 +47,15 @@ class VisitTrackingListener @@ -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

15
src/Repository/VisitRepository.php

@ -26,14 +26,19 @@ class VisitRepository extends ServiceEntityRepository @@ -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();
}
/**

14
templates/admin/analytics.html.twig

@ -15,17 +15,17 @@ @@ -15,17 +15,17 @@
</div>
<div class="analytics-card">
<h2>Unique Logged-In Visitors</h2>
<h2>Unique Visitors</h2>
<ul class="analytics-stats">
<li><strong>Last 24 hours:</strong> {{ uniqueVisitors24h }}</li>
<li><strong>Last 7 days:</strong> {{ uniqueVisitors7d }}</li>
<li><strong>All time:</strong> {{ totalUniqueVisitors }}</li>
</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 class="analytics-card">
<h2>Visit Count by Route</h2>
<h2>Visit Count by Route (Last 7 Days)</h2>
{% if visitStats|length > 0 %}
<table class="analytics-table">
@ -45,12 +45,12 @@ @@ -45,12 +45,12 @@
</tbody>
</table>
{% else %}
<p>No visit data recorded yet.</p>
<p>No visit data recorded in the last 7 days.</p>
{% endif %}
</div>
<div class="analytics-card">
<h2>User Sessions (Last 7 Days)</h2>
<h2>Visitor Sessions (Last 7 Days)</h2>
{% if sessionStats|length > 0 %}
<table class="analytics-table">
<thead>
@ -73,12 +73,12 @@ @@ -73,12 +73,12 @@
</tbody>
</table>
{% 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 %}
</div>
<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>
{% endblock %}

Loading…
Cancel
Save