Skip to content

Commit 20ba757

Browse files
author
Kicktemp Bot
committed
Docs Sync: Update from com_kickbannerstats commit 88833d2451e597b72a92ce871428b87ff346c49e
1 parent ace472b commit 20ba757

14 files changed

Lines changed: 490 additions & 47 deletions
Lines changed: 74 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,114 @@
1-
# API & Looker Studio Integration
1+
# API & Looker Studio
22

3-
KickBannerStats stellt eine JSON-API über den Joomla API Wrapper bereit. Diese wird primär genutzt, um Daten an **Google Looker Studio** zu übergeben.
3+
Die größte Stärke von KickBannerStats liegt in der **Entkopplung**: Während Joomla die Daten sammelt, können externe Tools wie **Google Looker Studio** diese visualisieren – ohne die Performance Ihrer Webseite zu belasten.
44

5-
## API Endpoint
5+
## Das Ergebnis
66

7-
Der Zugriff erfolgt über den `StatisticsController`.
7+
Mit der Integration können Sie interaktive Dashboards erstellen, die Sie direkt mit Ihren Werbekunden teilen können.
88

9-
**Basis-URL:**
9+
![Looker Studio Report](./assets/lookerstudio.png)
10+
11+
### Vorteile dieser Lösung
12+
* 🚀 **Performance:** Der Report lädt blitzschnell, da er auf die aggregierte API zugreift und nicht Millionen von Datenbankzeilen durchsucht.
13+
* 🔒 **Sicherheit:** Kunden erhalten Zugriff auf den Report, aber niemals direkten Zugriff auf Ihr Joomla-Backend.
14+
* 🎨 **White-Label:** Gestalten Sie den Report in Ihrem Corporate Design (oder dem des Kunden).
15+
16+
---
17+
18+
## Die API Schnittstelle
19+
20+
KickBannerStats stellt einen nativen Joomla Webservice (API) Endpunkt bereit.
21+
22+
### Endpoint
23+
24+
```http
25+
GET /api/index.php/v1/kickbannerstats/statistics
26+
27+
```
1028

1129
### Authentifizierung
12-
Die API nutzt die Standard Joomla API Token Authentifizierung (`Bearer Token` oder `X-Joomla-Token`).
1330

14-
### Filter-Parameter
15-
Die API unterstützt folgende GET-Parameter zur Filterung:
31+
Der Zugriff erfolgt über einen **Joomla API Token**. Erstellen Sie diesen im Backend unter **Benutzer** > **Verwalten** > (User auswählen) > **Joomla API Token**.
32+
33+
Der Token muss im Header der Anfrage gesendet werden:
34+
35+
```http
36+
X-Joomla-Token: c2h...I6
37+
38+
```
39+
40+
### Filter Parameter
41+
42+
Sie können die Daten serverseitig filtern, um die Payload klein zu halten:
1643

1744
| Parameter | Typ | Beschreibung |
18-
| :--- | :--- | :--- |
19-
| `filter[begin]` | String (Y-m-d) | Startdatum (inklusiv) |
20-
| `filter[end]` | String (Y-m-d) | Enddatum (inklusiv) |
21-
| `filter[client_id]` | Int | Nur spezifischer Kunde |
22-
| `filter[banner_id]` | Int | Nur spezifisches Banner |
45+
| --- | --- | --- |
46+
| `filter[begin]` | `YYYY-MM-DD` | Startdatum (inklusiv) |
47+
| `filter[end]` | `YYYY-MM-DD` | Enddatum (inklusiv) |
48+
| `filter[client_id]` | `INT` | Nur Daten für einen spezifischen Kunden |
49+
| `filter[banner_id]` | `INT` | Nur Daten für ein spezifisches Banner |
2350

24-
## Beispiel Response
25-
https://ihre-domain.de/api/index.php/v1/kickbannerstats/statistics
51+
### Beispiel Response (JSON)
2652

2753
```json
2854
[
2955
{
30-
"date": "2026-01-20",
56+
"date": "2026-02-12",
3157
"banner_id": 422,
3258
"client_id": 13,
3359
"impressions": 1319,
3460
"clicks": 3,
3561
"banner_name": "Musical Kids Amulett",
3662
"client_name": "besser-im-blick",
37-
"updated_at": "2026-02-12 13:37:39"
63+
"updated_at": "2026-02-13 03:00:00"
3864
},
3965
{
40-
"date": "2026-01-19",
66+
"date": "2026-02-11",
4167
"banner_id": 422,
4268
"client_id": 13,
4369
"impressions": 41324,
4470
"clicks": 38,
4571
"banner_name": "Musical Kids Amulett",
4672
"client_name": "besser-im-blick",
47-
"updated_at": "2026-02-12 13:37:39"
73+
"updated_at": "2026-02-13 03:00:00"
4874
}
4975
]
76+
5077
```
5178

52-
Looker Studio Connector
53-
Um diese Daten in Looker Studio zu nutzen, benötigen Sie ein Google Apps Script (Community Connector), welches diese API konsumiert.
79+
---
80+
81+
## Google Looker Studio Connector
82+
83+
Um die JSON-Daten in Looker Studio zu nutzen, wird ein **Community Connector** (Google Apps Script) benötigt, der die Daten abruft und in das Looker-Format umwandelt.
84+
85+
### Schema Konfiguration
5486

55-
Schema Definition
56-
Im Connector mappen Sie die JSON-Felder wie folgt:
87+
Im Connector werden die JSON-Felder wie folgt gemappt:
5788

58-
date -> Datum (YYYYMMDD)
89+
1. **Dimensionen (Grün):**
90+
* `Date` (Typ: YYYYMMDD)
91+
* `Banner Name` (Typ: Text)
92+
* `Client Name` (Typ: Text)
5993

60-
banner_name -> Text
6194

62-
client_name -> Text
95+
2. **Metriken (Blau):**
96+
* `Impressions` (Typ: Zahl)
97+
* `Clicks` (Typ: Zahl)
98+
99+
100+
3. **Berechnete Felder:**
101+
* **CTR:** Erstellen Sie im Looker Studio ein Feld mit der Formel:
102+
```sql
103+
SUM(Clicks) / SUM(Impressions)
104+
105+
```
106+
63107

64-
impressions -> Zahl
108+
*(Formatieren Sie dieses Feld als Prozent)*
65109

66-
clicks -> Zahl
67110

68-
CTR -> Berechnetes Feld (clicks / impressions)
69111

70-
::: tip Caching
71-
Da die Daten in #__kickbannerstats_daily nur einmal täglich aktualisiert werden, empfiehlt es sich, im Looker Studio Connector ein Caching von 12 bis 24 Stunden zu aktivieren.
72-
:::
112+
::: tip Caching Strategie
113+
Da die Daten in Joomla nur einmal täglich (per Task) aktualisiert werden, sollten Sie im Looker Studio Connector das Caching aktivieren (z.B. für 12 Stunden). Dies beschleunigt den Report für den Endkunden extrem.
114+
:::

src/components/com_kickbannerstats/architecture.md

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1-
# Architektur & Datenbank
1+
# Architektur & Datenfluss
22

3-
Der Kern von KickBannerStats ist die Entkopplung von "Schreiben" (Joomla Core) und "Lesen" (KickBannerStats).
3+
KickBannerStats wurde entwickelt, um ein spezifisches Problem von High-Traffic-Webseiten zu lösen: **Performance bei der Auswertung**.
44

5-
## Datenbank-Schema
5+
Anstatt Millionen von Rohdaten-Zeilen bei jedem Seitenaufruf neu zu berechnen, nutzt die Komponente einen **Data-Warehouse-Ansatz** (ETL: Extract, Transform, Load).
66

7-
Die Komponente nutzt eine eigene, flache Tabelle zur Speicherung der Tageswerte pro Banner und Kunde.
7+
## 1. Das Datenbank-Schema
8+
9+
Die Basis der Performance ist die Entkopplung von Schreib- und Lese-Operationen.
10+
11+
* **Schreiben (Joomla Core):** Jeder View/Klick landet in `#__banner_tracks`. Diese Tabelle wächst extrem schnell.
12+
* **Lesen (KickBannerStats):** Wir nutzen eine flache, aggregierte Tabelle namens `#__kickbannerstats_daily`.
13+
14+
### Tabellenstruktur
15+
16+
Die Tabelle `#__kickbannerstats_daily` speichert **eine Zeile pro Banner, Kunde und Tag**.
817

918
```sql
1019
CREATE TABLE IF NOT EXISTS `#__kickbannerstats_daily`
@@ -20,6 +29,63 @@ CREATE TABLE IF NOT EXISTS `#__kickbannerstats_daily`
2029
PRIMARY KEY (`date`, `banner_id`, `client_id`),
2130
KEY `idx_banner_date` (`banner_id`, `date`),
2231
KEY `idx_client_date` (`client_id`, `date`)
23-
) ENGINE = InnoDB
24-
DEFAULT CHARSET = utf8mb4
25-
DEFAULT COLLATE = utf8mb4_unicode_ci;
32+
) ENGINE = InnoDB ...;
33+
34+
```
35+
36+
**Vorteile dieses Schemas:**
37+
38+
* **Komprimierung:** Aus 1.000.000 Tracking-Events an einem Tag werden vielleicht nur 50 Zeilen (je nach Anzahl der aktiven Banner).
39+
* **Indexierung:** Der `PRIMARY KEY` über Datum und IDs ermöglicht extrem schnelle Range-Queries (z.B. "Letzte 30 Tage").
40+
41+
---
42+
43+
## 2. Der ETL-Prozess (Task Plugin)
44+
45+
Die Daten gelangen nicht in Echtzeit in die Statistik-Tabelle, sondern über einen **Scheduled Task** (Geplante Aufgabe). Das Plugin `plg_task_kickbannerstats` übernimmt diese Arbeit.
46+
47+
### Routine A: `create.stats` (Täglich)
48+
49+
Dieser Task ist das Arbeitspferd und sollte **einmal täglich** laufen.
50+
51+
1. **Zeitraum:** Er greift standardmäßig die letzten **3 Tage** ab (`backfillDays` Parameter).
52+
* *Warum 3 Tage?* Um sicherzustellen, dass Klicks kurz vor Mitternacht oder Zeitzonen-Differenzen korrekt erfasst werden, selbst wenn der Task mal einen Tag ausfällt.
53+
54+
55+
2. **Aggregation:** Er gruppiert die Rohdaten aus `#__banner_tracks` nach `DATE(track_date)`, `banner_id` und `cid`.
56+
3. **Upsert:** Die Daten werden mit `INSERT ... ON DUPLICATE KEY UPDATE` in die Zieltabelle geschrieben. Das bedeutet:
57+
* Existiert der Eintrag für diesen Tag/Banner schon? -> **Update** (Zahlen aktualisieren).
58+
* Existiert er noch nicht? -> **Insert** (Neu anlegen).
59+
60+
61+
62+
### Routine B: `backfillStats` (Historisch)
63+
64+
Dieser Task dient der initialen Befüllung oder Reparatur. Er ist für große Datenmengen optimiert.
65+
66+
1. **Chunking:** Er verarbeitet den gewählten Zeitraum nicht am Stück, sondern in Blöcken (z.B. 30 Tage).
67+
2. **Memory Management:** Dies verhindert, dass PHP bei jahrelangen Historien in ein `Memory Limit` läuft.
68+
3. **Idempotenz:** Kann gefahrlos mehrfach ausgeführt werden, da er bestehende Werte einfach überschreibt.
69+
70+
---
71+
72+
## 3. Datenabruf (Read Path)
73+
74+
Sobald die Daten in `#__kickbannerstats_daily` liegen, werden sie von der Komponente konsumiert.
75+
76+
### Im Backend (MVC)
77+
78+
* **DashboardModel:** Summiert die Werte für den Dashboard-Zeitraum (z.B. 30 Tage). Die **CTR** (Click-Through-Rate) wird dabei "on the fly" berechnet (`Klicks / Impressionen * 100`).
79+
* **StatisticsModel:** Listet die Tageswerte auf und ermöglicht Filterung nach Kunde/Banner.
80+
81+
### Über die API (Headless)
82+
83+
Der `StatisticsController` stellt die Daten als JSON bereit.
84+
85+
* Er nutzt `Joomla\CMS\MVC\Controller\ApiController`.
86+
* Er unterstützt Filterung via `filter[begin]`, `filter[end]`, etc.
87+
* Er gibt die Daten direkt aus der aggregierten Tabelle zurück, was Antwortzeiten im Millisekunden-Bereich ermöglicht, selbst bei jahrelanger Historie.
88+
89+
::: tip Zusammenfassung
90+
Die Architektur opfert **Echtzeit-Daten** (Daten sind max. 24h alt) zugunsten von massiver **Performance-Steigerung** und **Skalierbarkeit** für Reporting-Zwecke.
91+
:::
454 KB
Loading
286 KB
Loading
474 KB
Loading
305 KB
Loading
561 KB
Loading
462 KB
Loading
312 KB
Loading
245 KB
Loading

0 commit comments

Comments
 (0)