Map: organization popup links and backend page selector
This commit is contained in:
@@ -8,6 +8,7 @@ use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController
|
||||
use Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
|
||||
use Contao\CoreBundle\Twig\FragmentTemplate;
|
||||
use Contao\ModuleModel;
|
||||
use Contao\PageModel;
|
||||
use Contao\StringUtil;
|
||||
use MummertMedia\EventManagerBundle\Service\MapModuleDataProvider;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
@@ -52,6 +53,8 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
$selectedOrganizationTagIds = [] === $selectedOrganizationTagIds
|
||||
? []
|
||||
: array_values(array_intersect($selectedOrganizationTagIds, $availableOrganizationTagIds));
|
||||
$organizationListPageId = (int) ($model->mapOrganizationListPage ?? 0);
|
||||
$organizationListBaseUrl = $this->buildOrganizationListBaseUrl($organizationListPageId, $request);
|
||||
$initialDisplay = (string) ($model->mapInitialDisplay ?? self::DEFAULT_INITIAL_DISPLAY);
|
||||
$initialOrganizationTagId = (int) ($model->mapInitialOrganizationTagId ?? 0);
|
||||
$centerMode = (string) ($model->mapCenterMode ?? self::DEFAULT_CENTER_MODE);
|
||||
@@ -88,7 +91,7 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
$template->set('mapCenterZoom', (int) ($model->mapCenterZoom ?? 12));
|
||||
$template->set('mapPitch', $mapPitch);
|
||||
$template->set('mapItemsJson', json_encode(
|
||||
$this->mapModuleDataProvider->getMapItems($showOrganizations, $showEvents, $showExternalOrganizations, $selectedOrganizationTagIds),
|
||||
$this->mapModuleDataProvider->getMapItems($showOrganizations, $showEvents, $showExternalOrganizations, $selectedOrganizationTagIds, $organizationListBaseUrl),
|
||||
\JSON_HEX_TAG | \JSON_HEX_AMP | \JSON_HEX_APOS | \JSON_HEX_QUOT | \JSON_UNESCAPED_UNICODE | \JSON_THROW_ON_ERROR,
|
||||
));
|
||||
$template->set('mapOrganizationTags', $this->mapModuleDataProvider->getOrganizationTags($selectedOrganizationTagIds));
|
||||
@@ -147,4 +150,29 @@ class EventMapController extends AbstractFrontendModuleController
|
||||
|
||||
return $parsedPitch;
|
||||
}
|
||||
|
||||
private function buildOrganizationListBaseUrl(int $pageId, Request $request): string
|
||||
{
|
||||
if ($pageId <= 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$pageModel = PageModel::findById($pageId);
|
||||
|
||||
if (null === $pageModel) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$frontendUrl = trim((string) $pageModel->getFrontendUrl());
|
||||
|
||||
if ('' === $frontendUrl) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (preg_match('#^https?://#i', $frontendUrl)) {
|
||||
return $frontendUrl;
|
||||
}
|
||||
|
||||
return rtrim($request->getSchemeAndHttpHost(), '/').'/'.ltrim($frontendUrl, '/');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class MapModuleDataProvider
|
||||
/**
|
||||
* @return list<array{type:string,markerType:string,id:int,title:string,latitude:float,longitude:float,extra:array<string,mixed>}>
|
||||
*/
|
||||
public function getMapItems(bool $includeOrganizations = true, bool $includeEvents = true, bool $includeExternalOrganizations = false, array $selectedOrganizationTagIds = []): array
|
||||
public function getMapItems(bool $includeOrganizations = true, bool $includeEvents = true, bool $includeExternalOrganizations = false, array $selectedOrganizationTagIds = [], string $organizationListBaseUrl = ''): array
|
||||
{
|
||||
if (!$includeOrganizations && !$includeEvents) {
|
||||
return [];
|
||||
@@ -102,6 +102,7 @@ class MapModuleDataProvider
|
||||
'extra' => [
|
||||
'organizationTagIds' => $tagData['ids'],
|
||||
'organizationTagLabels' => $tagData['labels'],
|
||||
'detailUrl' => $this->buildOrganizationDetailUrl($organizationListBaseUrl, $id),
|
||||
],
|
||||
];
|
||||
}
|
||||
@@ -498,6 +499,19 @@ class MapModuleDataProvider
|
||||
}
|
||||
}
|
||||
|
||||
private function buildOrganizationDetailUrl(string $baseUrl, int $organizationId): string
|
||||
{
|
||||
$normalizedBaseUrl = trim($baseUrl);
|
||||
|
||||
if ('' === $normalizedBaseUrl || $organizationId <= 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$separator = str_contains($normalizedBaseUrl, '?') ? '&' : '?';
|
||||
|
||||
return sprintf('%s%sshow=%d', $normalizedBaseUrl, $separator, $organizationId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param list<string> $candidates
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user