Architektur & Technisches
Dieser Abschnitt richtet sich an Entwickler und beschreibt das Datenmodell, den MVC-Aufbau und den technischen Ablauf des KCM.
Datenbank-Schema
Der KCM legt fünf eigene Tabellen in der Joomla-Datenbank an:
Datumsfelder seit 1.5.0
Datumsfelder ohne Wert (expired bei Einwilligungen, publish_up und publish_down bei Scripts) enthalten NULL statt 0000-00-00 00:00:00. created und modified haben den Standardwert CURRENT_TIMESTAMP. Das Schema-Update 1.5.0.sql wandelt bestehende Daten um. Der Grund: MySQL 8 im Strict-Mode akzeptiert das Nulldatum nicht.
#__kickconsentmanager_categories
Speichert die Service-Kategorien.
CREATE TABLE `#__kickconsentmanager_categories` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL DEFAULT '',
`alias` VARCHAR(400) NOT NULL DEFAULT '',
`description` TEXT NOT NULL,
`translations` TEXT NOT NULL, -- JSON: Sprachspezifische Übersetzungen
`required` INT(1) NOT NULL DEFAULT 0,
`state` TINYINT(3) NOT NULL DEFAULT 0,
`created` DATETIME NOT NULL,
`created_by` INT UNSIGNED NOT NULL DEFAULT 0,
`modified` DATETIME NOT NULL,
`modified_by` INT UNSIGNED NOT NULL DEFAULT 0,
`version` INT UNSIGNED NOT NULL DEFAULT 1,
`ordering` INT(11) NOT NULL DEFAULT 0,
`note` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_state` (`state`),
KEY `idx_alias` (`alias`(191))
)#__kickconsentmanager_services
Speichert die einzelnen Services.
CREATE TABLE `#__kickconsentmanager_services` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`asset_id` INT UNSIGNED NOT NULL DEFAULT 0, -- Joomla ACL
`title` VARCHAR(255) NOT NULL DEFAULT '',
`alias` VARCHAR(400) NOT NULL DEFAULT '',
`catid` INT UNSIGNED NOT NULL DEFAULT 0, -- FK zu categories
`informations` TEXT NOT NULL, -- JSON: Informationsfelder
`state` TINYINT(3) NOT NULL DEFAULT 0,
`version` INT UNSIGNED NOT NULL DEFAULT 1,
`ordering` INT(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_catid` (`catid`),
KEY `idx_alias` (`alias`(191))
)#__kickconsentmanager_cookies
Cookie-Dokumentationseinträge.
CREATE TABLE `#__kickconsentmanager_cookies` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL DEFAULT '', -- Cookie-Name
`serviceid` INT UNSIGNED NOT NULL DEFAULT 0, -- FK zu services
`informations` TEXT DEFAULT NULL, -- JSON: Informationsfelder
`state` TINYINT(3) NOT NULL DEFAULT 0,
`ordering` INT(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_catid` (`serviceid`)
)#__kickconsentmanager_scripts
Tracking-Scripts.
CREATE TABLE `#__kickconsentmanager_scripts` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL DEFAULT '',
`head_body` TINYINT(1) NOT NULL DEFAULT 1, -- 1=head, 0=body
`type` TINYINT(1) NOT NULL DEFAULT 0, -- 0=code, 1=src
`code` TEXT NOT NULL, -- Inline-Script
`src` VARCHAR(1024) NOT NULL, -- Script-URL
`render_type` VARCHAR(255) NOT NULL DEFAULT '', -- '', 'defer', 'async'
`attr` VARCHAR(1024) NOT NULL DEFAULT '', -- Zusätzliche Attribute
`serviceid` INT UNSIGNED NOT NULL DEFAULT 0, -- FK zu services
`language` CHAR(7) NOT NULL, -- Joomla-Sprachcode
`publish_up` DATETIME NOT NULL,
`publish_down` DATETIME NOT NULL,
`state` TINYINT(3) NOT NULL DEFAULT 0,
`ordering` INT(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_cookieid` (`serviceid`)
)#__kickconsentmanager_consents
Einwilligungsprotokoll.
CREATE TABLE `#__kickconsentmanager_consents` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uuid` VARCHAR(40) NOT NULL DEFAULT '', -- Browser-UUID
`cookie_version` INT UNSIGNED DEFAULT NULL, -- KCM-Konfigurationsversion
`consents` TEXT DEFAULT NULL, -- JSON: Service-Alias → bool
`is_latest` TINYINT(3) NOT NULL DEFAULT 0, -- Aktuellster Eintrag?
`created` DATETIME NOT NULL,
`expired` DATETIME NOT NULL,
`rawdata` TEXT DEFAULT NULL, -- Roher kcm_data-Cookie
PRIMARY KEY (`id`),
KEY `idx_uid` (`uuid`)
)MVC-Struktur
Der KCM ist als vollständige Joomla-Komponente mit MVC-Architektur implementiert:
Namespace
Kicktemp\Component\ConsentManagerBackend (Administrator)
administrator/components/com_kickconsentmanager/
├── src/
│ ├── Controller/ # DisplayController, CategoriesController, StatisticsController (CSV-Export), DesignController (Design zurücksetzen), TransferController (Import/Export), ...
│ ├── Model/ # DashboardModel, CategoriesModel, ServiceModel, TransferModel (Export, Validierung, Import), ...
│ ├── View/ # Categories/HtmlView, Services/HtmlView, ...
│ ├── Table/ # CategoryTable, ServiceTable, CookieTable, ...
│ ├── Field/ # KcmdevField, RegisterwebsiteField, ...
│ ├── Extension/ # KickconsentmanagerComponent.php
│ └── Dispatcher/ # Dispatcher.php
├── tmpl/ # Template-Dateien
├── forms/ # XML Form Definitionen
├── language/ # Sprachdateien (de-DE, en-GB)
├── sql/ # Install/Uninstall SQL + Updates
├── config.xml # Komponenten-Konfiguration
├── access.xml # ACL-Definitionen
└── kickconsentmanager.xml # Extension ManifestFrontend (Site)
components/com_kickconsentmanager/
├── src/
│ ├── Controller/ # DisplayController, ConsentController
│ ├── Model/ # ServicesModel
│ ├── View/ # Services/HtmlView
│ ├── Helper/ # KickConsentManagerHelper
│ └── Service/ # Router
├── layouts/kickconsentmanager/ # Layout-Dateien (category, cookies, services, infos)
└── tmpl/services/ # Template für Frontend-AnsichtPlugins
plugins/system/kickconsentmanager/ # Namespace Kicktemp\Plugin\System\KickConsentManager
├── services/provider.php # Service-Provider (DI)
├── src/Extension/KickConsentManager.php # Plugin-Klasse (SubscriberInterface)
├── language/
└── kickconsentmanager.xml
plugins/task/kickconsentmanager/ # Namespace Kicktemp\Plugin\Task\KickConsentManager
├── services/provider.php
├── src/Extension/KickConsentManager.php # Aufgabe „Einwilligungen bereinigen“
├── forms/purge.xml
├── language/
└── kickconsentmanager.xmlMedia
media/com_kickconsentmanager/
├── joomla.asset.json # Registrierung der Assets (Cache-Buster = Versionsnummer)
├── js/
│ ├── kcm.min.js # Banner (Frontend)
│ ├── kcmdevkit.min.js # DevKit
│ ├── registerwebsite.js # Website-Registrierung (Backend)
│ ├── statistics.js # Diagramme der Statistik
│ ├── resetdesign.js # Button „Design zurücksetzen“
│ └── chart.min.js # Chart.js für die Statistik
└── css/
├── kcm.min.css # Layout „Banner“
├── kcmwall.min.css # Layout „Wall“
└── dev-kit.min.css # DevKitDie Dateinamen enthalten keine Versionsnummer mehr. Der Cache-Buster (?1.5.0) wird von Joomla aus joomla.asset.json angehängt.
| Asset-Name | Datei |
|---|---|
com_kickconsentmanager.kcm | js/kcm.min.js |
com_kickconsentmanager.kcmdevkit | js/kcmdevkit.min.js (hängt von kcm ab) |
com_kickconsentmanager.style.kcm | css/kcm.min.css |
com_kickconsentmanager.style.kcmwall | css/kcmwall.min.css |
com_kickconsentmanager.style.devkit | css/dev-kit.min.css |
com_kickconsentmanager.chart | js/chart.min.js |
com_kickconsentmanager.statistics | js/statistics.js (hängt von chart ab) |
com_kickconsentmanager.resetdesign | js/resetdesign.js |
com_kickconsentmanager.registerwebsite | js/registerwebsite.js |
Eigener Code, der diese Dateien einbinden will, nutzt am besten den WebAssetManager ($wa->getRegistry()->addExtensionRegistryFile('com_kickconsentmanager'); $wa->useScript('com_kickconsentmanager.kcm');).
Consent-Flow (Technisch)
1. Joomla lädt Seite
↓
2. KCM Plugin (System-Plugin) greift ein
- Prüft kcm_data-Cookie
- Kein gültiger Cookie → Banner-HTML in Seite injizieren
- Gültiger Cookie → Scripts der akzeptierten Services in <head>/<body> injizieren
↓
3. JavaScript (kcm.js) im Browser
- Rendert Banner
- Verwaltet CPC-Interaktionen
- Schreibt Entscheidung als kcm_data-Cookie
- POST-Request an Joomla API → Consent in DB speichern
↓
4. ConsentController (Frontend)
- Empfängt POST-Request
- Schreibt Eintrag in #__kickconsentmanager_consents
- Gibt UUID zurück
↓
5. Später: Einwilligung ändern
- Button zum erneuten Öffnen, data-kcm-open oder KICK_KCM.showPreferenceCenter()
- Preference Center mit gespeicherter Auswahl, danach wieder Schritt 3 und 4Informations-Felder (JSON-Format)
Das informations-Feld in Services und Cookies speichert strukturierte Zusatzinformationen als JSON:
{
"informations0": {
"language": "*",
"label": "Gesetzt von",
"desc": "",
"value": "Eigentümer dieser Website",
"info_type": "text",
"info_target": 1,
"info_nofollow": 1,
"info_text": ""
},
"informations1": {
"language": "*",
"label": "Zweck",
"desc": "",
"value": "Einwilligung speichern",
"info_type": "text",
"info_target": 1,
"info_nofollow": 1,
"info_text": ""
}
}Die info_type-Werte entsprechen: text, textarea, list, link, mail.
Joomla Content Types
Der KCM registriert seine Entitäten in #__content_types, um mit dem Joomla-Versioning und den UCM-Features zu interagieren:
com_kickconsentmanager.categorycom_kickconsentmanager.servicecom_kickconsentmanager.cookiecom_kickconsentmanager.script