De SuluEventBundle heeft een duidelijk beginpunt: de eerste commit vond plaats op 26 maart 2021, en de eerste release, versie 1.0.0, volgde een dag later. Het uitgangspunt waren de voorbeelden uit de Sulu-workshop, zoals vermeld in de eerste README. Ik wilde de entiteiten niet in elk project helemaal opnieuw hoeven schrijven, maar ze liever één keer en voor altijd netjes als bundel kunnen installeren. Destijds vereiste de bundel Sulu 2.2 en PHP 7.1.
Terugkijkend ben ik vooral benieuwd naar wat er daarna kwam. In de eerste drie weken werden bijna alle integratiepunten gecreëerd die een aangepaste component in Sulu nodig heeft, zodat deze niet als een vreemde entiteit aanvoelt. In dit bericht worden ze op volgorde besproken. Hoe ik bij het project betrokken raakte, kun je lezen in het eerste bericht in de reeks.
Evenementen en locaties als afzonderlijke inhoudsitems
Vanaf het begin bestaat de bundel uit twee inhoudstypen: evenementen en locaties. Beide hebben een lijst en een formulier in het beheerderspaneel, en beide hebben hun eigen machtigingen. Al op 27 maart werden machtigingscontroles voor locaties toegevoegd. Net als bij pagina’s bepaalt de rol wie bevoegd is om evenementen te beheren.
Inhoud in meerdere talen wordt opgeslagen in afzonderlijke vertaaltabellen. Dit heeft gevolgen die pas tijdens de ontwikkeling duidelijk worden: sorteren op titel werkt niet langer automatisch, omdat de titel deel uitmaakt van de vertaling. Op 29 maart heb ik daarom de optie toegevoegd om te sorteren op vertaalde eigenschappen.
Aan elk evenement wordt een URL toegewezen
Een evenement moet een eigen adres op de website hebben. Hiervoor maakt de bundel gebruik van de routing van Sulu. Sinds 27 maart maakt de route deel uit van de entiteit: deze wordt afgeleid uit de titel, verschijnt in het formulier en kan daar worden bewerkt of aangemaakt.
SEO en samenvatting: eerst gekopieerd, daarna in Traits geplaatst
Voor pagina’s zijn het tabblad ‘SEO’ en het uittreksel uiteraard inbegrepen. Deze hebben standaard geen eigen inhoudstype; ik heb beide zelf moeten integreren. De bundel slaat de gegevens op in afzonderlijke tabellen, elk met vertalingen. Dit betekent dat een evenement voor elke taal een eigen SEO-titel en -beschrijving kan hebben.
De eerste versie van de SEO-code zat nog in twee grote klassen. Op 29 maart heb ik deze opgesplitst in interfaces en traits. Dit maakte de code niet korter, maar wel herbruikbaar: Ik kon het uittreksel, dat op 30 en 31 maart volgde, volgens hetzelfde patroon bouwen. De auteur en de datum van de auteur werden ook afzonderlijke traits.
Dit patroon leidde later tot de gedeelde bundel SuluSharedTools voor mijn bundels. Met Sulu 3 is het weer weggelaten.
Lean-controller
De controller voor evenementen werd al snel onoverzichtelijk: Save, Translations, SEO, Excerpt, Route. Op 30 maart heb ik hiervoor modelklassen geïntroduceerd (EventModel, EventSeoModel, EventExcerptModel), gevolgd door het LocationModel op 31 maart. De controller verwerkt het verzoek; het model weet hoe de gegevens moeten worden opgeslagen.
Velden voor auteur, datum en selectie
Een abonnee vult bij het opslaan automatisch de auteur en de datum in. De datum kan in de evenementinstellingen worden gewijzigd; deze wijziging gaat in op 30 maart.
Voor pagina’s zijn er selectievelden waarmee redacteuren één of meerdere evenementen kunnen selecteren. Hierdoor kan een pagina specifiek naar bepaalde evenementen verwijzen.
Voorbeeld, sitemap en slimme inhoud
Tijdens het bewerken kunnen redacteuren zien hoe het evenement op de website zal verschijnen. Daartoe levert een preview-provider sinds 31 maart het evenement in de geselecteerde taal aan de beheerder.
Op 1 april volgde de sitemap-provider. De eerste versie was eenvoudig: deze bevatte alle actieve evenementen. De SEO-optie ‘Verbergen in sitemap’ was al aanwezig in het formulier, maar de aanbieder begon deze pas later te verwerken.
Het allereerste README-bestand laat zien hoe evenementen met behulp van Smart Content als lijst op een pagina kunnen worden weergegeven.
Meertalig, getest en met CI
De unit-tests en een Travis-configuratie waren al vanaf de eerste dag klaar. Op 3 april werden er tests voor de traits toegevoegd. Op 12 april volgden de vertalingen van de websiteteksten, en op 14 april werd er een functie toegevoegd waarmee een gebeurtenis naar andere talen kan worden gekopieerd, met toestemmingscontroles voor elke doeltaal.
Daarna
Daarna werd het wat rustiger. In september 2022 waren er een paar kleine updates. In januari 2023 kwam de eerste externe bijdrage binnen: de update naar Symfony 6 vloeide voort uit een pull-verzoek dat ik in juni 2023 heb samengevoegd. De volgende grote update volgde in september 2023, waarbij functies voor een prullenbak, activiteitenlogboek en tijdbeheer werden geïntroduceerd. Dat is het onderwerp van het volgende bericht.
Eerder: Hoe de SuluEventBundle tot stand kwam.
Repository: manuxi/SuluEventBundle op GitHub