If the documentation for a new version is still missing, the source code remains. That’s what happened to me when I ported the SuluEventBundle to Sulu 3. Fourteen days passed between the first commit for the conversion on 29 November 2025 and version 3.0.0 on 13 December. What happened with the calendar prior to that is described in the previous post.

At that time, the Sulu documentation had not yet been updated to version 3. There were hardly any guides on how to modify your own bundle. In the Sulu Slack, messages are only retained for 90 days, so older conversations are no longer visible. Two keywords remain: DimensionContent and Doctrine, which has finally replaced PHPCR. I had to look up everything else in the source code. AI was very helpful in this regard.

What’s changing in Sulu 3

In Sulu 2, pages were stored in the PHPCR content repository, whilst custom content such as events was stored in Doctrine tables. I had to recreate everything that pages can do as a matter of course for events: languages, SEO, excerpts, authors. In Sulu 3, Doctrine is responsible for all content, and there is a common model for it.

Content there consists of two parts. For me, the wrapper is the Event class. It holds the ID and the links to recurrence and social settings. The actual content is stored in DimensionContent entries. Each entry holds the content for a specific language in a particular status (draft or live) and version.

4 December

On 4 December, the refactoring was deployed to DimensionContent. The commit affected 61 files; 3,740 lines were added and 3,862 were removed.

Gone were the translation entities and the dedicated tables for SEO and excerpts, along with the three model classes I had introduced on 30 March 2021, and a class comprising 435 lines that generated lists for the admin panel. The class Event now has 79 lines. It has been replaced by EventDimensionContent.

There’s one small detail I particularly like about this. The building blocks that I had built myself in 2021 using interfaces and traits – namely SEO, Excerpt and Author – are now included in Sulu 3 itself. The new class integrates them from Sulu as SeoTrait, ExcerptTrait and AuthorTrait.

Order in December

  • 29 November: MassiveSearch removed
  • 1 December: Lists, forms, Smart Content and selection fields are working
  • 2 December: Admin search is working
  • 4 December: Migration to DimensionContent begins
  • 8 December: Save and preview functions working; locations are working
  • 9 December: SEO and excerpt are saved; the list displays the publication status; link provider
  • 10 December: Sitemap provider
  • 11 December: References, SuluSharedTools removed
  • 13 December: Version 3.0.0

I reported Smart Content as operational on both 1 and 9 December. The migration to DimensionContent took place in between.

Following version 3.0.0

The work wasn’t finished with the first version. Ten revised versions followed up to 14 January: 3.0.1 to 3.0.10.

Two stumbling blocks have stuck in my memory. The contents of an event had to be loaded via eager loading. This became apparent on 23 December and again on 14 January. Then there was Sulu 3.0.1: on 31 December, I rolled back a fix for Sulu 3.0.1 and removed the hard-coded dependency on Sulu 3.0.0; by 6 January, the bundle was running with Sulu 3.0.1.

On 24 January, the teaser provider was added with version 3.1.0.

A tip for your own renovation

Anyone facing the same reorganisation will find the reference in Sulu’s own source code: the vendor/sulu/sulu/packages/content package contains the models, traits and interfaces on which everything is built. I used this as my guide. The Sulu-2 branch of EventBundle still exists, but I haven’t continued developing it – I simply don’t have the time.

Previously: Calendars, recurring events and iCal in the SuluEventBundle. Next: AI assistants and events: the MCP tools in SuluEventBundle. The series begins with How the SuluEventBundle came about.

Repository: manuxi/SuluEventBundle on GitHub