# Synchronisierung und Cache
# Zwei Wege, auf denen Daten ankommen
# Vollständige Synchronisierung
Holt alle veröffentlichten Datensätze aus der SeminarPlan-API, normalisiert sie (interne Felder wie Notizen, Änderungsprotokolle oder Zuständigkeiten werden verworfen) und schreibt sie in den Cache. Umfang:
| Typ | Endpunkt | Inhalt |
|---|---|---|
| Seminare | /v1/seminars | Alle Texte, Termine, Preise, Einstellungen, Medien, FAQ, Agenda |
| Kategorien | /v1/categories | Baum, Texte, Farben, Icons, FAQ |
| Hersteller | /v1/vendors | Texte, Logos |
| Standorte | /v1/locations | Adresse, Koordinaten, Beschreibung, Anfahrt, Hotels, Vermietung |
| Räume | /v1/rooms | Räume je Standort |
| Wissensseiten | /v1/static-pages | Seiten, Blog, News |
| Lernpfade | /v1/learning-paths | Stufen mit Seminaren |
| Bewertungen | /v1/feedbacks | Veröffentlichte Bewertungen und Statistik |
| Organisation | /v1/organizations | Adresse, Telefon, E-Mail, Logo, Rechtstext-Links |
Auslöser: Dashboard (Synchronisieren oder je Typ), geplante Aufgabe SeminarPlan: Katalog synchronisieren, Konsole seminarplan:sync, oder automatisch beim ersten Seitenaufruf mit leerem Cache. Eine Sperrdatei verhindert parallele Abgleiche.
# Push aus SeminarPlan
Wird in SeminarPlan ein Seminar, eine Kategorie, ein Hersteller, ein Standort oder eine Wissensseite gespeichert, ruft SeminarPlan den in den Systemeinstellungen hinterlegten Sync API Endpunkt auf. Nur dieser Datensatz wird im Cache ersetzt; die Indizes (Listen, Aliase) und der Smart-Search-Eintrag werden aktualisiert. Das dauert Sekunden und belastet die API nicht.
Räume, Lernpfade, Bewertungen und Organisationsdaten werden nicht gepusht. Sie kommen mit der nächsten vollständigen Synchronisierung, deshalb empfehlen wir die stündliche geplante Aufgabe.
TIP
Eine SeminarPlan-Instanz im Entwicklungsmodus sendet keine Push-Aufrufe.
# Der Push-Endpunkt im Detail
POST https://www.beispiel.de/index.php?option=com_seminarplan&controller=sync&task=push_seminar&token=<push-token>
Content-Type: application/json
{"item": { ...vollständiger Datensatz... }}
- Token als Query-Parameter
tokenoder als HeaderX-Webhook-Token; der Vergleich ist zeitkonstant. - Tasks:
push_seminar,push_category,push_vendor,push_location,push_room,push_static-page,push_learning-path,push_feedback,push_menu(wird bestätigt und ignoriert) sowieremove_<typ>mit{"item": {"id": "…"}}zum Entfernen. - Antworten:
200 {"success": true, "changed": {"seminars": ["<id>"]}},401bei falschem Token,400bei unbekanntem Task oder fehlendemitem,405bei GET. - Das Dashboard zeigt den letzten Push unter Letzter Push.
# Bereinigung von Rich-Text
Beim Abgleich (voll und per Push) laufen alle HTML-Felder aus dem CRM durch Joomlas HTML-Filter: script-Tags und andere ausführbare Elemente, Event-Attribute (onclick usw.), javascript:-Links sowie srcdoc/formaction werden entfernt. Tabellen, Bilder, Videos (iframe), Objekte und style-Blöcke bleiben erhalten, ebenso HTML-Entities im Text. Die Option Rich-Text bereinigen in den Einstellungen schaltet das ab; danach ist ein Vollabgleich nötig, weil der Cache bereits bereinigte Inhalte enthält.
# Cache-Aufbau
Standardmäßig liegt der Cache als PHP-Dateien unter cache/com_seminarplan:
meta.php Zeitpunkt und Zähler der letzten Synchronisierung, letzter Push
index/seminars.php schlanker Seminar-Index für Listen, Module, Routing
index/categories.php Kategorien inklusive Baum
index/vendors|locations|rooms|pages|learningpaths.php
index/aliases.php Alias → ID je Typ
items/seminar/<id>.php vollständiges Seminar (Detailseite, Buchung)
items/category/<id>.php vollständige Kategorie
items/page/<id>.php vollständige Wissensseite
feedbacks/stats.php, feedbacks/list.php, feedbacks/seminar/<id>.php
organization.php
Die Dateien sind gegen direkten Aufruf geschützt und werden atomar geschrieben. Mit Cache leeren im Dashboard (oder seminarplan:cache:clear) wird alles gelöscht; beim nächsten Seitenaufruf füllt die Auto-Synchronisierung den Cache neu.
Das Redis-Backend speichert dieselben Schlüssel als JSON in Redis (Präfix einstellbar).
# Konsolenbefehle
php cli/joomla.php seminarplan:sync # vollständige Synchronisierung
php cli/joomla.php seminarplan:sync --type=seminars # nur bestimmte Typen (mehrfach möglich)
php cli/joomla.php seminarplan:status # Cache-Status, Zähler, letzter Abgleich
php cli/joomla.php seminarplan:cache:clear # Cache leeren
php cli/joomla.php seminarplan:menu:create --menutype=mainmenu [--view=…] [--replace]
php cli/joomla.php finder:index # Smart-Search-Index aufbauen
# Geplante Aufgaben
| Routine | Parameter |
|---|---|
| SeminarPlan: Katalog synchronisieren | Datentypen (leer = alles), Suchindex anschließend neu aufbauen |
| SeminarPlan: Suchindex neu aufbauen | – |
Die Aufgaben protokollieren Zusammenfassung und Warnungen im Aufgabenprotokoll von Joomla.
# Fehlersuche
Fehler der Synchronisierung, des Push-Endpunkts und der Formulare werden in administrator/logs/com_seminarplan.php protokolliert.
| Symptom | Ursache und Abhilfe |
|---|---|
| Dashboard: „API nicht konfiguriert“ | API-URL oder API-Key fehlt. |
| Synchronisierung schlägt mit 401 fehl | API-Key ungültig oder für eine andere Organisation ausgestellt. |
| Frontend zeigt „Katalog nicht verfügbar“ (503) | Cache leer und Auto-Sync deaktiviert oder API nicht erreichbar. Synchronisierung im Dashboard starten. |
| Push kommt nicht an | Sync API Endpunkt und Sync Token in den SeminarPlan-Systemeinstellungen prüfen; Antwort in den SeminarPlan-Protokollen ansehen; SeminarPlan im Entwicklungsmodus pusht nicht. |
| Änderungen erscheinen erst verzögert | CLI-Sync und OPcache, siehe Einstellungen → Cache. |
| Bilder fehlen | Medien-Basis-URL prüfen; Bilder werden von SeminarPlan ausgeliefert (uploads/…). |