Refactor event full data provider for Twig layout

This commit is contained in:
Jürgen Mummert
2026-02-22 10:36:15 +01:00
parent d1258ff5f1
commit ba10d1c403
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace MummertMedia\EventManagerBundle\EventListener;
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\StringUtil;
use Contao\Template;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\ParameterType;
@@ -34,13 +35,29 @@ class EventFullTemplateDataListener
$locationId = isset($data['location_id']) ? (int) $data['location_id'] : 0;
$template->location_fields = $this->fetchLocationFields($locationId);
$template->organization_fields = $this->fetchOrganizationFields($eventId);
$template->tag_fields = $this->fetchTagFields($eventId);
$locationRow = $this->fetchLocationRow($locationId);
$organizations = $this->fetchOrganizations($eventId);
$tags = $this->fetchTags($eventId);
$template->location_row = $locationRow;
$template->organizations = $organizations;
$template->tags = $tags;
$template->has_tag_21 = \in_array(21, array_map(static fn (array $tag): int => (int) ($tag['id'] ?? 0), $tags), true);
if ($locationRow && '' !== ($locationRow['lng'] ?? '') && '' !== ($locationRow['lat'] ?? '') && 58 !== (int) ($locationRow['id'] ?? 0)) {
$this->registerMapAssets();
$template->show_location_map = true;
} else {
$template->show_location_map = false;
}
$template->location_fields = $this->toFlatLocationFields($locationRow);
$template->organization_fields = $this->toFlatOrganizationFields($organizations);
$template->tag_fields = $this->toFlatTagFields($tags);
}
/** @return array<string, string> */
private function fetchLocationFields(int $locationId): array
private function fetchLocationRow(int $locationId): array
{
if ($locationId <= 0) {
return [];
@@ -59,17 +76,21 @@ class EventFullTemplateDataListener
return [];
}
$fields = [];
$normalized = [];
foreach ($row as $column => $value) {
$fields['location_'.$column] = $this->toString($value);
$normalized[$column] = $this->toString($value);
}
return $fields;
if ('' !== ($normalized['image'] ?? '')) {
$normalized['image_uuid'] = $this->normalizeUuid($normalized['image']);
}
/** @return array<string, string> */
private function fetchOrganizationFields(int $eventId): array
return $normalized;
}
/** @return list<array<string, string>> */
private function fetchOrganizations(int $eventId): array
{
$rows = $this->connection->createQueryBuilder()
->select('o.*')
@@ -81,22 +102,27 @@ class EventFullTemplateDataListener
->executeQuery()
->fetchAllAssociative();
$fields = [];
$index = 1;
$organizations = [];
foreach ($rows as $row) {
$normalized = [];
foreach ($row as $column => $value) {
$fields['organization'.$index.'_'.$column] = $this->toString($value);
$normalized[$column] = $this->toString($value);
}
++$index;
if ('' !== ($normalized['logo'] ?? '')) {
$normalized['logo_uuid'] = $this->normalizeUuid($normalized['logo']);
}
return $fields;
$organizations[] = $normalized;
}
/** @return array<string, string> */
private function fetchTagFields(int $eventId): array
return $organizations;
}
/** @return list<array<string, string>> */
private function fetchTags(int $eventId): array
{
$rows = $this->connection->createQueryBuilder()
->select('t.*')
@@ -112,8 +138,7 @@ class EventFullTemplateDataListener
->executeQuery()
->fetchAllAssociative();
$fields = [];
$index = 1;
$tags = [];
foreach ($rows as $row) {
$title = '';
@@ -124,13 +149,103 @@ class EventFullTemplateDataListener
$title = (string) $row['tag'];
}
$fields['tag'.$index.'_title'] = $title;
$tags[] = [
'id' => (string) ((int) ($row['id'] ?? 0)),
'title' => $title,
'tag' => (string) ($row['tag'] ?? ''),
];
}
return $tags;
}
/** @param array<string, string> $locationRow
* @return array<string, string>
*/
private function toFlatLocationFields(array $locationRow): array
{
$fields = [];
foreach ($locationRow as $column => $value) {
$fields['location_'.$column] = $value;
}
return $fields;
}
/** @param list<array<string, string>> $organizations
* @return array<string, string>
*/
private function toFlatOrganizationFields(array $organizations): array
{
$fields = [];
$index = 1;
foreach ($organizations as $organization) {
foreach ($organization as $column => $value) {
$fields['organization'.$index.'_'.$column] = $value;
}
++$index;
}
return $fields;
}
/** @param list<array<string, string>> $tags
* @return array<string, string>
*/
private function toFlatTagFields(array $tags): array
{
$fields = [];
$index = 1;
foreach ($tags as $tag) {
$fields['tag'.$index.'_title'] = (string) ($tag['title'] ?? '');
++$index;
}
return $fields;
}
private function normalizeUuid(string $value): string
{
$trimmed = trim($value);
if (preg_match('/^[0-9a-fA-F-]{36}$/', $trimmed)) {
return strtolower($trimmed);
}
if (16 === strlen($trimmed)) {
return StringUtil::binToUuid($trimmed);
}
return $trimmed;
}
private function registerMapAssets(): void
{
$GLOBALS['TL_JAVASCRIPT'] ??= [];
$GLOBALS['TL_CSS'] ??= [];
$jsAssets = [
'https://maps.mummert.media/libraries/maplibre-gl.js',
'https://maps.mummert.media/libraries/pmtiles.js',
];
foreach ($jsAssets as $asset) {
if (!\in_array($asset, $GLOBALS['TL_JAVASCRIPT'], true)) {
$GLOBALS['TL_JAVASCRIPT'][] = $asset;
}
}
$cssAsset = 'https://maps.mummert.media/libraries/maplibre-gl.css';
if (!\in_array($cssAsset, $GLOBALS['TL_CSS'], true)) {
$GLOBALS['TL_CSS'][] = $cssAsset;
}
}
private function toString(mixed $value): string
{
if (null === $value) {