6.7 KiB
mummert/ks-nossenerland-bundle
Contao-Bundle fuer projektspezifische Erweiterungen rund um Veranstaltungen im Kirchspiel Nossener Land.
Ziel dieses Bundles ist die Kapselung bestehender, produktiver Logik (ohne fachliche Aenderung) als installierbares Paket.
Funktionsueberblick
Das Bundle erweitert vor allem die Event-Verwaltung und den Event-Output in Contao:
- DCA-Erweiterung fuer
tl_calendar_events(zusatzliche Felder, Palettenanpassung, Callback fuer Aliasbildung) - Template-Hooks zur Anreicherung von Event-, Orts- und Angebotsdaten
- iCal-Hook zur Anpassung von VEvent-Daten
- CLI-Commands fuer
- Export von Events zum EVLKS-Kalender (SOAP + Aufraeumen nicht mehr vorhandener Eintraege)
- Export von Events in eine JSON-Datei fuer externe Nutzung
Technische Bestandteile
1) DCA-Anpassungen fuer Kalender-Events
Datei: contao/dca/tl_calendar_events.php
- Fuegt u. a. Felder hinzu:
catalog_ortcatalog_kontaktcatalog_pfarrbereichegodi_optionssubtitlecontributorsevlkscalendarexportexternal_location
- Passt Paletten an (Legenden/Felder) und entfernt Standard-Location-Felder aus der Default-Palette.
- Aktiviert Alias-Neuaufbau ueber
onsubmit_callback.
2) Alias-Bildung fuer Events
Datei: src/EventListener/CalendarAliasListener.php
- Erzeugt beim Speichern eines Events einen sprechenden Alias aus:
- Eventtitel
- Ortstitel (
ctlg_orte) - Datum
- Nutzt Transliterations-/Kuerzungslogik und sorgt fuer Eindeutigkeit durch Suffix
-1,-2, ...
3) Backend-Listing/Options-Callbacks
Datei: src/DataContainer/CalendarEvents.php
- Formatiert Kinddatensaetze im Event-Backend-Listing.
- Liefert Select-Optionen aus:
ctlg_ortectlg_contactsctlg_districts
4) Template-Hooks (parseTemplate)
Dateien:
src/EventListener/EventFullListener.php- Reichert
event_fullum Ort, Alias, Koordinaten, District-Informationen an.
- Reichert
src/EventListener/EventJsonDataListener.php- Laedt JSON aus
https://ics.mummert.dev/kirchenjahr.jsonund injiziert passenden Datensatz nach Datum inevent_fullundevent_upcoming_all.
- Laedt JSON aus
src/EventListener/OfferListener.php- Reichert Angebots-/Kontakt-Templates (
cm_master_angebote,cm_master_contacts,cm_listing_angebote) mit Gemeinde-/District-Daten an.
- Reichert Angebots-/Kontakt-Templates (
src/EventListener/PlaceListener.php- Reichert Orts-Listing (
cm_listing_orte) mit Gemeinde-IDs und District-Aliases an.
- Reichert Orts-Listing (
5) iCal-Anpassung
Datei: src/EventListener/ModifyIcalDataListener.php
Hook: editVEvent
- Setzt/normalisiert iCal-Felder wie
DTSTART,DESCRIPTION,LOCATION,GEO,ORGANIZER. - Verarbeitet Kontakt- und Mitwirkendeninformationen aus Eventfeldern.
6) Event-Export zum EVLKS-Kalender
Dateien:
src/Command/ExportEventsCommand.phpsrc/Service/SoapClientService.php
Command: nossener-land:export-events
Ablauf:
- Holt zukuenftige Events aus
tl_calendar_events(derzeitpid IN (1,2,3)undevlkscalendar != 1). - Mappt Eventdaten fuer EVLKS (inkl. Place-Mapping, Eventtyp, Personen/Kontakt, Zeiten).
- Exportiert per SOAP.
- Holt Remote-Events per JSON (
vid) und loescht externe Events, die lokal nicht mehr im Exportlauf enthalten sind.
Hinweis:
- Das Place-Mapping ist statisch in
SoapClientServicehinterlegt. - Der SOAP-Zugang ist aktuell in
config/services.ymlkonfiguriert.
7) JSON-Export fuer Website/Consumer
Datei: src/Command/ExportEventsJsonCommand.php
Command: nossener-land:export-eventstojson
Ablauf:
- Liest Events mit
export=1 AND published=1. - Wandelt
singleSRCUUID in absolute URL um. - Vergibt bei Bedarf Alias.
- Schreibt JSON nach:
/srv/www/ks-nossener-land/public/kirchspiel-nossener-land.de/public/events.json
Voraussetzungen
- Contao 5.7
- PHP >= 8.3
- Tabellen aus dem Umfeld von Catalog Manager, u. a.:
ctlg_ortectlg_contactsctlg_gemeindenctlg_districtsctlg_angebote
- Netzwerkzugriff auf:
- EVLKS SOAP/JSON Endpunkte
- JSON-Quelle
ics.mummert.dev
Console-Commands (manuell)
Im Contao-Projektverzeichnis ausfuehren:
php bin/console nossener-land:export-events
php bin/console nossener-land:export-eventstojson
Cronjobs
Die folgenden Beispiele sind direkt anwendbar. Pfade bitte auf das jeweilige Projekt anpassen.
A) EVLKS-Export (inkrementell, inkl. Aufraeumen)
Empfohlenes Intervall: alle 15 Minuten.
*/15 * * * * cd /srv/www/contao57 && /usr/bin/flock -n /tmp/ks-nossenerland-export-events.lock php bin/console nossener-land:export-events --env=prod --no-interaction >> var/log/cron-export-events.log 2>&1
Warum 15 Minuten:
- gute Balance zwischen Aktualitaet und Last
- robust bei redaktionellen Aenderungen waehrend des Tages
- vermeidet zu haeufige externe API-Aufrufe
Alternative Intervalle:
- alle 5 Minuten: wenn sehr zeitkritische Publikation noetig ist
- alle 30 Minuten: wenn Last reduziert werden soll
B) JSON-Export fuer externe Anzeige
Empfohlenes Intervall: alle 30 Minuten.
*/30 * * * * cd /srv/www/contao57 && /usr/bin/flock -n /tmp/ks-nossenerland-export-json.lock php bin/console nossener-land:export-eventstojson --env=prod --no-interaction >> var/log/cron-export-json.log 2>&1
Warum 30 Minuten:
- Daten aendern sich typischerweise weniger haeufig als EVLKS-Sync-Anforderungen
- reduziert I/O und Dateischreiblast
Alternative Intervalle:
- stuendlich: fuer sehr geringe Aenderungsfrequenz
- alle 10-15 Minuten: wenn JSON als nahezu Live-Feed genutzt wird
C) Startzeiten staffeln
Empfehlung fuer stabilen Betrieb:
- EVLKS-Export auf Viertelstunden
- JSON-Export zeitversetzt, z. B. Minute 7 und 37
Beispiel:
*/15 * * * * cd /srv/www/contao57 && /usr/bin/flock -n /tmp/ks-nossenerland-export-events.lock php bin/console nossener-land:export-events --env=prod --no-interaction >> var/log/cron-export-events.log 2>&1
7,37 * * * * cd /srv/www/contao57 && /usr/bin/flock -n /tmp/ks-nossenerland-export-json.lock php bin/console nossener-land:export-eventstojson --env=prod --no-interaction >> var/log/cron-export-json.log 2>&1
Empfohlene Betriebsregeln
- Immer
flocknutzen, um Ueberlappungen bei langen Laufzeiten zu verhindern. - Ausgabe in getrennte Logdateien schreiben.
- Nach Deployment einmal manuell beide Commands ausfuehren.
- Bei API-Problemen zuerst Logs pruefen und dann betroffene Command-Intervalle temporaer erhoehen.
Bekannte projektbezogene Punkte (kein Bugfix in diesem Schritt)
- In
ExternalLocationModelsind externe DB-Zugangsdaten fest hinterlegt. ExportEventsJsonCommandnutzt einen fest codierten Zielpfad fuerevents.json.- SOAP-API-Zugangsdaten liegen aktuell in
config/services.yml.
Diese Punkte sind bewusst unveraendert geblieben (Ziel: keine Funktionsaenderung beim Bundle-Umbau).