getUser(); if (!$user instanceof FrontendUser) { $template->set('upcomingEvents', []); $template->set('pastEvents', []); $template->set('isEditor', false); return $template->getResponse(); } $isEditor = $this->isEditor($user); $editPage = null; if ((int) ($model->editPage ?? 0) > 0) { $editPage = $this->getContaoAdapter(PageModel::class)->findById((int) $model->editPage); } $currentPage = $this->getPageModel(); $backUrl = $currentPage instanceof PageModel ? $this->generateContentUrl($currentPage) : '/'; if ($isEditor && 'POST' === $request->getMethod() && $request->request->has('action')) { $action = (string) $request->request->get('action', ''); $eventId = (int) $request->request->get('event_id', 0); if (!in_array($action, ['create', 'toggle_published', 'duplicate', 'delete'], true)) { return $template->getResponse(); } if ('create' === $action && $editPage instanceof PageModel) { return new RedirectResponse($this->generateContentUrl($editPage, [ 'create' => '1', 'ref' => base64_encode($backUrl), ])); } if ($eventId > 0 && $this->eventRepository->memberHasEvent((int) $user->id, $eventId)) { if ('toggle_published' === $action) { $this->eventRepository->togglePublished($eventId); } elseif ('duplicate' === $action) { $newEventId = $this->eventRepository->duplicate($eventId); if ($newEventId > 0 && $editPage instanceof PageModel) { return new RedirectResponse($this->generateContentUrl($editPage, [ 'event' => (string) $newEventId, 'ref' => base64_encode($backUrl), ])); } } elseif ('delete' === $action) { $this->eventRepository->delete($eventId); } } return new RedirectResponse($request->getUri()); } $events = $this->eventRepository->findByMemberId((int) $user->id); $upcomingItems = []; $pastItems = []; $today = strtotime('today'); foreach ($events as $event) { $editUrl = null; if ($isEditor && $editPage instanceof PageModel) { $editUrl = $this->generateContentUrl($editPage, [ 'event' => (string) $event['id'], 'ref' => base64_encode($backUrl), ]); } $item = [ 'id' => (int) $event['id'], 'title' => (string) ($event['title'] ?? ''), 'startDate' => (int) ($event['startDate'] ?? 0), 'published' => '1' === (string) ($event['published'] ?? ''), 'editUrl' => $editUrl, ]; if ((int) $item['startDate'] >= $today) { $upcomingItems[] = $item; } else { $pastItems[] = $item; } } usort( $upcomingItems, static fn (array $a, array $b): int => ((int) $b['startDate']) <=> ((int) $a['startDate']), ); usort( $pastItems, static fn (array $a, array $b): int => ((int) $b['startDate']) <=> ((int) $a['startDate']), ); $template->set('upcomingEvents', $upcomingItems); $template->set('pastEvents', $pastItems); $template->set('isEditor', $isEditor); $template->set('canCreateEvent', $isEditor && $editPage instanceof PageModel); $template->set('requestToken', $this->container->get('contao.csrf.token_manager')->getDefaultTokenValue()); return $template->getResponse(); } private function isEditor(FrontendUser $user): bool { $groups = is_array($user->groups) ? $user->groups : StringUtil::deserialize($user->groups, true); return in_array(1, array_map('intval', $groups), true); } }