{% extends 'admin/shell.html.twig' %} {% set nav = 'statistics' %} {% block title %}Statistik{% endblock %} {% block heading %}Statistik{% endblock %} {% block lead %}Gezählt wird auf dem Server, ohne Cookie und ohne IP-Adresse – deshalb braucht diese Messung keine Einwilligung. Zeiten in UTC.{% endblock %} {% block actions %} Als CSV {% endblock %} {% block content %} {% set perDay = stats.total / stats.range %} {% set delta = stats.previousTotal > 0 ? ((stats.total - stats.previousTotal) / stats.previousTotal * 100)|round : null %} {% set weekdayNames = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'] %} {% set weekdayShort = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'] %} {# Die Kennzahlen zuerst: was der Zeitraum gebracht hat, und woran man es misst. #}
Seitenaufrufe {{ stats.total|number_format(0, ',', '.') }} {% if delta is null %} {{ stats.total > 0 ? 'im Zeitraum davor keine Aufrufe' : 'noch nichts gezählt' }} {% else %} {{ delta > 0 ? '+' : '' }}{{ delta|number_format(0, ',', '.') }} % gegenüber {{ ranges[range]|lower }} davor ({{ stats.previousTotal|number_format(0, ',', '.') }}) {% endif %}
Im Schnitt je Tag {{ perDay|number_format(perDay < 10 ? 1 : 0, ',', '.') }} seit {{ stats.from|date('d.m.Y') }}
Stärkster Tag {{ stats.busiestDay ? stats.busiest|number_format(0, ',', '.') : '–' }} {{ stats.busiestDay ? stats.busiestDay|date('d.m.Y') ~ ', ' ~ weekdayNames[stats.busiestDay|date('N') - 1] : 'kein Aufruf im Zeitraum' }}
Aufgerufene Seiten {{ stats.pageCount|number_format(0, ',', '.') }} unterschiedliche Adressen
Über Verweise {{ stats.referred|number_format(0, ',', '.') }} {{ stats.total > 0 ? (stats.referred / stats.total * 100)|round ~ ' % kamen von einer anderen Website' : 'von einer anderen Website' }}
Nicht gefunden {{ stats.missingTotal|number_format(0, ',', '.') }} Aufrufe einer Adresse ohne Seite

Verlauf {{ stats.total }}

Aufrufe je Tag, {{ stats.from|date('d.m.') }} bis heute
{% if stats.total == 0 %}

Noch keine Aufrufe in diesem Zeitraum. Gezählt wird erst, wenn eine veröffentlichte Seite tatsächlich abgerufen wird – Aufrufe der Verwaltung und erkennbare Suchmaschinen zählen nicht mit.

{% else %} {# Drawn by the server as an SVG: no chart library, no script, and it prints. The bars are coloured by class, not by a style attribute, because inline styles are forbidden here. The numbers themselves are in the table below, which is what a screen reader reads. Jeder Balken traegt seinen Tag und seine Zahl als Titel - der Browser zeigt sie beim Ueberfahren, ohne dass ein Skript etwas nachrechnen muss. #} {% set width = stats.days|length * 12 %} {% for line in [25, 50, 75] %}{% endfor %} {% for entry in stats.days %} {% set height = entry.count > 0 ? (entry.count / stats.busiest * 100)|round(1) : 0 %} {{ entry.day|date('d.m.Y') }}: {{ entry.count }} {{ entry.count == 1 ? 'Aufruf' : 'Aufrufe' }} {% endfor %}

{{ stats.days|first.day|date('d.m.') }}Skala bis {{ stats.busiest }} · stärkster Tag hervorgehoben{{ stats.days|last.day|date('d.m.') }}

Zahlen je Tag
{% for entry in stats.days|reverse %} {% endfor %}
Aufrufe je Tag im gewählten Zeitraum
TagWochentagAufrufe
{{ entry.day|date('d.m.Y') }}{{ weekdayShort[entry.day|date('N') - 1] }}{{ entry.count }}
{% endif %}
{% if stats.total > 0 %}

Tageszeit

Summe je Stunde
{% set busiestHour = max(stats.hours|map(entry => entry.count)|filter(count => count > 0)|default([1])) %} {% for line in [25, 50, 75] %}{% endfor %} {% for entry in stats.hours %} {% set height = entry.count > 0 ? (entry.count / busiestHour * 100)|round(1) : 0 %} {{ entry.hour }} bis {{ entry.hour + 1 }} Uhr: {{ entry.count }} {{ entry.count == 1 ? 'Aufruf' : 'Aufrufe' }} {% endfor %}

0 Uhr612 Uhr1823 Uhr

Nur die letzten {{ compactAfter }} Tage sind stundengenau; ältere Tage sind zu einem Tageswert zusammengefasst und erscheinen hier nicht. Das hält die Tabelle klein, kostet aber die Stunde – eine Entscheidung, keine Lücke.

Wochentag

Im Schnitt je Tag
{% set busiestWeekday = max(stats.weekdays|map(entry => entry.average)|filter(average => average > 0)|default([1])) %} {% for line in [25, 50, 75] %}{% endfor %} {% for entry in stats.weekdays %} {% set height = entry.average > 0 ? (entry.average / busiestWeekday * 100)|round(1) : 0 %} {{ weekdayNames[entry.weekday - 1] }}: im Schnitt {{ entry.average|number_format(1, ',', '.') }} Aufrufe ({{ entry.count }} gesamt) {% endfor %}

{% for name in weekdayShort %}{{ name }}{% endfor %}

Der Schnitt gleicht aus, dass ein Zeitraum nicht jeden Wochentag gleich oft enthält.

{% endif %}
{% for group in [ {title: 'Seiten', hint: 'Meistaufgerufen', rows: stats.pages, key: 'path', link: true}, {title: 'Verweise von außen', hint: 'Websites, die verlinkt haben', rows: stats.referrers, key: 'referrer_host', link: false}, {title: 'Nicht gefundene Adressen', hint: 'Kandidaten für eine Weiterleitung', rows: stats.missing, key: 'path', link: false} ] %}

{{ group.title }}

{{ group.hint }}
{% if group.rows is empty %}

Keine Daten im Zeitraum.

{% else %} {% set top = (group.rows|first).count %}
    {% for row in group.rows %}
  1. {% if group.link %}{{ row[group.key] }}{% else %}{{ row[group.key] }}{% endif %} {{ row.count|number_format(0, ',', '.') }}
  2. {% endfor %}
{% endif %}
{% endfor %}
Was diese Zahlen nicht sagen

Gezählt werden Aufrufe, nicht Besucher: ohne Wiedererkennung lässt sich nicht sagen, ob zehn Aufrufe von zehn Personen oder von einer kommen. Es gibt deshalb auch keine Verweildauer, keine Absprungrate, keinen Klickweg durch die Website und kein Land. All das braucht ein Merkmal, das eine Person wiedererkennbar macht – und damit eine Einwilligung.

Erkennbare Suchmaschinen und Überwachungsdienste werden anhand ihrer Kennung ausgeschlossen. Das ist eine Heuristik: wer sich als Browser ausgibt, wird mitgezählt. Die Zahl ist also „Aufrufe, die sich nicht als Maschine gemeldet haben“, nicht „Menschen“. Erfundene Adressen von Crawlern laufen gesammelt unter (sonstige), damit die Tabelle nicht mit tausenden Zeilen wächst.

Aufbewahrt wird {{ keepDays }} Tage, damit ein Vergleich mit dem Vorjahresmonat möglich bleibt. Danach wird gelöscht.

KantSites · Arbeitsstand

{% endblock %}