Aller au contenu

omnibase/agenda Référence de l’API

Étage
Structure préparée · Omnibase
Version
main
Vérifié en réel
Son README ne le dit pas
Licence
MIT
composer require omnibase/agenda:dev-main

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é.

Base\Agenda

  • AgendaBundle class

    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.

    3 methods

Base\Agenda\Admin\Widget

  • UpcomingEventsWidgetType class

    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.

    4 methods

Base\Agenda\Command

  • SyncCommand class

    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.

    1 method

Base\Agenda\Controller\Admin

  • CalendarController class

    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.

    5 methods

Base\Agenda\Controller\Admin\Crud

  • EventCrudController class

    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").

    10 methods

  • VenueCrudController class

    The houses the dates are played in: typed once, chosen on every date.

    8 methods

Base\Agenda\Controller\Client

  • AgendaController class

    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).

    9 methods

Base\Agenda\DependencyInjection

Base\Agenda\Digest

  • AgendaDigest trait

    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.

    3 methods

Base\Agenda\Entity

  • Event class

    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.

    62 methods · 1 constant

  • Venue class

    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.

    42 methods

Base\Agenda\Enum

  • Role enum

    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.

    3 methods · 7 cases

Base\Agenda\EventListener

  • SitemapListener class

    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.

    2 methods

Base\Agenda\Model

  • Change class

    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.

    3 methods · 5 properties · 4 constants

  • ImportSummary class

    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.

    6 methods · 7 properties

  • ParsedEvent class

    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.

    2 methods · 21 properties

Base\Agenda\Repository

Base\Agenda\Service

  • DescriptionParser class

    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 -

    5 methods · 1 constant

  • Feed class

    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.

    8 methods

  • FeedParser class

    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`.

    3 methods

  • Ics class

    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.

    8 methods · 1 constant

  • IcsImporter class

    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.

    19 methods · 4 constants

  • IcsParser class

    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.

    5 methods

  • JsonLd class

    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.

    3 methods · 4 constants

  • Months class

    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.

    1 method

  • SquarespaceParser class

    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.

    7 methods · 3 constants

Base\Agenda\Twig

  • AgendaExtension class

    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.

    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(): string

Modern layout: the class lives in src/, the bundle root is the package root.

AgendaBundle::build()

public function build(ContainerBuilder $container): void

Base\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(): string

UpcomingEventsWidgetType::getTemplate()

public function getTemplate(): string

UpcomingEventsWidgetType::getTemplateVars()

public function getTemplateVars(MenuItem $widget): array

Base\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): Response

The page; ?preview=1 reads the calendars now and shows what they would change, writing nothing.

CalendarController::save()

public function save(Request $request): Response

The address pasted (or forgotten).

CalendarController::sync()

public function sync(Request $request): Response

Every calendar read now and applied, as agenda:sync does every half hour: the preview's "Apply".

CalendarController::missing()

public function missing(Request $request): Response

The 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'): void

EventCrudController::getEntityFqcn()

public static function getEntityFqcn(): string

EventCrudController::getPreferredIcon()

public static function getPreferredIcon(): ?string

EventCrudController::configureCrud()

public function configureCrud(Crud $crud): Crud

EventCrudController::configureFilters()

public function configureFilters(Filters $filters): Filters

EventCrudController::configureFields()

public function configureFields(string $pageName): iterable

EventCrudController::configureActions()

public function configureActions(Actions $actions): Actions

EventCrudController::createEntity()

public function createEntity(string $entityFqcn): object

EventCrudController::duplicate()

public function duplicate(string $entityId): Response

A copy of the date, a draft, to set the next one of a tour: same venue, same programme.

EventCrudController::sync()

public function sync(): Response

The 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): void

VenueCrudController::getEntityFqcn()

public static function getEntityFqcn(): string

VenueCrudController::getPreferredIcon()

public static function getPreferredIcon(): ?string

VenueCrudController::configureCrud()

public function configureCrud(Crud $crud): Crud

VenueCrudController::configureFilters()

public function configureFilters(Filters $filters): Filters

VenueCrudController::configureFields()

public function configureFields(string $pageName): iterable

VenueCrudController::configureActions()

public function configureActions(Actions $actions): Actions

VenueCrudController::merge()

public function merge(Request $request, string $entityId): Response

The 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): Response

AgendaController::feed()

public function feed(): Response

AgendaController::list()

public function list(Request $request): Response

The 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): Response

One date as JSON: what /agenda.json says of it.

AgendaController::eventIcs()

public function eventIcs(string $slug): Response

AgendaController::cover()

public function cover(Request $request, string $slug): Response

A 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): Response

A 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): Response

Base\Agenda\DependencyInjection

AgendaConfiguration class

class AgendaConfiguration extends AbstractBaseConfiguration AgendaConfiguration.php:8

AgendaConfiguration::getConfigTreeBuilder()

public function getConfigTreeBuilder(): TreeBuilder

AgendaExtension class

class AgendaExtension extends AbstractBaseExtension AgendaExtension.php:11

AgendaExtension::getConfiguration()

public function getConfiguration(array $config, ContainerBuilder $container): AgendaConfiguration

AgendaExtension::load()

public function load(array $configs, ContainerBuilder $container): void

Base\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(): string

AgendaDigest::digest()

public function digest(\DateTimeImmutable $from, \DateTimeImmutable $to, string $locale): array

Base\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(): ?array
public function __toLink(array $routeParameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): ?string

Event::__toString()

public function __toString(): string

Event::getStartsAt()

public function getStartsAt(): ?\DateTimeImmutable

Event::setStartsAt()

public function setStartsAt(?\DateTimeInterface $startsAt): self

Event::getEndsAt()

public function getEndsAt(): ?\DateTimeImmutable

Event::setEndsAt()

public function setEndsAt(?\DateTimeInterface $endsAt): self

Event::getTimezone()

public function getTimezone(): string

Event::setTimezone()

public function setTimezone(?string $timezone): self

Event::isAllDay()

public function isAllDay(): bool

Event::setAllDay()

public function setAllDay(bool $allDay): self

Event::getVenue()

public function getVenue(): ?Venue

Event::setVenue()

public function setVenue(?Venue $venue): self

Event::getEnsemble()

public function getEnsemble(): ?string

Event::setEnsemble()

public function setEnsemble(?string $ensemble): self

Event::getConductor()

public function getConductor(): ?string

Event::setConductor()

public function setConductor(?string $conductor): self

Event::getRole()

public function getRole(): string

The role's value ("soloist"), what the column and the admin's select hold; getRoleEnum() for the enum.

Event::getRoleEnum()

public function getRoleEnum(): Role

Event::setRole()

public function setRole(Role|string|null $role): self

Event::getProgramme()

public function getProgramme(): ?string

Event::setProgramme()

public function setProgramme(?string $programme): self

Event::getPerformers()

public function getPerformers(): ?string

Event::setPerformers()

public function setPerformers(?string $performers): self

Event::getTicketsUrl()

public function getTicketsUrl(): ?string

Event::setTicketsUrl()

public function setTicketsUrl(?string $ticketsUrl): self

Event::getEventUrl()

public function getEventUrl(): ?string

Event::setEventUrl()

public function setEventUrl(?string $eventUrl): self

Event::isCancelled()

public function isCancelled(): bool

Event::setCancelled()

public function setCancelled(bool $cancelled): self

Event::getCover()

public function getCover(): ?string

Event::getCoverFile()

public function getCoverFile(): ?File

Event::setCover()

public function setCover($cover): self

Event::hasCover()

public function hasCover(): bool

Whether a picture is set, without asking the storage where it is.

Event::getCoverUrl()

public function getCoverUrl(): ?string

The cover's address on the site ("/uploads/…"), what an <img> takes (Venue::publicPath()).

Event::getPictureUrl()

public function getPictureUrl(): ?string

The picture the date shows: its own cover, else its house's photo.

Event::getPictureCredit()

public function getPictureCredit(): ?string

Who took that picture, when it is the house's (a date's own cover names nobody).

Event::getSourceUid()

public function getSourceUid(): ?string

Event::setSourceUid()

public function setSourceUid(?string $sourceUid): self

Event::getSource()

public function getSource(): ?string

Event::setSource()

public function setSource(?string $source): self

Event::getSourceUpdatedAt()

public function getSourceUpdatedAt(): ?\DateTimeImmutable

Event::setSourceUpdatedAt()

public function setSourceUpdatedAt(?\DateTimeInterface $at): self

Event::isSyncLocked()

public function isSyncLocked(): bool

Event::setSyncLocked()

public function setSyncLocked(bool $syncLocked): self

Event::isImported()

public function isImported(): bool

Read from a calendar, not typed by hand.

Event::getDateTimeZone()

public function getDateTimeZone(): \DateTimeZone

Event::getStartsAtLocal()

public function getStartsAtLocal(): ?\DateTimeImmutable

The start as the hall's clock shows it.

Event::getEndsAtLocal()

public function getEndsAtLocal(): ?\DateTimeImmutable

Event::isMultiDay()

public function isMultiDay(): bool

Several days: a festival, a tour's residency.

Event::isUpcoming()

public function isUpcoming(?\DateTimeInterface $now = null): bool

Still 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): bool

On today, in its own timezone (or its run includes today: a festival).

Event::isTonight()

public function isTonight(?\DateTimeInterface $now = null): bool

Today, and in the evening (it starts at 5 pm or later, there): "tonight".

Event::isOnStage()

public function isOnStage(?\DateTimeInterface $now = null): bool

Playing right now: started, not over (two hours when no end is given).

Event::isPast()

public function isPast(?\DateTimeInterface $now = null): bool

Event::getProgrammeLines()

public function getProgrammeLines(): array
Returns

the works, one per line typed

Event::getPerformerLines()

public function getPerformerLines(): array

Event::getProgrammeWorks()

public function getProgrammeWorks(): array

The 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(): array

The performers with what they play apart ("Anna Meyer — harp").

Event::getDescriptionText()

public function getDescriptionText(): string

What 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): ?CalendarEntry

The 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)'): static

A 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(): string

Venue::key()

public static function key(?string $name, ?string $city): string

What a house is known by in a calendar, whatever the case and the accents: "elbphilharmonie|hamburg".

Venue::publicPath()

public static function publicPath(mixed $path): ?string

An 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): string

The slug the name and the city make, before it is made unique.

Venue::giveSlug()

public function giveSlug(PrePersistEventArgs $event): void

The 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(): ?int

Venue::getName()

public function getName(): ?string

Venue::setName()

public function setName(?string $name): self

Venue::getHall()

public function getHall(): ?string

Venue::setHall()

public function setHall(?string $hall): self

Venue::getAddress()

public function getAddress(): ?string

Venue::setAddress()

public function setAddress(?string $address): self

Venue::getPostcode()

public function getPostcode(): ?string

Venue::setPostcode()

public function setPostcode(?string $postcode): self

Venue::getCity()

public function getCity(): ?string

Venue::setCity()

public function setCity(?string $city): self

Venue::getCountry()

public function getCountry(): ?string

Venue::setCountry()

public function setCountry(?string $country): self

Venue::getMapUrl()

public function getMapUrl(): ?string

Venue::setMapUrl()

public function setMapUrl(?string $mapUrl): self

Venue::getWebsite()

public function getWebsite(): ?string

Venue::setWebsite()

public function setWebsite(?string $website): self

Venue::getLatitude()

public function getLatitude(): ?float

Venue::setLatitude()

public function setLatitude(?float $latitude): self

Venue::getLongitude()

public function getLongitude(): ?float

Venue::setLongitude()

public function setLongitude(?float $longitude): self

Venue::getPhoto()

public function getPhoto(): ?string

Venue::getPhotoFile()

public function getPhotoFile(): ?File

Venue::setPhoto()

public function setPhoto($photo): self

Venue::hasPhoto()

public function hasPhoto(): bool

Whether a picture is set, without asking the storage where it is.

Venue::getPhotoUrl()

public function getPhotoUrl(): ?string

Venue::getPhotoCredit()

public function getPhotoCredit(): ?string

Venue::setPhotoCredit()

public function setPhotoCredit(?string $photoCredit): self

Venue::getAliases()

public function getAliases(): array

Venue::setAliases()

public function setAliases(?array $aliases): self

Venue::isKnownAs()

public function isKnownAs(string $name, ?string $city): bool

Whether a calendar's spelling ("Pärmu Concert Hall", "Pärnu") names this house.

Venue::getSlug()

public function getSlug(): ?string

Venue::setSlug()

public function setSlug(?string $slug): self

Venue::getLabel()

public function getLabel(): string

"Elbphilharmonie, Hamburg": the venue on a line of the list.

Venue::getFullAddress()

public function getFullAddress(): string

Everything on one line, for a calendar's LOCATION and a map search.

public function getMapLink(): ?string

The 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(): string

The translation key of its name, in the "agenda" domain.

Role::of()

public static function of(self|string|null $role): self

Anything a form or a filter hands over, OTHER when it is none of ours.

Role::values()

public static function values(): array

Base\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): void

Base\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 $kind
public readonly string $title
public readonly string $start

the date's start on its hall's clock, "2026-11-23 20:00"

public readonly ?int $eventId
public readonly array $fields

field => [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 = [])
$start

the date's start on its hall's clock, "2026-11-23 20:00"

$fields

field => [as it was, as it becomes]

Change::toArray()

public function toArray(): array

Change::fromArray()

public static function fromArray(array $data): self

ImportSummary 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 $created
public int $updated
public int $cancelled
public int $unchanged
public array $errors

a source that could not be read, and why

public array $changes
public 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)
$errors

a source that could not be read, and why

ImportSummary::add()

public function add(self $other): self

ImportSummary::record()

public function record(Change $change): void

ImportSummary::isEmpty()

public function isEmpty(): bool

ImportSummary::missingIds()

public function missingIds(): array
Returns

the dates gone from their calendar, waiting for a word

ImportSummary::toArray()

public function toArray(): array

ParsedEvent 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 $uid
public readonly string $summary
public readonly \DateTimeImmutable $start
public readonly ?\DateTimeImmutable $end

For whole days: the last day (ICS's own DTEND is the day after).

public readonly bool $allDay
public readonly string $timezone
public readonly ?string $description
public readonly ?string $location
public readonly ?string $url
public readonly ?\DateTimeImmutable $lastModified
public readonly bool $cancelled
public readonly int $sequence
public readonly bool $recurring

It repeats (RRULE): only its first occurrence is read.

public readonly ?string $ensemble
public readonly ?string $conductor
public readonly ?string $role

A Role's value: "soloist", "chamber".

public readonly ?array $performers
public readonly ?array $programme
public readonly ?string $tickets
public readonly ?string $image

The date's own picture's address: its cover when it has none.

public readonly ?array $place

The hall as the source structures it, when it does: what a Venue is found or opened from instead of splitting location.

photo (an address) and photoCredit are 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): self

The 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): array

The 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): array

The 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(): int

EventRepository::findPast()

public function findPast(?int $limit = null, int $page = 1): array

A 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(): int

EventRepository::findOnePublished()

public function findOnePublished(string $slug): ?Event

EventRepository::findBetween()

public function findBetween(\DateTimeInterface $from, \DateTimeInterface $to): array

The 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): array

The 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): array

A 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): array

Every published date, the latest first: the sitemap's.

@return list<Event>

EventRepository::findByMonth()

public function findByMonth(int $year, int $month): array

The published dates of one month.

@return list<Event>

EventRepository::findBySourceUid()

public function findBySourceUid(string $uid): ?Event

The date read from that calendar entry, whatever its state: the importer's.

EventRepository::findUpcomingOfSource()

public function findUpcomingOfSource(string $source): array

The 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): ?Venue

The 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): ?Venue

The 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): ?Venue

The house a spelling was merged into ("Pärmu Concert Hall" into "Pärnu Concert Hall").

VenueRepository::merge()

public function merge(Venue $from, Venue $into): int

Two 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): array

DescriptionParser::role()

public static function role(string $text): string

A Role's value from the words typed: "soliste" → soloist, "Konzertmeister" → leader, anything else → other.

DescriptionParser::fold()

public static function fold(string $text): string

Lower case, no accent, one kind of apostrophe, one space: what a key is compared as.

DescriptionParser::isPart()

public static function isPart(string $text): bool

Whether a few words only say what one plays or does: "Conductor", "Piano & direction".

DescriptionParser::text()

public static function text(string $description): string

The 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): array

The 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): ?array

Feed::cover()

public function cover(Event $event): ?string

The 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): ?string

The picture a date shows, for whoever reads it from elsewhere: its cover, else its house's photo.

Feed::photo()

public function photo(Venue $venue): ?string

A 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): ?string

A 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): bool

Whether a decoded JSON is one of our feeds.

FeedParser::next()

public static function next(array $data): ?string

The feed's next page, absolute already; null on the last one.

FeedParser::parse()

public function parse(array|string $json): array

Ics 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): string

Ics::event()

public function event(Event $event): string

One date as a VEVENT block, to put in a VCALENDAR.

Ics::google()

public function google(Event $event): string

The "add to Google Calendar" link: the organiser's page in its details, as before.

Ics::uid()

public function uid(Event $event): string

What identifies the date in every calendar it lands in: the entry it was read from, else ours.

Ics::entry()

public function entry(Event $event): ?CalendarEntry

Ics::escape()

public static function escape(string $text): string

Ics::fold()

public static function fold(string $line): string

IcsImporter 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(): array

Every 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(): bool

IcsImporter::getAddress()

public function getAddress(): ?string

The address typed in the back office (comma-separated when several), or null.

IcsImporter::setAddress()

public function setAddress(?string $address): void

IcsImporter::remember()

public function remember(ImportSummary $summary, ?\DateTimeInterface $at = null): void

What 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(): ?array

IcsImporter::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): int

The 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): ImportSummary

Every 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): ImportSummary

One 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): array

The 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): ParsedEvent

An 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): string

What 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): string

What 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): string

A 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): array

IcsParser::unfold()

public static function unfold(string $ics): array

The 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): string

A 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(): string

The 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): array

Months 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): array

SquarespaceParser 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): bool

Whether a decoded JSON is a Squarespace events collection.

SquarespaceParser::jsonUrl()

public static function jsonUrl(string $url): string

The JSON address of an events page: "?format=json" added when missing.

SquarespaceParser::nextPage()

public static function nextPage(array $data, string $address): ?string

The 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): array

The upcoming dates and the past ones of a page.

SquarespaceParser::body()

public static function body(string $html): array

An 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): \DateTimeImmutable

A 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(): array

AgendaExtension::getFilters()

public function getFilters(): array