Files
eventmanager-bundle/src/Controller/Frontend/MemberEventsController.php
T

141 lines
5.1 KiB
PHP

<?php
declare(strict_types=1);
namespace MummertMedia\EventManagerBundle\Controller\Frontend;
use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
use Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
use Contao\CoreBundle\Twig\FragmentTemplate;
use Contao\FrontendUser;
use Contao\ModuleModel;
use Contao\PageModel;
use Contao\StringUtil;
use MummertMedia\EventManagerBundle\Service\EventRepository;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
#[AsFrontendModule(type: 'member_events', category: 'eventmanager', template: 'frontend/member_events')]
class MemberEventsController extends AbstractFrontendModuleController
{
public function __construct(
private readonly EventRepository $eventRepository,
) {
}
protected function getResponse(FragmentTemplate $template, ModuleModel $model, Request $request): Response
{
$user = $this->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);
}
}