Lue dans les fichiers PHP du paquet au commit 0dbeff09945d : ses espaces de noms, classes, interfaces et énumérations, leurs constantes, propriétés et méthodes publiques avec leur PHPDoc, et les options que prennent ses fabriques. Rien n’en est exécuté.
AgendaBundleclassDates and venues on top of omnibase's Thread. An Event IS a Thread (JOINED subclass); a Venue is a plain row many events share.
3 methods
UpcomingEventsWidgetTypeclassThe dashboard's tile: how many dates are to come, the next five, each opening its record. `yield MenuItem::block('agenda_upcoming', ...)` in the dashboard's configureWidgetItems() places it.
4 methods
SyncCommandclassThe calendars read into the agenda - agenda.sources, agenda.ics and the address typed in the back office (/admin/agenda/calendar): new dates online, changed ones brought up to date, gone ones held until someone says whether they are cancelled. Run it from cron (every half hour); what it did is kept for that page, which previews a sync before applying it. --dry-run tells the changes and applies none; --source reads one address or file instead, and is not kept.
1 method
CalendarControllerclassThe Google Calendar the dates are kept in, in the back office (Agenda › Google Calendar): its secret address pasted once (the `agenda.ics` setting), the last sync, the calendar read now and what it would change shown before it is applied, the dates gone from their calendar waiting for a word (cancelled, or kept), the syncs that changed something, and the how-to - how to make the calendar, how to bring the site's dates into it, how to write a date so the site files each line where it goes.
5 methods
Base\Agenda\Controller\Admin\Crud
EventCrudControllerclassThe dates: when, where, with whom, what is played, where the tickets are. Published, a date is on /agenda; a date read from a calendar follows it at each sync, unless "Keep the site's texts" (syncLocked) is ticked - then only its hours and its cancellation follow. Two buttons on top: duplicate a date (the next one of a tour) and read the calendars now (the calendar page's preview: what would change, then "Apply").
10 methods
VenueCrudControllerclassThe houses the dates are played in: typed once, chosen on every date.
8 methods
AgendaControllerclassThe agenda: the dates to come by month and the ones gone by, one date with its programme and its JSON-LD, the calendars to subscribe to (every date) or to add one date to, and the same dates as JSON for other sites and apps (Service\Feed).
9 methods
Base\Agenda\DependencyInjection
AgendaConfigurationclass1 method
AgendaExtensionclass2 methods
AgendaDigesttraitThe agenda's lines for omnibase/newsletter's digest (AgendaDigestSource): apart from the class, so that the class can be declared with the newsletter's interface when it is installed and without it otherwise.
3 methods
EventclassA date: a concert, a recital, a masterclass - or a school's open day. An omnibase thread - title (the concert's name: "Perspectives concertantes - NDR Elbphilharmonie"), headline, excerpt and text translated, slug, publication state and date - written in the back office (Controller\Admin\Crud\EventCrudController) or read from a calendar (Service\IcsImporter), with on top when it starts, where, with whom, what is played and where the tickets are.
62 methods · 1 constant
VenueclassWhere it happens: a hall, a church, a school's auditorium. Not a thread - a name, a room in it, an address, the map and the house's own site, its picture and who took it - and shared by every date played there, so it is typed once: a date shows the house's picture unless it has one of its own.
42 methods
RoleenumWhat the artist does that evening: the soloist of a concerto, the leader of the orchestra (concertmaster, guest leader), a chamber partner, a desk in the orchestra, a recital, a masterclass given. A string enum (not omnibase's EnumType) so the column reads plainly in the database and in the admin's filters.
3 methods · 7 cases
SitemapListenerclassThe dates' own pages in /sitemap.xml: omnibase lists the routes it can generate by itself (/agenda), and a date is behind a slug it cannot know.
2 methods
ChangeclassWhat a sync does, or would do, to one date: opens it (`created`), brings it up to date (`updated`, each field as it was and as it becomes), cancels it because its calendar says so (`cancelled`), or finds it gone from its calendar (`missing`: held until someone says whether it is cancelled or kept). Plain values, kept as JSON in the sync's history.
3 methods · 5 properties · 4 constants
ImportSummaryclassWhat a sync did - or, previewed, would do: the dates it opened, the ones it brought up to date, the ones its calendar cancelled, the ones gone from their calendar (held, not cancelled: Change::MISSING), each as a Change.
6 methods · 7 properties
ParsedEventclassOne date as a source gave it - a VEVENT read by Service\IcsParser, an entry of a Squarespace events page, one of another site's /agenda.json - in plain values, no Doctrine. The moments carry their own timezone; `timezone` is the one the entry named (its TZID, else the calendar's), the hall's.
2 methods · 21 properties
EventRepositoryclass14 methods
VenueRepositoryclass6 methods
DescriptionParserclassWhat a calendar entry's description says, read by its lines: the artist writes the date in Google Calendar from her phone, one piece of information per line, opened by a word she knows in her language -
5 methods · 1 constant
FeedclassThe dates as JSON, for the sites and apps that show them elsewhere - an agency's roster, an orchestra's page, a sister site (Service\FeedParser reads it back): /agenda.json and /agenda/{slug}.json. Every moment in ISO 8601 with the hall's offset, every address absolute, the role as its value and its name in the reader's language. Plain arrays, no Response: Controller\Client\AgendaController sends them.
8 methods
FeedParserclassAnother site's /agenda.json (Service\Feed wrote it) read back into ParsedEvents: the dates of a sister site, an ensemble's, an agency's that runs omnibase/agenda too. Everything the feed says is taken - the uid is the feed's `id`, so a date read from two places is one. No HTTP here: Service\IcsImporter follows `next`.
3 methods
IcsclassThe dates as an iCalendar file, and their Google Calendar links: each Event made a CalendarEntry (its UID, its page on the site) and written by glitchr/omnibase's Base\Service\Calendar - the RFC 5545 writing lives there, once for every bundle.
8 methods · 1 constant
IcsImporterclassThe dates read from where they are kept - a Google Calendar's secret address (the artist's, from her phone), an agency's ICS feed, a Squarespace events page (the former site's), another omnibase site's /agenda.json - into Events, matched by the entry's UID.
19 methods · 4 constants
IcsParserclassA small RFC 5545 reader: enough of it for what a Google Calendar, an Apple one or an orchestra's site publishes. Lines are unfolded, the VEVENT blocks read one by one (VTIMEZONE and VALARM skipped), parameters kept, texts unescaped; a DTSTART with a TZID is read in that timezone, a VALUE=DATE as a day, a trailing Z as UTC, a bare hour in the calendar's X-WR-TIMEZONE (else the default given). A repeating entry gives its first occurrence only - the occurrences changed by hand (RECURRENCE-ID, under the series' UID) never in its place. No Doctrine here: Service\IcsImporter does the rest.
5 methods
JsonLdclassA date as schema.org reads it: an event of the type the site is about (agenda.jsonld_type: a musician's MusicEvent - an EducationEvent for a masterclass -, a lecturer's EducationEvent, any other site's Event) with its start and end in ISO 8601 with their offset, the Place and its PostalAddress, the performers, the tickets as an Offer, the cover, and EventCancelled when it will not take place. What the search engines show under the artist's name.
3 methods · 4 constants
MonthsclassThe dates by month, in the order given: what the agenda page lists under "October 2026", "November 2026". A date belongs to the month of its first day, as the hall's clock reads it.
1 method
SquarespaceParserclassThe dates of a Squarespace events page, read from its JSON (`/performances?format=json`): what an artist's former site holds while the new one takes over. Each entry is a ParsedEvent (uid "squarespace:<id>"); its HTML body is read the way such pages are typed - a first line in bold, the orchestra; "**Name** Conductor", "**Name** Piano", the performers; "**Composer** Work", the programme.
7 methods · 3 constants
AgendaExtensionclassWhat a host's own pages ask the agenda: the next dates for a home page, the very next one for a banner, the two "add to calendar" links of a date, the dates by month, and a role's name.
3 methods
Base\Agenda
AgendaBundle class
class AgendaBundle extends AbstractBaseBundle AgendaBundle.php:13
Dates and venues on top of omnibase's Thread. An Event IS a Thread (JOINED subclass); a Venue is a plain row many events share.
AgendaBundle::__construct()
public function __construct()AgendaBundle::getPath()
public function getPath(): stringModern layout: the class lives in src/, the bundle root is the package root.
AgendaBundle::build()
public function build(ContainerBuilder $container): voidBase\Agenda\Admin\Widget
UpcomingEventsWidgetType class
final class UpcomingEventsWidgetType implements DashboardWidgetTypeInterface UpcomingEventsWidgetType.php:14
The dashboard's tile: how many dates are to come, the next five, each
opening its record. yield MenuItem::block('agenda_upcoming', ...) in the
dashboard's configureWidgetItems() places it.
UpcomingEventsWidgetType::__construct()
public function __construct(readonly EventRepository $events)UpcomingEventsWidgetType::getName()
public static function getName(): stringUpcomingEventsWidgetType::getTemplate()
public function getTemplate(): stringUpcomingEventsWidgetType::getTemplateVars()
public function getTemplateVars(MenuItem $widget): arrayBase\Agenda\Command
SyncCommand class
final class SyncCommand extends Command SyncCommand.php:23
The calendars read into the agenda - agenda.sources, agenda.ics and the address typed in the back office (/admin/agenda/calendar): new dates online, changed ones brought up to date, gone ones held until someone says whether they are cancelled. Run it from cron (every half hour); what it did is kept for that page, which previews a sync before applying it. --dry-run tells the changes and applies none; --source reads one address or file instead, and is not kept.
SyncCommand::__construct()
public function __construct(readonly IcsImporter $importer)Base\Agenda\Controller\Admin
CalendarController class
class CalendarController extends AbstractController CalendarController.php:25
The Google Calendar the dates are kept in, in the back office (Agenda ›
Google Calendar): its secret address pasted once (the agenda.ics
setting), the last sync, the calendar read now and what it would change
shown before it is applied, the dates gone from their calendar waiting
for a word (cancelled, or kept), the syncs that changed something, and
the how-to - how to make the calendar, how to bring the site's dates
into it, how to write a date so the site files each line where it goes.
The artist keeps her dates from her phone and comes here when she likes.
CalendarController::__construct()
public function __construct(readonly IcsImporter $importer, readonly AdminContext $adminContext, readonly MenuBuilder $menuBuilder, readonly TranslatorInterface $translator)CalendarController::index()
public function index(Request $request): ResponseThe page; ?preview=1 reads the calendars now and shows what they would change, writing nothing.
CalendarController::save()
public function save(Request $request): ResponseThe address pasted (or forgotten).
CalendarController::sync()
public function sync(Request $request): ResponseEvery calendar read now and applied, as agenda:sync does every half hour: the preview's "Apply".
CalendarController::missing()
public function missing(Request $request): ResponseThe word on the dates gone from their calendar: cancelled, or kept on the site.
Base\Agenda\Controller\Admin\Crud
EventCrudController class
class EventCrudController extends AbstractCrudController EventCrudController.php:39
The dates: when, where, with whom, what is played, where the tickets are. Published, a date is on /agenda; a date read from a calendar follows it at each sync, unless "Keep the site's texts" (syncLocked) is ticked - then only its hours and its cancellation follow. Two buttons on top: duplicate a date (the next one of a tour) and read the calendars now (the calendar page's preview: what would change, then "Apply").
EventCrudController::setAgendaServices()
public function setAgendaServices(IcsImporter $importer, TranslatorInterface $translator, string $timezone = 'Europe/Berlin'): voidEventCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringEventCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringEventCrudController::configureCrud()
public function configureCrud(Crud $crud): CrudEventCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersEventCrudController::configureFields()
public function configureFields(string $pageName): iterableEventCrudController::configureActions()
public function configureActions(Actions $actions): ActionsEventCrudController::createEntity()
public function createEntity(string $entityFqcn): objectEventCrudController::duplicate()
public function duplicate(string $entityId): ResponseA copy of the date, a draft, to set the next one of a tour: same venue, same programme.
EventCrudController::sync()
public function sync(): ResponseThe calendars read now: what they would change, on the calendar page, before "Apply".
VenueCrudController class
class VenueCrudController extends AbstractCrudController VenueCrudController.php:35
The houses the dates are played in: typed once, chosen on every date.
The importer opens one for each new LOCATION it reads - with the name and the town only: the address, the map, the site and the photo (shown on every date there that has no picture of its own) are completed here. Two houses that are one ("Pärnu Concert Hall", "Pärmu Concert Hall") are merged: "Merge into…" moves the dates of one into the other, which keeps the spelling that went, for the calendars that still write it.
VenueCrudController::setAgendaTranslator()
public function setAgendaTranslator(TranslatorInterface $translator): voidVenueCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringVenueCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringVenueCrudController::configureCrud()
public function configureCrud(Crud $crud): CrudVenueCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersVenueCrudController::configureFields()
public function configureFields(string $pageName): iterableVenueCrudController::configureActions()
public function configureActions(Actions $actions): ActionsVenueCrudController::merge()
public function merge(Request $request, string $entityId): ResponseThe house merged into another: the page lists the others, the likely same first (the same town, a name a letter or two apart), with their dates; posted, the dates move and this house goes.
Base\Agenda\Controller\Client
AgendaController class
class AgendaController extends AbstractController AgendaController.php:31
The agenda: the dates to come by month and the ones gone by, one date with its programme and its JSON-LD, the calendars to subscribe to (every date) or to add one date to, and the same dates as JSON for other sites and apps (Service\Feed).
AgendaController::__construct()
public function __construct(readonly EventRepository $events, readonly Ics $ics, readonly JsonLd $jsonLd, readonly Feed $feed, readonly VenueRepository $venues, readonly ?SettingBagInterface $settings = null, readonly int $pastPerPage = 24, readonly bool $showPast = true, readonly bool $withJsonLd = true, readonly ?string $calendarName = null, readonly string $timezone = 'Europe/Berlin')AgendaController::index()
public function index(Request $request): ResponseAgendaController::feed()
public function feed(): ResponseAgendaController::list()
public function list(Request $request): ResponseThe dates as JSON: the ones to come, or ?past=1 the ones gone by
(the latest first); ?from=2026-11-01&to=2026-12-31 a span of days;
?limit= (100, 500 at most) and ?page=, next giving the page after.
Anyone may read it, from anywhere (CORS *).
AgendaController::eventJson()
public function eventJson(Request $request, string $slug): ResponseOne date as JSON: what /agenda.json says of it.
AgendaController::eventIcs()
public function eventIcs(string $slug): ResponseAgendaController::cover()
public function cover(Request $request, string $slug): ResponseA date's cover, said to be the picture it is (image/jpeg, image/png…): the address the feed and the JSON-LD give (Service\Feed::cover). The page's own <img> keeps the file's address, served without PHP.
AgendaController::photo()
public function photo(Request $request, string $slug): ResponseA house's photo, said to be the picture it is: the address the feed gives (Service\Feed::photo).
AgendaController::event()
public function event(Request $request, string $slug): ResponseBase\Agenda\DependencyInjection
AgendaConfiguration class
class AgendaConfiguration extends AbstractBaseConfiguration AgendaConfiguration.php:8
AgendaConfiguration::getConfigTreeBuilder()
public function getConfigTreeBuilder(): TreeBuilderAgendaExtension class
class AgendaExtension extends AbstractBaseExtension AgendaExtension.php:11
AgendaExtension::getConfiguration()
public function getConfiguration(array $config, ContainerBuilder $container): AgendaConfigurationAgendaExtension::load()
public function load(array $configs, ContainerBuilder $container): voidBase\Agenda\Digest
AgendaDigest trait
trait AgendaDigest AgendaDigest.php:15
The agenda's lines for omnibase/newsletter's digest (AgendaDigestSource): apart from the class, so that the class can be declared with the newsletter's interface when it is installed and without it otherwise.
AgendaDigest::__construct()
public function __construct(readonly EventRepository $events, readonly UrlGeneratorInterface $urls, readonly TranslatorInterface $translator)AgendaDigest::getName()
public function getName(): stringAgendaDigest::digest()
public function digest(\DateTimeImmutable $from, \DateTimeImmutable $to, string $locale): arrayBase\Agenda\Entity
Event class
class Event extends Thread implements LinkableInterface Event.php:29
A date: a concert, a recital, a masterclass - or a school's open day. An omnibase thread - title (the concert's name: "Perspectives concertantes - NDR Elbphilharmonie"), headline, excerpt and text translated, slug, publication state and date - written in the back office (Controller\Admin\Crud\EventCrudController) or read from a calendar (Service\IcsImporter), with on top when it starts, where, with whom, what is played and where the tickets are.
The moments are kept in the server's timezone, as Doctrine reads them
back; timezone is where the hall stands, and what the page shows.
const DEFAULT_DURATION = 'PT2H'How long a date with no end lasts in a calendar.
Event::__iconizeStatic()
public static function __iconizeStatic(): ?arrayEvent::__toLink()
public function __toLink(array $routeParameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): ?stringEvent::__toString()
public function __toString(): stringEvent::getStartsAt()
public function getStartsAt(): ?\DateTimeImmutableEvent::setStartsAt()
public function setStartsAt(?\DateTimeInterface $startsAt): selfEvent::getEndsAt()
public function getEndsAt(): ?\DateTimeImmutableEvent::setEndsAt()
public function setEndsAt(?\DateTimeInterface $endsAt): selfEvent::getTimezone()
public function getTimezone(): stringEvent::setTimezone()
public function setTimezone(?string $timezone): selfEvent::isAllDay()
public function isAllDay(): boolEvent::setAllDay()
public function setAllDay(bool $allDay): selfEvent::getVenue()
public function getVenue(): ?VenueEvent::setVenue()
public function setVenue(?Venue $venue): selfEvent::getEnsemble()
public function getEnsemble(): ?stringEvent::setEnsemble()
public function setEnsemble(?string $ensemble): selfEvent::getConductor()
public function getConductor(): ?stringEvent::setConductor()
public function setConductor(?string $conductor): selfEvent::getRole()
public function getRole(): stringThe role's value ("soloist"), what the column and the admin's select hold; getRoleEnum() for the enum.
Event::getRoleEnum()
public function getRoleEnum(): RoleEvent::setRole()
public function setRole(Role|string|null $role): selfEvent::getProgramme()
public function getProgramme(): ?stringEvent::setProgramme()
public function setProgramme(?string $programme): selfEvent::getPerformers()
public function getPerformers(): ?stringEvent::setPerformers()
public function setPerformers(?string $performers): selfEvent::getTicketsUrl()
public function getTicketsUrl(): ?stringEvent::setTicketsUrl()
public function setTicketsUrl(?string $ticketsUrl): selfEvent::getEventUrl()
public function getEventUrl(): ?stringEvent::setEventUrl()
public function setEventUrl(?string $eventUrl): selfEvent::isCancelled()
public function isCancelled(): boolEvent::setCancelled()
public function setCancelled(bool $cancelled): selfEvent::getCover()
public function getCover(): ?stringEvent::getCoverFile()
public function getCoverFile(): ?FileEvent::setCover()
public function setCover($cover): selfEvent::hasCover()
public function hasCover(): boolWhether a picture is set, without asking the storage where it is.
Event::getCoverUrl()
public function getCoverUrl(): ?stringThe cover's address on the site ("/uploads/…"), what an <img> takes (Venue::publicPath()).
Event::getPictureUrl()
public function getPictureUrl(): ?stringThe picture the date shows: its own cover, else its house's photo.
Event::getPictureCredit()
public function getPictureCredit(): ?stringWho took that picture, when it is the house's (a date's own cover names nobody).
Event::getSourceUid()
public function getSourceUid(): ?stringEvent::setSourceUid()
public function setSourceUid(?string $sourceUid): selfEvent::getSource()
public function getSource(): ?stringEvent::setSource()
public function setSource(?string $source): selfEvent::getSourceUpdatedAt()
public function getSourceUpdatedAt(): ?\DateTimeImmutableEvent::setSourceUpdatedAt()
public function setSourceUpdatedAt(?\DateTimeInterface $at): selfEvent::isSyncLocked()
public function isSyncLocked(): boolEvent::setSyncLocked()
public function setSyncLocked(bool $syncLocked): selfEvent::isImported()
public function isImported(): boolRead from a calendar, not typed by hand.
Event::getDateTimeZone()
public function getDateTimeZone(): \DateTimeZoneEvent::getStartsAtLocal()
public function getStartsAtLocal(): ?\DateTimeImmutableThe start as the hall's clock shows it.
Event::getEndsAtLocal()
public function getEndsAtLocal(): ?\DateTimeImmutableEvent::isMultiDay()
public function isMultiDay(): boolSeveral days: a festival, a tour's residency.
Event::isUpcoming()
public function isUpcoming(?\DateTimeInterface $now = null): boolStill to come, the whole of its (last) day included: tonight's concert is upcoming until midnight there.
Event::isToday()
public function isToday(?\DateTimeInterface $now = null): boolOn today, in its own timezone (or its run includes today: a festival).
Event::isTonight()
public function isTonight(?\DateTimeInterface $now = null): boolToday, and in the evening (it starts at 5 pm or later, there): "tonight".
Event::isOnStage()
public function isOnStage(?\DateTimeInterface $now = null): boolPlaying right now: started, not over (two hours when no end is given).
Event::isPast()
public function isPast(?\DateTimeInterface $now = null): boolEvent::getProgrammeLines()
public function getProgrammeLines(): array- Returns
the works, one per line typed
Event::getPerformerLines()
public function getPerformerLines(): arrayEvent::getProgrammeWorks()
public function getProgrammeWorks(): arrayThe programme with the composer apart from the work, when the line names one ("Glière — Harp Concerto op. 74", "Glière: Harp Concerto").
Event::getPerformerNames()
public function getPerformerNames(): arrayThe performers with what they play apart ("Anna Meyer — harp").
Event::getDescriptionText()
public function getDescriptionText(): stringWhat a calendar entry says under the title, in plain text: with whom, the programme, the performers, where the tickets are. No labels, so it reads the same in every language.
Event::toCalendarEntry()
public function toCalendarEntry(string $uid, ?string $url = null): ?CalendarEntryThe date as a calendar sees it (glitchr/omnibase's Base\Service\Calendar\CalendarEntry), for its ICS file and its Google Calendar link. Null without a start. $uid: what identifies it in every calendar it lands in; $url: the page it links to.
Event::duplicate()
public function duplicate(string $titleSuffix = ' (copy)'): staticA copy to start the next date from: same venue, same programme, a draft with no calendar behind it.
Venue class
class Venue Venue.php:22
Where it happens: a hall, a church, a school's auditorium. Not a thread - a name, a room in it, an address, the map and the house's own site, its picture and who took it - and shared by every date played there, so it is typed once: a date shows the house's picture unless it has one of its own.
Two houses that turn out to be one are merged (VenueRepository::merge()):
the spellings of the one that goes are kept in aliases, so a calendar
that still writes them finds the house that stays.
Venue::__construct()
public function __construct(?string $name = null, ?string $city = null)Venue::__toString()
public function __toString(): stringVenue::key()
public static function key(?string $name, ?string $city): stringWhat a house is known by in a calendar, whatever the case and the accents: "elbphilharmonie|hamburg".
Venue::publicPath()
public static function publicPath(mixed $path): ?stringAn upload's address on the site ("/uploads/…"), what an <img> takes: the storage gives its public path from the server's root ("/srv/app/public/uploads/…"), the public directory is taken off.
Venue::slugify()
public static function slugify(?string $name, ?string $city): stringThe slug the name and the city make, before it is made unique.
Venue::giveSlug()
public function giveSlug(PrePersistEventArgs $event): voidThe slug is given once, when the venue is first saved: "-2" when another house has it - one already saved, or one waiting to be with this one (a calendar read opens many at once: "Bogota" and "Bogotá" make one slug).
Venue::getId()
public function getId(): ?intVenue::getName()
public function getName(): ?stringVenue::setName()
public function setName(?string $name): selfVenue::getHall()
public function getHall(): ?stringVenue::setHall()
public function setHall(?string $hall): selfVenue::getAddress()
public function getAddress(): ?stringVenue::setAddress()
public function setAddress(?string $address): selfVenue::getPostcode()
public function getPostcode(): ?stringVenue::setPostcode()
public function setPostcode(?string $postcode): selfVenue::getCity()
public function getCity(): ?stringVenue::setCity()
public function setCity(?string $city): selfVenue::getCountry()
public function getCountry(): ?stringVenue::setCountry()
public function setCountry(?string $country): selfVenue::getMapUrl()
public function getMapUrl(): ?stringVenue::setMapUrl()
public function setMapUrl(?string $mapUrl): selfVenue::getWebsite()
public function getWebsite(): ?stringVenue::setWebsite()
public function setWebsite(?string $website): selfVenue::getLatitude()
public function getLatitude(): ?floatVenue::setLatitude()
public function setLatitude(?float $latitude): selfVenue::getLongitude()
public function getLongitude(): ?floatVenue::setLongitude()
public function setLongitude(?float $longitude): selfVenue::getPhoto()
public function getPhoto(): ?stringVenue::getPhotoFile()
public function getPhotoFile(): ?FileVenue::setPhoto()
public function setPhoto($photo): selfVenue::hasPhoto()
public function hasPhoto(): boolWhether a picture is set, without asking the storage where it is.
Venue::getPhotoUrl()
public function getPhotoUrl(): ?stringVenue::getPhotoCredit()
public function getPhotoCredit(): ?stringVenue::setPhotoCredit()
public function setPhotoCredit(?string $photoCredit): selfVenue::getAliases()
public function getAliases(): arrayVenue::setAliases()
public function setAliases(?array $aliases): selfVenue::isKnownAs()
public function isKnownAs(string $name, ?string $city): boolWhether a calendar's spelling ("Pärmu Concert Hall", "Pärnu") names this house.
Venue::getSlug()
public function getSlug(): ?stringVenue::setSlug()
public function setSlug(?string $slug): selfVenue::getLabel()
public function getLabel(): string"Elbphilharmonie, Hamburg": the venue on a line of the list.
Venue::getFullAddress()
public function getFullAddress(): stringEverything on one line, for a calendar's LOCATION and a map search.
Venue::getMapLink()
public function getMapLink(): ?stringThe map link typed in the back office, else a search of the address (or of the coordinates).
Base\Agenda\Enum
Role enum
enum Role Role.php:11
What the artist does that evening: the soloist of a concerto, the leader of the orchestra (concertmaster, guest leader), a chamber partner, a desk in the orchestra, a recital, a masterclass given. A string enum (not omnibase's EnumType) so the column reads plainly in the database and in the admin's filters.
case SOLOIST = 'soloist'case LEADER = 'leader'case CHAMBER = 'chamber'case ORCHESTRA = 'orchestra'case RECITAL = 'recital'case MASTERCLASS = 'masterclass'case OTHER = 'other'
Role::label()
public function label(): stringThe translation key of its name, in the "agenda" domain.
Role::of()
public static function of(self|string|null $role): selfAnything a form or a filter hands over, OTHER when it is none of ours.
Role::values()
public static function values(): arrayBase\Agenda\EventListener
SitemapListener class
final class SitemapListener SitemapListener.php:16
The dates' own pages in /sitemap.xml: omnibase lists the routes it can generate by itself (/agenda), and a date is behind a slug it cannot know.
Each carries the day it was last changed, so a crawler comes back to the ones that move.
SitemapListener::__construct()
public function __construct(readonly EventRepository $events)SitemapListener::__invoke()
public function __invoke(SitemapEvent $event): voidBase\Agenda\Model
Change class
final class Change Change.php:13
What a sync does, or would do, to one date: opens it (created),
brings it up to date (updated, each field as it was and as it
becomes), cancels it because its calendar says so (cancelled), or
finds it gone from its calendar (missing: held until someone says
whether it is cancelled or kept). Plain values, kept as JSON in the
sync's history.
const CREATED = 'created'const UPDATED = 'updated'const CANCELLED = 'cancelled'const MISSING = 'missing'public readonly string $kindpublic readonly string $titlepublic readonly string $startthe date's start on its hall's clock, "2026-11-23 20:00"
public readonly ?int $eventIdpublic readonly array $fieldsfield => [as it was, as it becomes]
Change::__construct()
public function __construct(public readonly string $kind, public readonly string $title, public readonly string $start, public readonly ?int $eventId = null, public readonly array $fields = [])$startthe date's start on its hall's clock, "2026-11-23 20:00"
$fieldsfield => [as it was, as it becomes]
Change::toArray()
public function toArray(): arrayChange::fromArray()
public static function fromArray(array $data): selfImportSummary class
final class ImportSummary ImportSummary.php:11
What a sync did - or, previewed, would do: the dates it opened, the ones it brought up to date, the ones its calendar cancelled, the ones gone from their calendar (held, not cancelled: Change::MISSING), each as a Change.
public int $createdpublic int $updatedpublic int $cancelledpublic int $unchangedpublic array $errorsa source that could not be read, and why
public array $changespublic int $missing
ImportSummary::__construct()
public function __construct(public int $created = 0, public int $updated = 0, public int $cancelled = 0, public int $unchanged = 0, public array $errors = [], public array $changes = [], public int $missing = 0)$errorsa source that could not be read, and why
ImportSummary::add()
public function add(self $other): selfImportSummary::record()
public function record(Change $change): voidImportSummary::isEmpty()
public function isEmpty(): boolImportSummary::missingIds()
public function missingIds(): array- Returns
the dates gone from their calendar, waiting for a word
ImportSummary::toArray()
public function toArray(): arrayParsedEvent class
final class ParsedEvent ParsedEvent.php:16
One date as a source gave it - a VEVENT read by Service\IcsParser, an
entry of a Squarespace events page, one of another site's /agenda.json -
in plain values, no Doctrine. The moments carry their own timezone;
timezone is the one the entry named (its TZID, else the calendar's),
the hall's.
What a source says beyond the calendar's own fields (the ensemble, the conductor, the programme...) comes in the nullable properties: null is "not said", and leaves the site's value as it is.
public readonly string $uidpublic readonly string $summarypublic readonly \DateTimeImmutable $startpublic readonly ?\DateTimeImmutable $endFor whole days: the last day (ICS's own DTEND is the day after).
public readonly bool $allDaypublic readonly string $timezonepublic readonly ?string $descriptionpublic readonly ?string $locationpublic readonly ?string $urlpublic readonly ?\DateTimeImmutable $lastModifiedpublic readonly bool $cancelledpublic readonly int $sequencepublic readonly bool $recurringIt repeats (RRULE): only its first occurrence is read.
public readonly ?string $ensemblepublic readonly ?string $conductorpublic readonly ?string $roleA Role's value: "soloist", "chamber".
public readonly ?array $performerspublic readonly ?array $programmepublic readonly ?string $ticketspublic readonly ?string $imageThe date's own picture's address: its cover when it has none.
public readonly ?array $placeThe hall as the source structures it, when it does: what a Venue is found or opened from instead of splitting
location.photo(an address) andphotoCreditare the house's picture: its photo when it has none.
ParsedEvent::__construct()
public function __construct(public readonly string $uid, public readonly string $summary, public readonly \DateTimeImmutable $start, public readonly ?\DateTimeImmutable $end = null, public readonly bool $allDay = false, public readonly string $timezone = 'UTC', public readonly ?string $description = null, public readonly ?string $location = null, public readonly ?string $url = null, public readonly ?\DateTimeImmutable $lastModified = null, public readonly bool $cancelled = false, public readonly int $sequence = 0, public readonly bool $recurring = false, public readonly ?string $ensemble = null, public readonly ?string $conductor = null, public readonly ?string $role = null, public readonly ?array $performers = null, public readonly ?array $programme = null, public readonly ?string $tickets = null, public readonly ?string $image = null, public readonly ?array $place = null)ParsedEvent::with()
public function with(array $values): selfThe same date with some of its values replaced: what the description says, read once the entry is.
Base\Agenda\Repository
EventRepository class
class EventRepository extends ServiceEntityRepository EventRepository.php:12
EventRepository::__construct()
public function __construct(ManagerRegistry $registry)EventRepository::findUpcoming()
public function findUpcoming(?int $limit = null): arrayThe published dates to come, the nearest first. Today's count until midnight, and a date of several days until its last one.
EventRepository::findToday()
public function findToday(?\DateTimeImmutable $now = null): arrayThe dates on today, wherever they are: a window of a day and a half around now, then each one's own day in its own timezone (Event::isToday).
EventRepository::countUpcoming()
public function countUpcoming(): intEventRepository::findPast()
public function findPast(?int $limit = null, int $page = 1): arrayA page of the published dates gone by, the latest first. Paged by hand: Doctrine's Paginator walks the SQL with an output walker omnibase's own SqlWalker is incompatible with.
EventRepository::countPast()
public function countPast(): intEventRepository::findOnePublished()
public function findOnePublished(string $slug): ?EventEventRepository::findBetween()
public function findBetween(\DateTimeInterface $from, \DateTimeInterface $to): arrayThe published dates starting from $from up to (not including) $to, in order: a calendar feed, a newsletter's digest.
EventRepository::findSince()
public function findSince(\DateTimeInterface $from): arrayThe published dates from $from on, in order: what a subscribed calendar holds.
@return list<Event>
EventRepository::findForFeed()
public function findForFeed(bool $past = false, ?\DateTimeImmutable $from = null, ?\DateTimeImmutable $to = null, int $limit = 100, int $page = 1): arrayA page of the JSON feed: the dates to come (the nearest first), or the ones gone by ($past, the latest first), within [$from, $to] when given (both days included, in the server's timezone). One more than $limit is asked for: whether a next page exists.
EventRepository::findAllPublished()
public function findAllPublished(int $limit = 5000): arrayEvery published date, the latest first: the sitemap's.
@return list<Event>
EventRepository::findByMonth()
public function findByMonth(int $year, int $month): arrayThe published dates of one month.
@return list<Event>
EventRepository::findBySourceUid()
public function findBySourceUid(string $uid): ?EventThe date read from that calendar entry, whatever its state: the importer's.
EventRepository::findUpcomingOfSource()
public function findUpcomingOfSource(string $source): arrayThe dates to come read from one calendar and not cancelled yet: the ones the importer checks are still in it.
VenueRepository class
class VenueRepository extends ServiceEntityRepository VenueRepository.php:12
VenueRepository::__construct()
public function __construct(ManagerRegistry $registry)VenueRepository::findOneByNameAndCity()
public function findOneByNameAndCity(string $name, ?string $city = null): ?VenueThe house of that name in that town (whatever the case), else the one that spelling was merged into, so an import does not open it twice.
VenueRepository::findOneByFullAddress()
public function findOneByFullAddress(string $location): ?VenueThe house whose full address (Venue::getFullAddress(), a calendar's LOCATION as the site writes it) is that line.
VenueRepository::findOneByAlias()
public function findOneByAlias(string $name, ?string $city = null): ?VenueThe house a spelling was merged into ("Pärmu Concert Hall" into "Pärnu Concert Hall").
VenueRepository::merge()
public function merge(Venue $from, Venue $into): intTwo houses that are one: the dates of $from are moved to $into, what $into leaves empty is taken from $from (its photo copied, the upload of $from going with it), the spellings of $from become aliases of $into, and $from is deleted.
- Returns
the dates moved
VenueRepository::findAllByName()
public function findAllByName(): array- Returns
by name, for a select
Base\Agenda\Service
DescriptionParser class
final class DescriptionParser DescriptionParser.php:24
What a calendar entry's description says, read by its lines: the artist writes the date in Google Calendar from her phone, one piece of information per line, opened by a word she knows in her language -
Orchestre : NDR Elbphilharmonie Orchester Chef : Vasily Petrenko Rôle : soliste Billets : https://www.elbphilharmonie.de/... Programme : Glière — Concerto pour harpe op. 74
- and the site files each where it goes. The words are read whatever
their case and accents, in English, French, German and Italian. The
lines after "Programme" are the programme until a blank line or another
word; a line no word opens is the programme too once a word was read,
and before that it is the
rest. Google sends plain text, sometimes HTML: tags are dropped, a link keeps its address, entities are decoded.
const PARTS = ['conductor', 'conducting', 'direction', 'chef', 'dirigent', 'leitung', 'direttore', 'piano', 'pianist', 'pianiste', 'klavier', 'pianoforte', 'fortepiano', '…What a performer plays or does, folded: "Anna Meyer, harp" is one performer, not two. Squarespace's reader tells a name from a work by them too.
DescriptionParser::parse()
public static function parse(?string $description): arrayDescriptionParser::role()
public static function role(string $text): stringA Role's value from the words typed: "soliste" → soloist, "Konzertmeister" → leader, anything else → other.
DescriptionParser::fold()
public static function fold(string $text): stringLower case, no accent, one kind of apostrophe, one space: what a key is compared as.
DescriptionParser::isPart()
public static function isPart(string $text): boolWhether a few words only say what one plays or does: "Conductor", "Piano & direction".
DescriptionParser::text()
public static function text(string $description): stringThe description as plain text: an HTML one's lines kept, its links as their address.
Feed class
final class Feed Feed.php:18
The dates as JSON, for the sites and apps that show them elsewhere - an agency's roster, an orchestra's page, a sister site (Service\FeedParser reads it back): /agenda.json and /agenda/{slug}.json. Every moment in ISO 8601 with the hall's offset, every address absolute, the role as its value and its name in the reader's language. Plain arrays, no Response: Controller\Client\AgendaController sends them.
Feed::__construct()
public function __construct(readonly Ics $ics, readonly ?UrlGeneratorInterface $urls = null, readonly ?TranslatorInterface $translator = null)Feed::document()
public function document(iterable $events, string $name, string $timezone, ?string $next = null, ?string $locale = null, ?\DateTimeInterface $now = null): arrayThe whole document: the calendar, its dates, the next page.
Feed::event()
public function event(Event $event, ?string $locale = null): array- Returns
one date
Feed::venue()
public function venue(?Venue $venue): ?arrayFeed::cover()
public function cover(Event $event): ?stringThe cover's address for whoever reads it from elsewhere (this feed, the JSON-LD, a sister site's importer): /agenda/{slug}/cover, which says what kind of picture it is. The storage keeps an upload under a bare identifier, so the web server alone sends it as application/octet-stream - a browser's <img> copes, a reader that checks the type does not. A cover kept elsewhere (an address) stays as it is.
Feed::picture()
public function picture(Event $event): ?stringThe picture a date shows, for whoever reads it from elsewhere: its cover, else its house's photo.
Feed::photo()
public function photo(Venue $venue): ?stringA house's photo for whoever reads it from elsewhere: /agenda/venue/{slug}/photo, which says its type (see cover()).
Feed::absolute()
public function absolute(?string $path): ?stringA path of the site made absolute on the address the request came to; an address stays as it is.
FeedParser class
final class FeedParser FeedParser.php:14
Another site's /agenda.json (Service\Feed wrote it) read back into
ParsedEvents: the dates of a sister site, an ensemble's, an agency's
that runs omnibase/agenda too. Everything the feed says is taken - the
uid is the feed's id, so a date read from two places is one. No HTTP
here: Service\IcsImporter follows next.
FeedParser::supports()
public static function supports(mixed $data): boolWhether a decoded JSON is one of our feeds.
FeedParser::next()
public static function next(array $data): ?stringThe feed's next page, absolute already; null on the last one.
FeedParser::parse()
public function parse(array|string $json): arrayIcs class
final class Ics Ics.php:17
The dates as an iCalendar file, and their Google Calendar links: each Event made a CalendarEntry (its UID, its page on the site) and written by glitchr/omnibase's Base\Service\Calendar - the RFC 5545 writing lives there, once for every bundle.
const PROD_ID = '-//omnibase//agenda//EN'
Ics::__construct()
public function __construct(readonly ?UrlGeneratorInterface $urls = null, ?Calendar $calendar = null, ?GoogleCalendarLink $google = null)Ics::calendar()
public function calendar(iterable $events, string $name = 'Agenda', string $prodId = self::PROD_ID): stringIcs::event()
public function event(Event $event): stringOne date as a VEVENT block, to put in a VCALENDAR.
Ics::google()
public function google(Event $event): stringThe "add to Google Calendar" link: the organiser's page in its details, as before.
Ics::uid()
public function uid(Event $event): stringWhat identifies the date in every calendar it lands in: the entry it was read from, else ours.
Ics::entry()
public function entry(Event $event): ?CalendarEntryIcs::escape()
public static function escape(string $text): stringIcs::fold()
public static function fold(string $line): stringIcsImporter class
final class IcsImporter IcsImporter.php:45
The dates read from where they are kept - a Google Calendar's secret address (the artist's, from her phone), an agency's ICS feed, a Squarespace events page (the former site's), another omnibase site's /agenda.json - into Events, matched by the entry's UID.
The calendar is the source of truth: at each sync a date takes from it
its title, its hours, its place (a Venue found or opened), the
organiser's link, a cancellation, and what its description says
(Service\DescriptionParser: the ensemble, the conductor, the role, the
performers, the programme, the tickets) - what it does not say stays as
written on the site, and a date marked syncLocked takes only its hours
and its cancellation. A house's picture the source has (Squarespace's,
another site's) becomes the photo of a house that has none, a date's own
the cover of a date that has none. A new date goes online at once.
Every change is told (Model\Change: each field as it was and as it
becomes), and can be only told: import(apply: false) is the preview the
back office shows before "Apply". A date gone from its calendar is
neither cancelled nor deleted behind anyone's back - a slip of the
finger in Google Calendar would strike a concert through on the site -
but held (Change::MISSING, the agenda.sync.missing setting) until
someone says whether it is cancelled or kept (resolveMissing()). The
syncs that changed something are kept, latest first (history()).
const ADDRESS_SETTING = 'agenda.ics'The setting the back office keeps the calendar's address in (Controller\Admin\CalendarController).
const LAST_SYNC_SETTING = 'agenda.sync.last'The setting the last sync's summary is kept in, as JSON.
const HISTORY_SETTING = 'agenda.sync.history'The setting the syncs that changed something are kept in, latest first, as JSON.
const MISSING_SETTING = 'agenda.sync.missing'The setting the dates gone from their calendar wait in (their ids), as JSON.
IcsImporter::__construct()
public function __construct(readonly EntityManagerInterface $entityManager, readonly EventRepository $events, readonly VenueRepository $venueRepository, readonly IcsParser $parser, readonly SquarespaceParser $squarespace, readonly FeedParser $feeds, readonly HttpClientInterface $http, readonly ?SettingBagInterface $settings = null, readonly array $sources = [], readonly ?string $ics = null)IcsImporter::getSources()
public function getSources(): arrayEvery calendar to read: agenda.sources, agenda.ics (an environment variable, comma-separated) and the address typed in the back office.
IcsImporter::hasSources()
public function hasSources(): boolIcsImporter::getAddress()
public function getAddress(): ?stringThe address typed in the back office (comma-separated when several), or null.
IcsImporter::setAddress()
public function setAddress(?string $address): voidIcsImporter::remember()
public function remember(ImportSummary $summary, ?\DateTimeInterface $at = null): voidWhat a sync that was applied did, for the back office: when, its counts and errors (the last sync), its changes (the history, when it changed something), the dates it found gone (waiting for a word).
IcsImporter::lastSync()
public function lastSync(): ?arrayIcsImporter::history()
public function history(): array- Returns
the syncs that changed something, latest first
IcsImporter::missingIds()
public function missingIds(): array- Returns
the dates gone from their calendar, waiting for a word
IcsImporter::missing()
public function missing(): array- Returns
those dates, still to come and not cancelled meanwhile
IcsImporter::resolveMissing()
public function resolveMissing(array $ids, bool $cancel): intThe word on dates gone from their calendar: cancelled (struck through on the site, who had a ticket finds it), or kept - the site's own from now on, no calendar asks about it again (an entry back in its calendar takes it back).
- Returns
the dates settled
IcsImporter::sync()
public function sync(?array $sources = null, bool $apply = true): ImportSummaryEvery source configured, or the ones given - applied, or only told ($apply false: the preview).
IcsImporter::import()
public function import(string $content, string $source = 'ics', ?string $address = null, bool $apply = true): ImportSummaryOne source's content, already read: an iCalendar file, a Squarespace events page's JSON or an agenda feed. $source names it, so that the dates which left it can be told from the ones of another calendar; $address, where it was read, is where its next pages are. $apply false: nothing is written, nothing is fetched (no picture), the changes are only told.
IcsImporter::parse()
public function parse(string $content, ?string $address = null): arrayThe dates a content holds, whatever it is: an iCalendar file (each entry's description read for its fields), a Squarespace events page (its past dates followed a few pages back), an agenda feed (its pages followed).
IcsImporter::described()
public static function described(ParsedEvent $event): ParsedEventAn entry with what its description says filled in: the fields its lines name; the lines no word opens are the programme when none is named (the description of an entry nobody structured).
IcsImporter::key()
public static function key(string $source): stringWhat names a source in the database: short, stable, nothing of a private address in it.
IcsImporter::splitLocation()
public static function splitLocation(string $location): array"Elbphilharmonie, Platz der Deutschen Einheit 1, 20457 Hamburg, Germany": the name before the first comma, the town in the last part (the one before it when the last is a country: no figure in it, a postcode in the one before), the street in between.
IcsImporter::read()
public function read(string $source): stringWhat a source holds: an address (http, https, webcal) read - a Squarespace page's address gives its HTML, its JSON is asked then -, a file, or the content itself.
IcsImporter::display()
public static function display(string $source): stringA source as an error message may show it: no private key of a Google address.
IcsParser class
final class IcsParser IcsParser.php:19
A small RFC 5545 reader: enough of it for what a Google Calendar, an Apple one or an orchestra's site publishes. Lines are unfolded, the VEVENT blocks read one by one (VTIMEZONE and VALARM skipped), parameters kept, texts unescaped; a DTSTART with a TZID is read in that timezone, a VALUE=DATE as a day, a trailing Z as UTC, a bare hour in the calendar's X-WR-TIMEZONE (else the default given). A repeating entry gives its first occurrence only - the occurrences changed by hand (RECURRENCE-ID, under the series' UID) never in its place. No Doctrine here: Service\IcsImporter does the rest.
IcsParser::__construct()
public function __construct(readonly string $defaultTimezone = 'Europe/Berlin')IcsParser::parse()
public function parse(string $ics): arrayIcsParser::unfold()
public static function unfold(string $ics): arrayThe physical lines, each continuation (a line opened by a space or a tab) glued back onto the one before it.
IcsParser::unescape()
public static function unescape(string $text): stringA text value read back: "\n", "\,", "\;", "\\".
IcsParser::split()
public static function split(string $line): array"DTSTART;TZID=Europe/Paris:20261003T200000" → ["DTSTART", ["TZID" => "Europe/Paris"], "20261003T200000"].
A colon inside a quoted parameter does not end the name.
JsonLd class
final class JsonLd JsonLd.php:18
A date as schema.org reads it: an event of the type the site is about (agenda.jsonld_type: a musician's MusicEvent - an EducationEvent for a masterclass -, a lecturer's EducationEvent, any other site's Event) with its start and end in ISO 8601 with their offset, the Place and its PostalAddress, the performers, the tickets as an Offer, the cover, and EventCancelled when it will not take place. What the search engines show under the artist's name.
const MUSIC_EVENT = 'MusicEvent'const EDUCATION_EVENT = 'EducationEvent'const EVENT = 'Event'const TYPES = [self::MUSIC_EVENT, self::EDUCATION_EVENT, self::EVENT]
JsonLd::__construct()
public function __construct(string $type = self::MUSIC_EVENT)JsonLd::getType()
public function getType(): stringThe schema.org type of every date (a musician's masterclass apart).
JsonLd::for()
public function for(Event $event, ?string $url = null, ?string $image = null, ?string $artist = null): arrayMonths class
final class Months Months.php:12
The dates by month, in the order given: what the agenda page lists under "October 2026", "November 2026". A date belongs to the month of its first day, as the hall's clock reads it.
Months::group()
public static function group(iterable $events): arraySquarespaceParser class
final class SquarespaceParser SquarespaceParser.php:21
The dates of a Squarespace events page, read from its JSON
(/performances?format=json): what an artist's former site holds while
the new one takes over. Each entry is a ParsedEvent (uid
"squarespace:<id>"); its HTML body is read the way such pages are typed -
a first line in bold, the orchestra; "**Name** Conductor", "**Name**
Piano", the performers; "**Composer** Work", the programme.
Squarespace keeps every hour as the site's own clock, Berlin's, whatever the hall: the hour typed is read on that clock and put back in the hall's timezone, the country's. No HTTP here: Service\IcsImporter fetches the pages (nextPage() says which comes next).
const SITE_TIMEZONE = 'Europe/Berlin'The clock Squarespace stored the hours on.
const TIMEZONES = ['DE' => 'Europe/Berlin', 'AT' => 'Europe/Vienna', 'CH' => 'Europe/Zurich', 'FR' => 'Europe/Paris', 'IT' => 'Europe/Rome', 'NL' => 'Europe/Amsterdam', 'BE' =…ISO country → its timezone (the capital's: one per country is what a concert hall needs).
const COUNTRIES = ['allemagne' => 'DE', 'germany' => 'DE', 'deutschland' => 'DE', 'autriche' => 'AT', 'austria' => 'AT', 'osterreich' => 'AT', 'suisse' => 'CH', 'switzerland' …Country names as Squarespace writes them (in the site's language, French here) and in English and German, folded.
SquarespaceParser::__construct()
public function __construct(readonly string $defaultTimezone = 'Europe/Berlin')SquarespaceParser::supports()
public static function supports(mixed $data): boolWhether a decoded JSON is a Squarespace events collection.
SquarespaceParser::jsonUrl()
public static function jsonUrl(string $url): stringThe JSON address of an events page: "?format=json" added when missing.
SquarespaceParser::nextPage()
public static function nextPage(array $data, string $address): ?stringThe next page of the past dates (pagination.nextPageUrl), as an absolute JSON address on the host of $address; null on the last page.
SquarespaceParser::parse()
public function parse(array|string $json): arrayThe upcoming dates and the past ones of a page.
SquarespaceParser::body()
public static function body(string $html): arrayAn entry's HTML body read line by line: each paragraph, each line of it (split on <br>), as (the bold text, the rest).
SquarespaceParser::wallClock()
public static function wallClock(int $milliseconds, string $timezone): \DateTimeImmutableA moment in milliseconds read on Berlin's clock, that hour set in the hall's timezone.
Base\Agenda\Twig
AgendaExtension class
final class AgendaExtension extends AbstractExtension AgendaExtension.php:21
What a host's own pages ask the agenda: the next dates for a home page, the very next one for a banner, the two "add to calendar" links of a date, the dates by month, and a role's name.
AgendaExtension::__construct()
public function __construct(readonly EventRepository $events, readonly Ics $ics, readonly UrlGeneratorInterface $urls, readonly TranslatorInterface $translator)AgendaExtension::getFunctions()
public function getFunctions(): arrayAgendaExtension::getFilters()
public function getFilters(): array