diff --git a/contao/dca/tl_calendar_events.php b/contao/dca/tl_calendar_events.php index 222d224..29fba6a 100644 --- a/contao/dca/tl_calendar_events.php +++ b/contao/dca/tl_calendar_events.php @@ -6,6 +6,7 @@ use Contao\CoreBundle\DataContainer\PaletteManipulator; use Contao\DataContainer; use Contao\Database; use Contao\StringUtil; +use Contao\System; unset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['location']); unset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['address']); @@ -30,7 +31,7 @@ $GLOBALS['TL_DCA']['tl_calendar_events']['config']['onload_callback'][] = static ->applyToPalette((string) $paletteName, 'tl_calendar_events'); PaletteManipulator::create() - ->addField(['source', 'url', 'target'], 'details_legend', PaletteManipulator::POSITION_APPEND) + ->addField(['source', 'url'], 'details_legend', PaletteManipulator::POSITION_APPEND) ->addField(['termsAccepted', 'isSoldOut', 'isCanceled'], 'publish_legend', PaletteManipulator::POSITION_APPEND) ->applyToPalette((string) $paletteName, 'tl_calendar_events'); } @@ -169,6 +170,20 @@ $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['termsAccepted'] = [ if (isset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['source']) && is_array($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['source'])) { $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['source']['eval'] ??= []; $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['source']['eval']['tl_class'] = 'w50'; + + // Keine Weiterleitung auf externe Seiten: Events öffnen immer die Detailseite, + // die externe URL (Feld "url") wird dort als Button ausgegeben. + $originalSourceOptionsCallback = $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['source']['options_callback'] ?? null; + + if (null !== $originalSourceOptionsCallback) { + $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['source']['options_callback'] = static function (DataContainer $dc) use ($originalSourceOptionsCallback): array { + $options = \is_array($originalSourceOptionsCallback) + ? System::importStatic($originalSourceOptionsCallback[0])->{$originalSourceOptionsCallback[1]}($dc) + : $originalSourceOptionsCallback($dc); + + return array_values(array_diff((array) $options, ['external'])); + }; + } } if (isset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['target']) && is_array($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['target'])) { @@ -179,6 +194,7 @@ if (isset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['target']) && is_ar if (isset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url']) && is_array($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url'])) { $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url']['eval'] ??= []; $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url']['eval']['tl_class'] = 'clr'; + $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url']['label'] = &$GLOBALS['TL_LANG']['tl_calendar_events']['url']; $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url']['eval']['mandatory'] = false; unset($GLOBALS['TL_DCA']['tl_calendar_events']['fields']['url']['eval']['rgxp']); } diff --git a/contao/languages/de/tl_calendar_events.php b/contao/languages/de/tl_calendar_events.php index d92ab52..5ef83c5 100644 --- a/contao/languages/de/tl_calendar_events.php +++ b/contao/languages/de/tl_calendar_events.php @@ -10,3 +10,4 @@ $GLOBALS['TL_LANG']['tl_calendar_events']['photographer'] = ['Urheber/Fotograf', $GLOBALS['TL_LANG']['tl_calendar_events']['isSoldOut'] = ['Ausverkauft', 'Diese Veranstaltung ist ausverkauft.']; $GLOBALS['TL_LANG']['tl_calendar_events']['isCanceled'] = ['Abgesagt', 'Diese Veranstaltung wurde abgesagt.']; $GLOBALS['TL_LANG']['tl_calendar_events']['termsAccepted'] = ['Nutzungsbedingungen akzeptiert', 'Die Nutzungsbedingungen wurden akzeptiert.']; +$GLOBALS['TL_LANG']['tl_calendar_events']['url'] = ['Externer Link', 'Weiterführende Seite zur Veranstaltung (z. B. Website des Veranstalters). Wird auf der Detailseite als Button ausgegeben; Listen verlinken immer auf die Detailseite.']; diff --git a/contao/languages/en/tl_calendar_events.php b/contao/languages/en/tl_calendar_events.php index 61f0a11..9073260 100644 --- a/contao/languages/en/tl_calendar_events.php +++ b/contao/languages/en/tl_calendar_events.php @@ -10,3 +10,4 @@ $GLOBALS['TL_LANG']['tl_calendar_events']['photographer'] = ['Author/Photographe $GLOBALS['TL_LANG']['tl_calendar_events']['isSoldOut'] = ['Sold out', 'This event is sold out.']; $GLOBALS['TL_LANG']['tl_calendar_events']['isCanceled'] = ['Canceled', 'This event has been canceled.']; $GLOBALS['TL_LANG']['tl_calendar_events']['termsAccepted'] = ['Terms accepted', 'The terms of use have been accepted.']; +$GLOBALS['TL_LANG']['tl_calendar_events']['url'] = ['External link', 'Further page about the event (e.g. organiser website). Shown as a button on the event detail page; lists always link to the detail page.']; diff --git a/src/Migration/ExternalEventSourceMigration.php b/src/Migration/ExternalEventSourceMigration.php new file mode 100644 index 0000000..851080c --- /dev/null +++ b/src/Migration/ExternalEventSourceMigration.php @@ -0,0 +1,49 @@ +connection->createSchemaManager(); + + if (!$schemaManager->tablesExist(['tl_calendar_events'])) { + return false; + } + + return (int) $this->connection->fetchOne( + "SELECT COUNT(*) FROM tl_calendar_events WHERE source = 'external'", + ) > 0; + } + + public function run(): MigrationResult + { + $count = $this->connection->executeStatement( + "UPDATE tl_calendar_events SET source = 'default' WHERE source = 'external'", + ); + + return $this->createResult(true, sprintf('%d Events von externer Weiterleitung auf Detailseite umgestellt.', $count)); + } +} diff --git a/src/Service/EventRepository.php b/src/Service/EventRepository.php index 45d8f30..90f8abf 100644 --- a/src/Service/EventRepository.php +++ b/src/Service/EventRepository.php @@ -651,7 +651,8 @@ class EventRepository 'teaser' => $data['teaser'] ?? null, 'description' => $data['description'] ?? null, 'url' => $url, - 'source' => '' !== $url ? 'external' : 'default', + // Externe URL wird nur als Link-Button auf der Detailseite ausgegeben, Listen verlinken immer auf die Detailseite + 'source' => 'default', 'photographer' => $data['photographer'] ?? '', 'addImage' => !empty($data['addImage']) ? 1 : 0, 'termsAccepted' => !empty($data['termsAccepted']) ? '1' : '',