Sulu wollte ich mir genauer ansehen, bevor ich es einsetze. Mich interessierte vor allem, wie weit sich eigene Entwicklungen integrieren lassen: Erweiterungen, die sich im Admin, in der Rechteverwaltung und auf der Website wie ein Teil von Sulu verhalten. Veranstaltungen waren dafür ein guter Prüfstein. Ein Event hat Inhalte, Termine, Bilder, einen Ort und eine öffentliche Seite, und damit berührt man schnell viele Teile des Systems.

Sulu hat mich dabei überzeugt. Die Konzepte sind sauber getrennt, logisch aufgebaut und gut nachvollziehbar, ähnlich wie bei Symfony, auf dem Sulu aufbaut. Wer verstanden hat, wie ein Bereich funktioniert, findet sich auch in den nächsten schnell zurecht. Deshalb setze ich Sulu ein. Angefangen habe ich um 2020, das öffentliche Repository auf GitHub gibt es seit März 2021.

Der Einstieg in die Entwicklung war allerdings Detailarbeit. Ich habe mich durch die Sulu-Dokumentation, den Slack, den Workshop und die Demo-Seite gearbeitet. Jede Quelle zeigte ein Stück, das Gesamtbild musste ich mir selbst zusammensetzen, und viel Material gab es damals nicht. Das wollte ich mit diesem Blog ändern. Ich stelle hier nicht nur fertige Bundles vor, sondern beschreibe auch, wie ihre Integration in Sulu funktioniert, einschließlich der Stellen, an denen man sonst erst suchen muss.

Die Workshop-Beispiele drehten sich um Veranstaltungen. So entstand das SuluEventBundle, in das ich jede Sulu-Funktion einbaute, die ich finden konnte. Kurz darauf folgte das SuluNewsBundle. Es kam im Gegensatz zum damaligen SuluArticleBundle ohne Elasticsearch aus und hatte übersetzbares SEO und übersetzbaren Excerpt. Dazu schreibe ich später separat.

Das Formular einer Veranstaltung im Sulu-Admin: Inhalt, Datum und Ort, Programmpunkte, Links und Medien.

Ein Event ist mehr als ein Datensatz

Ein Formular zum Anlegen einer Veranstaltung ist schnell gebaut. Schwieriger sind die Fragen danach: Wo erscheint das Event im Admin? Wie wird es veröffentlicht? Wie findet man es auf der Website? Und verhält es sich so, wie es Redakteure von Sulu schon kennen?

Die Sitemap zeigt, was ich mit Integration meine. Schon wenige Tage nach dem ersten Commit gab es im April 2021 den Sitemap-Provider. Er nimmt ein Event nur auf, wenn es veröffentlicht ist, zur Sprache der Seite gehört und im SEO-Tab nicht ausgeblendet wurde. Er folgt also denselben redaktionellen Entscheidungen wie der Rest der Website (Doku).

Bei Smart Content lassen sich Events als dynamische Liste auf jeder Sulu-Seite ausgeben. Besucher können über URL-Parameter Kategorien und Tags wählen. Die im Admin gesetzten Filter bleiben dabei wirksam, die Auswahl auf der Website schränkt das Ergebnis nur weiter ein (Doku). Das sieht weniger spektakulär aus als ein Kalender, macht das Bundle im Alltag aber flexibler.

Die Kalenderansicht im Monat. Event-Typen haben eigene Farben, ein Klick zeigt Ort und Kurztext.

Was über die Jahre dazukam

Bei den wiederkehrenden Veranstaltungen gibt es eine technische Entscheidung, die ich im Beitrag über den Kalender erkläre. Das Bundle kann Vorkommen anhand einer Regel für einen angefragten Zeitraum berechnen. Oder es legt sie per Konsolenkommando als echte Einträge an, was bei Indizierung und Performance helfen kann (Doku). Außerdem gibt es eine Kalenderansicht, iCal-Export und RSS- und Atom-Feeds.

Der Tab Wiederholung: Rhythmus, Abstand und Ende lassen sich pro Veranstaltung festlegen.

Sulu 3 und KI

Der Umbau auf Sulu 3 im November und Dezember 2025 war noch einmal eine intensive Lernphase. Mit der Versionsnummer in der composer.json war es nicht getan. Ich musste die Integrationspunkte neu durchgehen und prüfen, wie die gewachsenen Funktionen im neuen Stand zusammenspielen. Der 3.x-Branch setzt Sulu 3 voraus. Den Sulu-2-Branch gibt es weiterhin, ich entwickle ihn aber nicht weiter, dafür fehlt mir die Zeit. Wie der Umbau ablief, steht im Beitrag über den Umbau auf Sulu 3.

Einiges fiel beim Umbau weg. MassiveSearch war die Suche in Sulu 2, Sulu 3 setzt auf Seal. Am 29. November habe ich MassiveSearch deshalb aus dem EventBundle entfernt. Unter Sulu 2 hatte ich Methoden, die mehrere meiner Bundles brauchten, als Traits in ein gemeinsames Bundle ausgelagert, das SuluSharedTools. Auch das ist mit Sulu 3 entfallen, am 11. Dezember habe ich es entfernt.

Anders als am Anfang hatte ich beim Umbau KI als Werkzeug. Dadurch kamen mehr Funktionen in Reichweite, als ich für realistisch gehalten hätte. Ein Ergebnis aus diesem Herbst sind optionale MCP-Tools: Ist das Sulu MCP Bundle installiert, können berechtigte KI-Assistenten Events und Orte lesen, als Entwurf anlegen oder ändern. Veröffentlichen gehört bewusst nicht dazu (Doku).

Verständnis ersetzt die KI dabei nicht. Sie hilft beim Entwerfen, Ausprobieren und Umsetzen. Ob eine Funktion in die Architektur passt, welche Berechtigungen sie braucht und ob sie sich für Redakteure richtig anfühlt, beurteile ich weiterhin selbst. Zwischen Code erzeugen und eine verlässliche Erweiterung bauen liegt ein Unterschied, über den ich hier noch schreiben möchte.

Wie es hier weitergeht

Das Wissen, das ich mir damals zusammengesucht habe, will ich weitergeben. Nicht als den einen richtigen Weg, sondern als nachvollziehbares Beispiel: eine konkrete Anforderung, die technische Umsetzung und die Entscheidungen dahinter. Weitere Beiträge nehmen sich einzelne Funktionen des Bundles vor.

Die bisherigen Beiträge der Reihe in zeitlicher Reihenfolge:

Repository: manuxi/SuluEventBundle auf GitHub