Initial release
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
<?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) {
|
||||
$this->eventRepository->duplicate($eventId);
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user