cal_calendar, true)); $event = $this->events->resolveFromRequest($request, $calendarIds); if (null === $event || (!$event->published && !$request->attributes->get('_preview', false))) { throw new PageNotFoundException('Event not found: '.($request->attributes->get('auto_item') ?? '')); } $calendar = $this->calendars->find($event->calendarId); if (null === $calendar) { throw new PageNotFoundException('Calendar not found for event ID '.$event->id); } $availability = $this->availability->check($event, $calendar); $rules = $this->rules->rulesFor($event, $calendar); $context = new BookingContext($event, $calendar, $rules, $availability); $context->attachTo($request); $formHtml = ''; if ($availability->isBookable()) { // Die Hooks des Formulargenerators greifen über den BookingContext auf die Veranstaltung zu $formHtml = $this->getContaoAdapter(Controller::class)->getForm($calendar->bookingForm); } $template->set('event', $event); $template->set('calendar', $calendar); $template->set('availability', $availability); $template->set('form_html', $formHtml); $template->set('places_left', $availability->placesLeft); $template->set('deadline', $availability->displayDeadline); $template->set('categories', $this->categories->findByIds($event->categories)); $template->set('rules_config', json_encode([ 'hidden' => $rules->hiddenFields, 'dependencies' => $rules->dependencies, ], JSON_THROW_ON_ERROR)); $this->tagResponse(['contao.db.tl_calendar_events.'.$event->id, 'contao.db.tl_wk_booking']); $response = $template->getResponse(); $response->setPrivate(); $response->headers->addCacheControlDirective('no-store'); return $response; } }