Das SuluEventBundle hat einen genauen Startpunkt: Der erste Commit stammt vom 26. März 2021, einen Tag später gab es mit Version 1.0.0 das erste Release. Ausgangspunkt waren die Beispiele aus dem Sulu-Workshop, so steht es in der ersten README. Ich wollte die Entitäten nicht in jedem Projekt neu abschreiben, sondern einmal sauber als Bundle installieren können. Das Bundle verlangte damals Sulu 2.2 und PHP 7.1.

Im Rückblick interessiert mich vor allem, was danach kam. In den ersten drei Wochen entstanden fast alle Anschlussstellen, die ein eigener Inhalt in Sulu braucht, damit er sich nicht wie ein Fremdkörper anfühlt. Dieser Beitrag geht sie der Reihe nach durch. Wie ich zu dem Projekt kam, steht im ersten Beitrag der Reihe.

Events und Orte als eigene Inhalte

Das Bundle besteht von Anfang an aus zwei Inhaltstypen: Veranstaltungen und Veranstaltungsorte. Beide haben im Admin eine Liste und ein Formular, beide haben eigene Berechtigungen. Schon am 27. März kam die Rechteprüfung für die Orte dazu. Wer Events pflegen darf, entscheidet damit wie bei Seiten die Rolle.

Inhalte in mehreren Sprachen liegen in eigenen Übersetzungstabellen. Das hat Folgen, die man erst beim Bauen bemerkt: Das Sortieren nach dem Titel funktioniert nicht mehr von selbst, weil der Titel in der Übersetzung steht. Am 29. März habe ich deshalb die Sortierung nach übersetzten Eigenschaften ergänzt.

Das Event-Formular im Sulu-Admin, wie es heute aussieht. Die Grundbausteine sind seit 2021 dieselben: Titel, URL, Beginn und Ende, Ort, Bild und Text.

Jedes Event bekommt eine URL

Ein Event soll auf der Website eine eigene Adresse haben. Dafür nutzt das Bundle das Routing von Sulu. Seit dem 27. März gehört die Route zur Entität: Sie entsteht aus dem Titel, steht im Formular und lässt sich dort ändern oder neu erzeugen.

SEO und Excerpt: erst kopiert, dann in Traits

Bei Seiten gehören der SEO-Reiter und der Auszug (Excerpt) selbstverständlich dazu. Ein eigener Inhaltstyp bekommt sie nicht geschenkt, ich musste beides selbst anbinden. Das Bundle speichert die Angaben in eigenen Tabellen, jeweils mit Übersetzungen. So kann ein Event pro Sprache einen eigenen SEO-Titel und eine eigene Beschreibung haben.

Die erste SEO-Fassung steckte noch in zwei großen Klassen. Am 29. März habe ich sie in Interfaces und Traits zerlegt. Kürzer wurde der Code dadurch nicht, aber wiederverwendbar: Den Excerpt, der am 30. und 31. März folgte, konnte ich nach demselben Muster bauen. Auch Autor und Autorendatum wurden eigene Traits.

Aus diesem Muster entstand später das gemeinsame Bundle SuluSharedTools für meine Bundles. Mit Sulu 3 ist es wieder entfallen.

Schlanke Controller

Der Controller für Events wurde schnell unübersichtlich: Speichern, Übersetzungen, SEO, Excerpt, Route. Am 30. März habe ich dazu Modellklassen eingeführt (EventModel, EventSeoModel, EventExcerptModel), am 31. März folgte das LocationModel. Der Controller nimmt die Anfrage an, das Modell weiß, wie gespeichert wird.

Autor, Datum und Auswahlfelder

Ein Subscriber setzt Autor und Autorendatum beim Speichern automatisch. Das Datum lässt sich in den Einstellungen des Events ändern, seit dem 30. März.

Für Seiten gibt es Auswahlfelder, mit denen Redakteure einzelne oder mehrere Events auswählen. So kann eine Seite gezielt auf bestimmte Veranstaltungen verweisen.

Vorschau, Sitemap und Smart Content

Beim Bearbeiten sehen Redakteure, wie das Event auf der Website aussehen wird. Dafür liefert seit dem 31. März ein Preview-Provider dem Admin das Event in der gewählten Sprache.

Am 1. April folgte der Sitemap-Provider. Die erste Fassung war einfach: Sie nahm alle aktiven Events auf. Die SEO-Option „In Sitemap verstecken“ gab es schon im Formular, der Provider wertete sie aber erst später aus.

Wie sich Events mit Smart Content als Liste auf einer Seite ausgeben lassen, zeigt schon die erste README.

Mehrsprachig, getestet und mit CI

Unit-Tests und eine Travis-Konfiguration gab es am ersten Tag. Am 3. April kamen Tests für die Traits dazu. Am 12. April folgten die Übersetzungen der Website-Texte, am 14. April eine Funktion, die ein Event in andere Sprachen kopiert, mit Rechteprüfung für jede Zielsprache.

Danach

Danach wird es ruhiger. Im September 2022 gibt es kleine Korrekturen. Im Januar 2023 kommt der erste Beitrag von außen: Die Anpassung an Symfony 6 stammt aus einem Pull Request, den ich im Juni 2023 übernommen habe. Der nächste große Schub folgt im September 2023, mit Papierkorb, Aktivitätsprotokoll und Zeitsteuerung. Davon handelt der nächste Beitrag.

Davor: Wie das SuluEventBundle entstand.

Repository: manuxi/SuluEventBundle auf GitHub