Map: pitch option, marker ordering and event popup improvements
This commit is contained in:
@@ -47,6 +47,7 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
$initialDisplay = (string) ($model->mapInitialDisplay ?? self::DEFAULT_INITIAL_DISPLAY);
|
||||
$initialOrganizationTagId = (int) ($model->mapInitialOrganizationTagId ?? 0);
|
||||
$centerMode = (string) ($model->mapCenterMode ?? self::DEFAULT_CENTER_MODE);
|
||||
$mapPitch = $this->normalizePitch($model->mapPitch ?? 0);
|
||||
$eventColor = $this->normalizeHexColor((string) ($model->mapEventColor ?? self::DEFAULT_EVENT_COLOR));
|
||||
$organizationColor = $this->normalizeHexColor((string) ($model->mapOrganizationColor ?? $eventColor), $eventColor);
|
||||
|
||||
@@ -77,6 +78,7 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
$template->set('mapCenterLat', trim((string) ($model->mapCenterLat ?? '')));
|
||||
$template->set('mapCenterLng', trim((string) ($model->mapCenterLng ?? '')));
|
||||
$template->set('mapCenterZoom', (int) ($model->mapCenterZoom ?? 12));
|
||||
$template->set('mapPitch', $mapPitch);
|
||||
$template->set('mapItemsJson', json_encode(
|
||||
$this->mapModuleDataProvider->getMapItems($showOrganizations, $showEvents, $showExternalOrganizations, $selectedOrganizationTagIds),
|
||||
\JSON_HEX_TAG | \JSON_HEX_AMP | \JSON_HEX_APOS | \JSON_HEX_QUOT | \JSON_UNESCAPED_UNICODE | \JSON_THROW_ON_ERROR,
|
||||
@@ -118,4 +120,23 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
|
||||
return $fallback;
|
||||
}
|
||||
|
||||
private function normalizePitch(mixed $value): int
|
||||
{
|
||||
if (!is_scalar($value)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$parsedPitch = (int) round((float) str_replace(',', '.', (string) $value));
|
||||
|
||||
if ($parsedPitch < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($parsedPitch > 85) {
|
||||
return 85;
|
||||
}
|
||||
|
||||
return $parsedPitch;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,15 @@ declare(strict_types=1);
|
||||
|
||||
namespace MummertMedia\EventManagerBundle\Service;
|
||||
|
||||
use Contao\Config;
|
||||
use Contao\Date;
|
||||
use Contao\CalendarEventsModel;
|
||||
use Contao\CoreBundle\Framework\ContaoFramework;
|
||||
use Contao\CoreBundle\Routing\ContentUrlGenerator;
|
||||
use Doctrine\DBAL\ArrayParameterType;
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Doctrine\DBAL\ParameterType;
|
||||
use Doctrine\DBAL\Query\QueryBuilder;
|
||||
use Symfony\Component\Routing\Exception\ExceptionInterface;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
|
||||
class MapModuleDataProvider
|
||||
{
|
||||
@@ -20,6 +23,8 @@ class MapModuleDataProvider
|
||||
|
||||
public function __construct(
|
||||
private readonly Connection $connection,
|
||||
private readonly ContaoFramework $framework,
|
||||
private readonly ContentUrlGenerator $urlGenerator,
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -126,7 +131,12 @@ class MapModuleDataProvider
|
||||
'longitude' => $coords['longitude'],
|
||||
'extra' => [
|
||||
'locationTitle' => trim((string) ($row['location_title'] ?? '')),
|
||||
'startDate' => $this->formatStartDate((int) ($row['startDate'] ?? 0)),
|
||||
'startDate' => $this->formatStartDateTime(
|
||||
(int) ($row['startDate'] ?? 0),
|
||||
(string) ($row['addTime'] ?? ''),
|
||||
(int) ($row['startTime'] ?? 0),
|
||||
),
|
||||
'detailUrl' => $this->resolveEventDetailUrl($id),
|
||||
],
|
||||
];
|
||||
}
|
||||
@@ -351,6 +361,8 @@ class MapModuleDataProvider
|
||||
'e.id AS event_id',
|
||||
'e.title AS event_title',
|
||||
'e.startDate',
|
||||
'e.addTime',
|
||||
'e.startTime',
|
||||
'l.title AS location_title',
|
||||
sprintf('l.%s AS latitude', $locationGeoColumns['latitude']),
|
||||
sprintf('l.%s AS longitude', $locationGeoColumns['longitude'])
|
||||
@@ -429,15 +441,40 @@ class MapModuleDataProvider
|
||||
];
|
||||
}
|
||||
|
||||
private function formatStartDate(int $timestamp): string
|
||||
private function formatStartDateTime(int $startDate, string $addTime, int $startTime): string
|
||||
{
|
||||
if ($timestamp <= 0) {
|
||||
if ($startDate <= 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$format = (string) Config::get('dateFormat');
|
||||
$formattedDate = date('d.m.Y', $startDate);
|
||||
|
||||
return Date::parse('' !== $format ? $format : 'd.m.Y', $timestamp);
|
||||
if ('1' !== $addTime || $startTime <= 0) {
|
||||
return $formattedDate;
|
||||
}
|
||||
|
||||
return sprintf('%s %s Uhr', $formattedDate, date('H:i', $startTime));
|
||||
}
|
||||
|
||||
private function resolveEventDetailUrl(int $eventId): string
|
||||
{
|
||||
if ($eventId <= 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$eventModel = $this->framework
|
||||
->getAdapter(CalendarEventsModel::class)
|
||||
->findById($eventId);
|
||||
|
||||
if (null === $eventModel) {
|
||||
return '';
|
||||
}
|
||||
|
||||
try {
|
||||
return (string) $this->urlGenerator->generate($eventModel, [], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
} catch (ExceptionInterface) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user