141 lines
5.1 KiB
PHP
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);
|
|
}
|
|
}
|