# 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 token oder als Header X-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) sowie remove_<typ> mit {"item": {"id": "…"}} zum Entfernen.
  • Antworten: 200 {"success": true, "changed": {"seminars": ["<id>"]}}, 401 bei falschem Token, 400 bei unbekanntem Task oder fehlendem item, 405 bei 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/…).
Last Updated: 9/16/2026, 9:50:50 AM