In oktober 2025 was de SuluEventBundle een evenementenbeheersysteem met een prullenbak, tijdcontrole en Smart Content (zie het vorige bericht). Er ontbrak echter iets wat bezoekers meteen zouden begrijpen: een kalender. Op 30 oktober ben ik eraan begonnen; negen dagen later, op 7 november, was het systeem operationeel, gelokaliseerd en voorzien van meerdere agenda’s op één pagina.

Daarvoor had ik in oktober een grote schoonmaak gehouden. De status ‘actief’ van een evenement werd vervangen door een publicatiestatus met een specifieke datum en tijd (11 oktober), en sinds 13 oktober kon de beheerderszoekfunctie ook concepten vinden. Op 16 oktober heb ik ook de SuluSharedTools-bundel geïntegreerd, wat de bundel een paar weken later een kleine omweg zou bezorgen (daarover later meer).

Eén commit, veel functies

De eerste commit voor de kalender, gedateerd op 30 oktober, bestaat uit 31 bestanden en iets meer dan 2.000 regels. Het bevat meer dan alleen een kalender; het bevat alles wat nodig is om de kalender op de website bruikbaar te maken:

  • een API die gebeurtenissen voor een opgegeven tijdsperiode retourneert
  • de front-end op basis van FullCalendar
  • een inhoudstype waarmee de kalender in pagina’s kan worden ingesloten
  • terugkerende gebeurtenissen
  • iCal-export
  • RSS- en Atom-feeds
  • instellingen voor het delen op sociale media per evenement
  • een limiet op verzoeken aan de agenda-API

De volgende dagen werden besteed aan het aanbrengen van de laatste hand aan het project.

De kalender

De kalender toont de maand, week en het jaar, evenals een week- en maandoverzicht. In het beheerderspaneel kun je instellen welke weergaven bezoekers te zien krijgen en of ze tussen deze weergaven mogen schakelen. Daar kunt u ook de beginweek, weeknummers, weekends, het aantal evenementen per dag, de tijd, het type en de locatie in de pop-up, de standaardkleur en het tijdsbereik voor de weekweergave instellen. In de jaarweergave kunt u aangeven hoeveel maanden er naast elkaar worden weergegeven.

Een gebeurtenis wordt beschouwd als een gebeurtenis die de hele dag duurt als deze om 00:00 begint en om 00:00 eindigt, of als er helemaal geen eindtijd is opgegeven. In dat geval geeft de kalender geen tijd weer. De kalender-API accepteert maximaal 100 verzoeken per uur per IP-adres; deze waarde kan worden gewijzigd in de Symfony-configuratie. Op 6 november is de mogelijkheid toegevoegd om meerdere kalenders op één pagina weer te geven.

Wat de installatie betreft, zal ik eerlijk zijn: het is ‘niet bepaald eenvoudig’. FullCalendar wordt via npm in het project geïntegreerd, wat aanpassingen aan de Webpack-configuratie vereist.

Maandoverzicht. Als je op een vermelding klikt, verschijnt er een pop-upvenster met het type, het tijdstip, een korte beschrijving en de locatie.

De kalenderinstellingen in het beheerderspaneel: begin van de week, aantal afspraken per dag, toegestane weergaven en tijdsbereik voor de weekweergave.

Soorten evenementen met kleuren

Elke gebeurtenis heeft een type, en elk type heeft een naam en een kleur. De kalender kleurt de vermeldingen op basis daarvan, en de selectie in het formulier geeft de kleur weer. De bundel bevat tien types. Als je je eigen types wilt definiëren, kun je dat doen in de projectconfiguratie. Aangepaste typen vervangen de door de bundel geleverde typen volledig; ze worden niet samengevoegd. Dit is zo bedoeld.

Terugkerende gebeurtenissen: berekenen of opslaan

Een gebeurtenis kan dagelijks, wekelijks, maandelijks of jaarlijks terugkeren, met vaste tussenpozen en op specifieke dagen van de week. De einddatum kan worden ingesteld op ‘nooit’, ‘na een bepaald aantal herhalingen’ of ‘tot een specifieke datum’.

Technisch gezien zijn er twee manieren om de regel om te zetten naar specifieke datums. Bij de eerste worden de herhalingen berekend wanneer iemand een tijdsperiode opvraagt, bijvoorbeeld in de kalender. Ze bestaan alleen op het moment van de opvraging. In de tweede methode creëert een consolecommando daadwerkelijke vermeldingen, standaard voor de komende 90 dagen. Dit is bedoeld voor een cron-taak. De opgeslagen vermeldingen zijn standaardgebeurtenissen. Volgens de documentatie draagt dit bij aan de prestaties en indexering.

Beide methoden bestaan naast elkaar; de bundel geeft geen voorkeur aan de ene boven de andere.

iCal en feeds

Bezoekers kunnen afzonderlijke evenementen downloaden als .ics-bestanden of zich abonneren op de volledige agenda, onder andere via webcal://. Er zijn RSS- en Atom-feeds beschikbaar voor nieuwe evenementen in elke taal. De URL’s zijn eenvoudig: /events/calendar.de.ics voor de abonnementen en /events/feed.de.atom voor de feed.

Wanneer optimalisatie op de verkeerde plek wordt toegepast

Op 4 november heb ik de bundel geoptimaliseerd voor betere prestaties. Op 5 november heb ik die wijziging ongedaan gemaakt. In de commit wordt uitgelegd waarom: de snelheid werd niet beïnvloed door mijn code, maar door een bug in SuluSharedTools.

Dit is het nadeel van een gedeelde bundel dat mensen vaak over het hoofd zien: het bespaart code, maar een bug daarin beïnvloedt alle bundels tegelijk, en je bent geneigd om er in eerste instantie op de verkeerde plek naar te zoeken. Met Sulu 3 is SuluSharedTools verwijderd.

Daarna

Versie 2.0.0 werd op 5 november uitgebracht. De Sulu 2-serie kreeg vervolgens tot 12 november kleine updates, waarna in april 2026 versie 2.0.6 volgde. De overgang naar Sulu 3 begon eind november. Dit is het onderwerp van het volgende bericht.

Eerder: Prullenbak, timing en activiteiten in de SuluEventBundle.

Repository: manuxi/SuluEventBundle op GitHub, met documentatie op kalenders, herhalingen en feeds en iCal.