Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b328b36e14 | |||
| 717d243cec | |||
| 181445e1e3 | |||
| 43579dd44b |
@@ -148,8 +148,8 @@ $GLOBALS['TL_DCA']['tl_location'] = [
|
|||||||
'label' => &$GLOBALS['TL_LANG']['tl_location']['lat'],
|
'label' => &$GLOBALS['TL_LANG']['tl_location']['lat'],
|
||||||
'exclude' => true,
|
'exclude' => true,
|
||||||
'inputType' => 'text',
|
'inputType' => 'text',
|
||||||
'eval' => ['maxlength' => 10, 'tl_class' => 'w50'],
|
'eval' => ['maxlength' => 11, 'tl_class' => 'w50'],
|
||||||
'sql' => ['type' => 'decimal', 'precision' => 10, 'scale' => 8, 'default' => '0.00000000'],
|
'sql' => ['type' => 'decimal', 'precision' => 11, 'scale' => 8, 'default' => '0.00000000'],
|
||||||
],
|
],
|
||||||
'lng' => [
|
'lng' => [
|
||||||
'label' => &$GLOBALS['TL_LANG']['tl_location']['lng'],
|
'label' => &$GLOBALS['TL_LANG']['tl_location']['lng'],
|
||||||
|
|||||||
@@ -178,8 +178,8 @@ $GLOBALS['TL_DCA']['tl_organization'] = [
|
|||||||
'label' => &$GLOBALS['TL_LANG']['tl_organization']['lat'],
|
'label' => &$GLOBALS['TL_LANG']['tl_organization']['lat'],
|
||||||
'exclude' => true,
|
'exclude' => true,
|
||||||
'inputType' => 'text',
|
'inputType' => 'text',
|
||||||
'eval' => ['maxlength' => 10, 'tl_class' => 'w50'],
|
'eval' => ['maxlength' => 11, 'tl_class' => 'w50'],
|
||||||
'sql' => ['type' => 'decimal', 'precision' => 10, 'scale' => 8, 'default' => '0.00000000'],
|
'sql' => ['type' => 'decimal', 'precision' => 11, 'scale' => 8, 'default' => '0.00000000'],
|
||||||
],
|
],
|
||||||
'lng' => [
|
'lng' => [
|
||||||
'label' => &$GLOBALS['TL_LANG']['tl_organization']['lng'],
|
'label' => &$GLOBALS['TL_LANG']['tl_organization']['lng'],
|
||||||
|
|||||||
@@ -0,0 +1,186 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace MummertMedia\EventManagerBundle\EventListener;
|
||||||
|
|
||||||
|
use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
|
||||||
|
use Contao\Module;
|
||||||
|
use Doctrine\DBAL\ArrayParameterType;
|
||||||
|
use Doctrine\DBAL\Connection;
|
||||||
|
use Doctrine\DBAL\Exception;
|
||||||
|
use Doctrine\DBAL\ParameterType;
|
||||||
|
|
||||||
|
#[AsHook('getAllEvents', method: 'onGetAllEvents', priority: -512)]
|
||||||
|
class EventTeaserDataAttributesListener
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly Connection $connection,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onGetAllEvents(array $events, array $calendars, int $start, int $end, Module $module): array
|
||||||
|
{
|
||||||
|
$eventIds = $this->collectEventIds($events);
|
||||||
|
$tagMap = $this->fetchTagMap($eventIds);
|
||||||
|
$organizationMap = $this->fetchOrganizationMap($eventIds);
|
||||||
|
$locationMap = $this->fetchLocationMap($eventIds);
|
||||||
|
|
||||||
|
foreach ($events as $dayKey => $eventsPerDay) {
|
||||||
|
foreach ($eventsPerDay as $timeKey => $eventsPerTime) {
|
||||||
|
foreach ($eventsPerTime as $index => $event) {
|
||||||
|
if (!isset($event['id'])) {
|
||||||
|
$events[$dayKey][$timeKey][$index]['location_id'] = null;
|
||||||
|
$events[$dayKey][$timeKey][$index]['event_tags'] = '';
|
||||||
|
$events[$dayKey][$timeKey][$index]['event_org'] = '';
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$eventId = (int) $event['id'];
|
||||||
|
|
||||||
|
if (isset($event['location_id']) && '' !== (string) $event['location_id']) {
|
||||||
|
$events[$dayKey][$timeKey][$index]['location_id'] = (int) $event['location_id'];
|
||||||
|
} else {
|
||||||
|
$events[$dayKey][$timeKey][$index]['location_id'] = $locationMap[$eventId] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$events[$dayKey][$timeKey][$index]['event_tags'] = implode(',', $tagMap[$eventId] ?? []);
|
||||||
|
$events[$dayKey][$timeKey][$index]['event_org'] = implode(',', $organizationMap[$eventId] ?? []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $events;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return list<int> */
|
||||||
|
private function collectEventIds(array $events): array
|
||||||
|
{
|
||||||
|
$eventIds = [];
|
||||||
|
|
||||||
|
foreach ($events as $eventsPerDay) {
|
||||||
|
foreach ($eventsPerDay as $eventsPerTime) {
|
||||||
|
foreach ($eventsPerTime as $event) {
|
||||||
|
if (!isset($event['id'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$eventIds[] = (int) $event['id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values(array_unique(array_map('intval', $eventIds)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param list<int> $eventIds
|
||||||
|
* @return array<int, list<int>>
|
||||||
|
*/
|
||||||
|
private function fetchTagMap(array $eventIds): array
|
||||||
|
{
|
||||||
|
if ([] === $eventIds) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$rows = $this->connection->executeQuery(
|
||||||
|
'SELECT pid, tag_id FROM tl_tags_rel WHERE ptable = ? AND field = ? AND pid IN (?) ORDER BY pid ASC, tag_id ASC',
|
||||||
|
['tl_calendar_events', 'tags', $eventIds],
|
||||||
|
[ParameterType::STRING, ParameterType::STRING, ArrayParameterType::INTEGER],
|
||||||
|
)->fetchAllAssociative();
|
||||||
|
|
||||||
|
$map = [];
|
||||||
|
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$eventId = (int) ($row['pid'] ?? 0);
|
||||||
|
$tagId = (int) ($row['tag_id'] ?? 0);
|
||||||
|
|
||||||
|
if ($eventId <= 0 || $tagId <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$map[$eventId][] = $tagId;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($map as $eventId => $tagIds) {
|
||||||
|
$map[$eventId] = array_values(array_unique(array_map('intval', $tagIds)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param list<int> $eventIds
|
||||||
|
* @return array<int, list<int>>
|
||||||
|
*/
|
||||||
|
private function fetchOrganizationMap(array $eventIds): array
|
||||||
|
{
|
||||||
|
if ([] === $eventIds) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$tables = ['tl_events_organization', 'tl_calendar_events_organization'];
|
||||||
|
|
||||||
|
foreach ($tables as $table) {
|
||||||
|
try {
|
||||||
|
$rows = $this->connection->executeQuery(
|
||||||
|
sprintf('SELECT event_id, organization_id FROM %s WHERE event_id IN (?) ORDER BY event_id ASC, organization_id ASC', $table),
|
||||||
|
[$eventIds],
|
||||||
|
[ArrayParameterType::INTEGER],
|
||||||
|
)->fetchAllAssociative();
|
||||||
|
|
||||||
|
$map = [];
|
||||||
|
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$eventId = (int) ($row['event_id'] ?? 0);
|
||||||
|
$organizationId = (int) ($row['organization_id'] ?? 0);
|
||||||
|
|
||||||
|
if ($eventId <= 0 || $organizationId <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$map[$eventId][] = $organizationId;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($map as $eventId => $organizationIds) {
|
||||||
|
$map[$eventId] = array_values(array_unique(array_map('intval', $organizationIds)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
} catch (Exception) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param list<int> $eventIds
|
||||||
|
* @return array<int, int|null>
|
||||||
|
*/
|
||||||
|
private function fetchLocationMap(array $eventIds): array
|
||||||
|
{
|
||||||
|
if ([] === $eventIds) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$rows = $this->connection->executeQuery(
|
||||||
|
'SELECT id, location_id FROM tl_calendar_events WHERE id IN (?)',
|
||||||
|
[$eventIds],
|
||||||
|
[ArrayParameterType::INTEGER],
|
||||||
|
)->fetchAllAssociative();
|
||||||
|
|
||||||
|
$map = [];
|
||||||
|
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$eventId = (int) ($row['id'] ?? 0);
|
||||||
|
|
||||||
|
if ($eventId <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$map[$eventId] = null !== ($row['location_id'] ?? null) ? (int) $row['location_id'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user