diff --git a/src/EventListener/EventFullTemplateDataListener.php b/src/EventListener/EventFullTemplateDataListener.php new file mode 100644 index 0000000..7b7a6ef --- /dev/null +++ b/src/EventListener/EventFullTemplateDataListener.php @@ -0,0 +1,150 @@ +getName(); + + if (!str_starts_with($templateName, 'event_full')) { + return; + } + + $data = $template->getData(); + $eventId = (int) ($data['id'] ?? 0); + + if ($eventId <= 0) { + return; + } + + $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); + } + + /** @return array */ + private function fetchLocationFields(int $locationId): array + { + if ($locationId <= 0) { + return []; + } + + $row = $this->connection->createQueryBuilder() + ->select('*') + ->from('tl_location') + ->where('id = :id') + ->setParameter('id', $locationId, ParameterType::INTEGER) + ->setMaxResults(1) + ->executeQuery() + ->fetchAssociative(); + + if (false === $row || null === $row) { + return []; + } + + $fields = []; + + foreach ($row as $column => $value) { + $fields['location_'.$column] = $this->toString($value); + } + + return $fields; + } + + /** @return array */ + private function fetchOrganizationFields(int $eventId): array + { + $rows = $this->connection->createQueryBuilder() + ->select('o.*') + ->from('tl_calendar_events_organization', 'ceo') + ->innerJoin('ceo', 'tl_organization', 'o', 'o.id = ceo.organization_id') + ->where('ceo.event_id = :eventId') + ->setParameter('eventId', $eventId, ParameterType::INTEGER) + ->orderBy('ceo.organization_id', 'ASC') + ->executeQuery() + ->fetchAllAssociative(); + + $fields = []; + $index = 1; + + foreach ($rows as $row) { + foreach ($row as $column => $value) { + $fields['organization'.$index.'_'.$column] = $this->toString($value); + } + + ++$index; + } + + return $fields; + } + + /** @return array */ + private function fetchTagFields(int $eventId): array + { + $rows = $this->connection->createQueryBuilder() + ->select('t.*') + ->from('tl_tags_rel', 'r') + ->innerJoin('r', 'tl_tags', 't', 't.id = r.tag_id') + ->where('r.ptable = :ptable') + ->andWhere('r.field = :field') + ->andWhere('r.pid = :pid') + ->setParameter('ptable', 'tl_calendar_events') + ->setParameter('field', 'tags') + ->setParameter('pid', $eventId, ParameterType::INTEGER) + ->orderBy('r.tag_id', 'ASC') + ->executeQuery() + ->fetchAllAssociative(); + + $fields = []; + $index = 1; + + foreach ($rows as $row) { + $title = ''; + + if (isset($row['title']) && '' !== (string) $row['title']) { + $title = (string) $row['title']; + } elseif (isset($row['tag'])) { + $title = (string) $row['tag']; + } + + $fields['tag'.$index.'_title'] = $title; + ++$index; + } + + return $fields; + } + + private function toString(mixed $value): string + { + if (null === $value) { + return ''; + } + + if (\is_bool($value)) { + return $value ? '1' : '0'; + } + + if (\is_scalar($value)) { + return (string) $value; + } + + return json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?: ''; + } +}