feat: contact, text with image, YouTube/Vimeo video, disrupter and map elements on TYPO3 13

Restored from a46918d, TCA ported to TYPO3 13. Their markup matches
TYPO3 10 on every page that renders. Headers with the default layout
stay hidden, as on TYPO3 10.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
frommeandClaude Opus 5.5 committed 2026-10-24 12:05:01 +02:00
1 parent 49b96df21a
commit 2999abc16c
19 files changed
+746

No files matched your search

@@ -0,0 +1,46 @@
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
call_user_func(function() {
$frontendLanguageFilePrefix = 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:';
ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'label' => 'Ansprechpartner',
'value' => 'contact',
'icon' => 'content-image'
],
'teaser_booking_link',
'after'
);
$GLOBALS['TCA']['tt_content']['columns']['tx_eptheme_contact'] = [
'exclude' => 0,
'label' => 'Mitarbeiter',
'config' => [
'type' => 'select',
'default' => 0,
'renderType' => 'selectSingle',
'foreign_table' => 'tx_epproducts_domain_model_teammember',
'foreign_table_where' => 'ORDER BY name',
'minitems' => 1,
'maxitems' => 1,
]
];
$GLOBALS['TCA']['tt_content']['types']['contact'] = [
'showitem' => '
--palette--;' . $frontendLanguageFilePrefix . 'palette.general;general,
tx_eptheme_contact,
--div--;' . $frontendLanguageFilePrefix . 'tabs.access,
hidden;' . $frontendLanguageFilePrefix . 'field.default.hidden,
--div--;' . $frontendLanguageFilePrefix . 'tabs.extended
',
];
});
@@ -0,0 +1,55 @@
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
call_user_func(function() {
$frontendLanguageFilePrefix = 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:';
ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'label' => 'Störer (neu)',
'value' => 'disrupter',
'icon' => 'content-image'
],
'teaser_product',
'after'
);
$GLOBALS['TCA']['tt_content']['columns']['tx_eptheme_disrupter'] = [
'exclude' => 0,
'label' => 'Störer',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_eptheme_domain_model_disrupter',
'maxitems' => 1,
'minitems' => 1,
'foreign_table_where' => 'ORDER BY headline ASC',
'MM' => 'tx_eptheme_ttcontent_tx_eptheme_disrupter_mm',
],
];
$GLOBALS['TCA']['tt_content']['types']['disrupter'] = [
'showitem' => '
--palette--;' . $frontendLanguageFilePrefix . 'palette.general;general, tx_eptheme_disrupter,
--div--;' . $frontendLanguageFilePrefix . 'tabs.appearance,
layout;' . $frontendLanguageFilePrefix . 'layout_formlabel, tx_eptheme_background,
--div--;' . $frontendLanguageFilePrefix . 'tabs.access,
hidden;' . $frontendLanguageFilePrefix . 'field.default.hidden,
--div--;' . $frontendLanguageFilePrefix . 'tabs.extended
',
'columnsOverrides' => [
]
];
ExtensionManagementUtility::addPiFlexFormValue(
'*',
'FILE:EXT:ep_theme/Configuration/FlexForms/flexform_disturber.xml',
'disrupter'
);
});
@@ -0,0 +1,32 @@
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
call_user_func(function() {
$frontendLanguageFilePrefix = 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:';
ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'label' => 'Google Map',
'value' => 'gmap',
'icon' => 'content-image'
],
'ytvideo',
'after'
);
$GLOBALS['TCA']['tt_content']['types']['gmap'] = [
'showitem' => '
--palette--;' . $frontendLanguageFilePrefix . 'palette.general;general,
tx_eptheme_context_region, tx_eptheme_context_hotel,
--div--;' . $frontendLanguageFilePrefix . 'tabs.access,
hidden;' . $frontendLanguageFilePrefix . 'field.default.hidden,
--div--;' . $frontendLanguageFilePrefix . 'tabs.extended
',
];
});
@@ -0,0 +1,40 @@
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
call_user_func(function() {
$frontendLanguageFilePrefix = 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:';
ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'label' => 'YouTube/Vimeo Video',
'value' => 'ytvideo',
'icon' => 'content-image'
],
'textmedia',
'after'
);
$GLOBALS['TCA']['tt_content']['types']['ytvideo'] = [
'showitem' => '
--palette--;' . $frontendLanguageFilePrefix . 'palette.general;general,
layout, header_link,
--div--;' . $frontendLanguageFilePrefix . 'tabs.access,
hidden;' . $frontendLanguageFilePrefix . 'field.default.hidden,
--div--;' . $frontendLanguageFilePrefix . 'tabs.extended
',
'columnsOverrides' => [
'header_link' => [
'label' => 'YouTube URL/Vimeo ID',
],
'layout' => [
'label' => 'Typ',
],
],
];
});
@@ -0,0 +1,198 @@
<?php
use TYPO3\CMS\Core\Resource\FileType;
return [
'ctrl' => [
'title' => 'Störer',
'default_sortby' => 'ORDER BY headline',
'label' => 'headline',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'dividers2tabs' => true,
'versioningWS' => true,
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l10n_parent',
'transOrigDiffSourceField' => 'l10n_diffsource',
'delete' => 'deleted',
'enablecolumns' => [
'disabled' => 'hidden',
'starttime' => 'starttime',
'endtime' => 'endtime',
],
'searchFields' => 'headline,text',
'iconfile' => 'EXT:ep_theme/Resources/Public/images/icon_ce.svg',
],
'types' => [
'1' => [
'showitem' => 'sys_language_uid, hidden, layout, headline, text, image, pi_flexform',
],
],
'palettes' => [
],
'columns' => [
'sys_language_uid' => [
'exclude' => 0,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
'config' => ['type' => 'language'],
],
'l10n_parent' => [
'displayCond' => 'FIELD:sys_language_uid:>:0',
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent',
'config' => [
'type' => 'select',
'default' => 0,
'renderType' => 'selectSingle',
'items' => [
['label' => '', 'value' => 0],
],
'foreign_table' => 'tx_eptheme_domain_model_disrupter',
'foreign_table_where' => 'AND tx_eptheme_domain_model_disrupter.pid=###CURRENT_PID### AND tx_eptheme_domain_model_disrupter.sys_language_uid IN (-1,0)',
],
],
'l10n_diffsource' => [
'config' => [
'type' => 'passthrough',
],
],
't3ver_label' => [
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.versionLabel',
'config' => [
'type' => 'input',
'size' => 30,
'max' => 255,
]
],
'hidden' => [
'exclude' => 0,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.hidden',
'config' => [
'type' => 'check',
],
],
'starttime' => [
'exclude' => 0,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
'config' => [
'type' => 'datetime',
'size' => 13,
'checkbox' => 0,
'default' => 0,
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
'endtime' => [
'exclude' => 0,
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
'config' => [
'type' => 'datetime',
'size' => 13,
'checkbox' => 0,
'default' => 0,
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
'headline' => [
'exclude' => 0,
'label' => 'Headline',
'config' => [
'type' => 'input',
'size' => 30,
'eval' => 'trim'
],
],
'layout' => [
'exclude' => 0,
'label' => 'Layout',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => 'klein', 'value' => 0],
['label' => 'groß', 'value' => 1],
['label' => 'Event klein', 'value' => 2],
['label' => 'Event groß', 'value' => 3],
],
],
],
'text' => [
'exclude' => 0,
'label' => 'Text',
'config' => [
'type' => 'text',
'cols' => 40,
'rows' => 5,
'eval' => 'trim',
'enableRichtext' => true,
],
],
'image' => [
'exclude' => 0,
'label' => 'Bild',
'config' => [
'type' => 'file',
'allowed' => 'jpg,jpeg',
'appearance' => [
'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference',
'fileUploadAllowed' => false,
],
'overrideChildTca' => [
'types' => [
FileType::IMAGE->value => [
'showitem' => '
--palette--;LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette,
--palette--;;filePalette'
],
],
'columns' => [
'crop' => [
'config' => [
'cropVariants' => [
'default' => [
'title' => 'Alle Geräte',
'allowedAspectRatios' => [
'square' => [
'title' => 'quadratisch',
'value' => 1,
],
'free' => [
'title' => 'Frei',
'value' => 'NaN',
],
],
],
],
],
],
],
],
'maxitems' => 1,
'minitems' => 1,
],
],
'pi_flexform' => [
'exclude' => 0,
'label' => 'Buttons',
'config' => [
'type' => 'flex',
'ds' => [
'default' => 'FILE:EXT:ep_theme/Configuration/FlexForms/flexform_disturber.xml',
],
]
],
'tt_content' => [
'exclude' => 0,
'config' => [
'type' => 'passthrough',
],
],
],
];
@@ -0,0 +1,23 @@
tt_content.contact =< lib.contentElement
tt_content.contact {
templateName = Contact
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_epproducts_domain_model_teammember
where.data = field:tx_eptheme_contact
where.wrap = uid=|
pidInList = {$plugin.tx_eptheme.settings.teamMemberStoragePid}
as = contact
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = image
references.table = tx_epproducts_domain_model_teammember
as = image
}
}
}
}
}
@@ -0,0 +1,28 @@
tt_content.disrupter =< lib.contentElement
tt_content.disrupter {
templateName = Disrupter
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_eptheme_domain_model_disrupter
pidInList = {$plugin.tx_eptheme.settings.disrupterStoragePid}
join = tx_eptheme_ttcontent_tx_eptheme_disrupter_mm ON tx_eptheme_ttcontent_tx_eptheme_disrupter_mm.uid_foreign = tx_eptheme_domain_model_disrupter.uid
where {
data = field:uid
intval = 1
wrap = tx_eptheme_ttcontent_tx_eptheme_disrupter_mm.uid_local=|
}
as = disrupter
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
10 {
references.fieldName = image
references.table = tx_eptheme_domain_model_disrupter
as = image
}
20 = EP\EpTheme\DataProcessing\FlexFormProcessor
}
}
}
}
@@ -0,0 +1,23 @@
tt_content.gmap =< tt_content.teaser_product
tt_content.gmap {
templateName = Gmap
dataProcessing {
10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
10 {
table = tx_epproducts_domain_model_hotel
where.data = field:tx_eptheme_context_hotel
where.wrap = uid=|
pidInList = {$plugin.tx_epproducts.settings.hotelsStoragePid}
as = hotel
}
20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
20 {
table = tx_epproducts_domain_model_region
where.data = field:tx_eptheme_context_region
where.wrap = uid=|
pidInList = {$plugin.tx_epproducts.settings.destinationsStoragePid}
recursive = 2
as = region
}
}
}
@@ -0,0 +1,4 @@
tt_content.ytvideo =< lib.contentElement
tt_content.ytvideo {
templateName = YoutubeVideo
}
@@ -10,4 +10,6 @@ lib.contentElement {
settings.mapTileUrl = {$plugin.tx_eptheme.settings.mapTileUrl}
settings.mapApiKey = {$plugin.tx_eptheme.settings.mapApiKey}
settings.mapAttribution = {$plugin.tx_eptheme.settings.mapAttribution}
# As on TYPO3 10: headers with the default layout are not shown (editors rely on it)
settings.defaultHeaderType =
}
@@ -0,0 +1,63 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<div class="{ep:themeClasses(classes: '{ep: \'bg-ep-primary-dark\', sbw: \'bg-sbw-primary/80\', snz: \'bg-snz-primary/80\', suz: \'bg-suz-primary/80\', uch: \'bg-uch-primary/80\'}', key: settings.themekey)} my-2">
<f:if condition="{settings.themeKey} == 'ep'">
<f:render partial="Disrupter/Outlines"
section="Top1"
arguments="{classes: 'hidden md:block -translate-y-2 {f:if(condition: \'{data.tx_eptheme_background} == 1 || {data.tx_eptheme_background} == 3\', then: \'text-ep-primary-bg\', else: \'text-white\')}'}"/>
</f:if>
<div class="relative container grid grid-cols-2 gap-8 py-4">
<div class="col-span-2 md:col-span-1">
<div class="relative max-w-md mx-auto mb-8">
<f:if condition="{image}">
<f:image image="{image}"
loading="lazy"
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{image.alternative}" />
</f:if>
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
rel="nofollow"
class="absolute bottom-0 left-1/2 -translate-x-1/2 -mb-8 rounded-full py-4 px-6 flex items-center space-x-2 {ep:themeClasses(classes: '{ep: \'bg-ep-secondary\', sbw: \'bg-sbw-secondary\', snz: \'bg-snz-secondary\', suz: \'bg-suz-secondary\', uch: \'bg-uch-secondary\'}', key: settings.themekey)}">
{ep:icon(icon: 'phone', class: 'w-10 h-10 text-white')}
<div class="text-center text-white">
<span class="block whitespace-nowrap">
Ihr habt Fragen?
</span>
<span class="block whitespace-nowrap">
Wir helfen euch gerne!
</span>
</div>
</a>
</div>
</div>
<div class="col-span-2 md:col-span-1">
<span class="headline--secondary font-light text-white">{data.subheadline}</span>
<span class="headline--secondary uppercase font-light text-white mb-4">{data.headline}</span>
<div class="text-white" data-rte-content>
{data.bodytext -> f:format.html()}
</div>
<f:if condition="{data.flexForm.buttons}">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 lg:gap-8">
<f:for each="{data.flexForm.buttons}" as="button">
<f:link.typolink parameter="{button.container.link}"
class="button bg-button--secondary shadow-lg">
{button.container.label}
</f:link.typolink>
</f:for>
</div>
</f:if>
</div>
</div>
<f:if condition="{settings.themeKey} == 'ep'">
<f:render partial="Disrupter/Outlines"
section="Bottom1"
arguments="{classes: 'hidden md:block translate-y-2 {f:if(condition: \'{data.tx_eptheme_background} == 2 || {data.tx_eptheme_background} == 3\', then: \'text-ep-primary-bg\', else: \'text-white\')}'}"/>
</f:if>
</div>
</html>
@@ -0,0 +1,29 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<div class="bg-ep-primary-dark my-2">
<f:render partial="Disrupter/Outlines"
section="Top1"
arguments="{classes: 'hidden md:block -translate-y-2 {f:if(condition: \'{data.tx_eptheme_background} == 1 || {data.tx_eptheme_background} == 3\', then: \'text-ep-primary-bg\', else: \'text-white\')}'}"/>
<div class="max-w-screen-lg mx-auto" data-rte-content>
<div>
{data.headline}
</div>
<div>
{data.text -> f:format.html()}
</div>
<div>
{data.flexForm.buttons -> v:iterator.first() -> v:variable.set(name: 'button')}
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
{button.container.label -> f:format.raw()}
</a>
</div>
</div>
<f:render partial="Disrupter/Outlines"
section="Bottom1"
arguments="{classes: 'hidden md:block translate-y-2 {f:if(condition: \'{data.tx_eptheme_background} == 2 || {data.tx_eptheme_background} == 3\', then: \'text-ep-primary-bg\', else: \'text-white\')}'}"/>
</div>
</html>
@@ -0,0 +1,30 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:alias map="{button: data.flexForm.buttons.0}">
<div class="container-fluid ep-disturber-reminder">
<div data-rte-content>
{data.headline}
</div>
<div class="col-md-6">
<a href="{f:uri.typolink(parameter: button.container.link)}" title="{button.container.label -> f:format.raw()}">
<f:if condition="{image}">
<f:image image="{image}"
loading="lazy"
class="block w-full h-auto rounded-full"
width="400"
alt="{image.alternative}" />
</f:if>
</a>
</div>
<div class="col-md-6" data-rte-content>
{data.text -> f:format.html()}
</div>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
{button.container.label -> f:format.raw()}
</a>
</div>
</f:alias>
</html>
@@ -0,0 +1,42 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<div class="{ep:themeClasses(classes: '{ep: \'bg-ep-primary-dark\', sbw: \'bg-sbw-primary/80\', snz: \'bg-snz-primary/80\', suz: \'bg-suz-primary/80\', uch: \'bg-uch-primary/80\'}', key: settings.themekey)} my-2">
<f:render partial="Disrupter/Outlines"
section="Top1"
arguments="{classes: 'hidden md:block -translate-y-2 {f:if(condition: \'{background} == 1 || {background} == 3\', then: \'text-ep-primary-bg\', else: \'text-white\')}'}"/>
<div class="max-w-screen-lg mx-auto py-4">
<div class="md:flex md:items-start py-4">
<div class="px-16 pb-4 md:px-4 md:pb-0 md:w-1/6">
<f:if condition="{image}">
<f:image image="{image}"
loading="lazy"
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{image.alternative}" />
</f:if>
</div>
<div class="px-16 md:px-4 md:w-5/6 md:pl-8 text-center text-white md:text-left" data-rte-content>
<span class="headline--3 text-white uppercase">{data.headline}</span>
{data.text -> f:format.html()}
<div class="flex flex-col space-y-4 md:flex-row md:items-center md:space-y-0 md:space-x-4">
<f:for each="{data.flexForm.buttons}" as="button" iteration="iteration">
<f:if condition="{iteration.cycle} <= 3">
<f:link.typolink parameter="{button.container.link}" class="button bg-button--secondary shadow-lg">
{button.container.label}
</f:link.typolink>
</f:if>
</f:for>
</div>
</div>
</div>
</div>
<f:render partial="Disrupter/Outlines"
section="Bottom1"
arguments="{classes: 'hidden md:block translate-y-2 {f:if(condition: \'{background} == 2 || {background} == 3\', then: \'text-ep-primary-bg\', else: \'text-white\')}'}"/>
</div>
</html>
@@ -0,0 +1,31 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<div class="bg-zinc-50 p-4 mb-8">
<div class="grid grid-cols-3 gap-4">
<div class="col-span-1">
<f:if condition="{contact.0.image.0}">
<f:image
image="{contact.0.image.0}"
width="120"
class="block w-full h-auto"
alt="{contact.0.data.name}" />
</f:if>
</div>
<div class="col-span-2">
<strong>{contact.0.data.name}</strong>
<f:if condition="{contact.0.data.tasks}"><br>{contact.0.data.tasks -> f:format.nl2br()}</f:if>
<f:if condition="{contact.0.data.phone}"><br><i class="fa fa-phone"></i> {contact.0.data.phone}</f:if>
<f:if condition="{contact.0.data.email}"><br><i class="fa fa-envelope-o"></i> <f:link.email email="{contact.0.data.email}" title="E-Mail an {contact.0.data.name}">E-Mail</f:link.email></f:if>
</div>
</div>
</div>
</f:section>
</html>
@@ -0,0 +1,26 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:alias map="{data: disrupter.0.data, image: disrupter.0.image.0, background: data.tx_eptheme_background}">
<f:switch expression="{data.layout}">
<f:case value="0">
<f:render partial="Disrupter/Small" arguments="{_all}"/>
</f:case>
<f:case value="1">
<f:render partial="Disrupter/Large" arguments="{_all}"/>
</f:case>
<f:case value="2">
<f:render partial="Disrupter/LastChance" arguments="{_all}"/>
</f:case>
<f:case value="3">
<f:render partial="Disrupter/Reminder" arguments="{_all}"/>
</f:case>
</f:switch>
</f:alias>
</f:section>
</html>
@@ -0,0 +1,19 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:if condition="{hotel}">
<f:variable name="latitude" value="{hotel.0.data.latitude}"/>
<f:variable name="longitude" value="{hotel.0.data.longitude}"/>
</f:if>
<f:if condition="{region}">
<f:variable name="latitude" value="{region.0.data.latitude}"/>
<f:variable name="longitude" value="{region.0.data.longitude}"/>
</f:if>
<f:render partial="Map/Osm" arguments="{settings: settings, class: 'mb-8', zoom: 17, lat: latitude, lng: longitude}"/>
</f:section>
</html>
@@ -0,0 +1,30 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<f:switch expression="{data.layout}">
<f:case value="2">
<f:render partial="ImageGallery" arguments="{images: files, thumbnails: 1, id: data.uid}"/>
</f:case>
<f:case value="4">
<f:render partial="ImageGallery" arguments="{images: files, thumbnails: 0, id: data.uid}"/>
</f:case>
<f:case value="3">
<f:render partial="Textmedia/LinkPanel" section="Content" arguments="{images: files}"/>
</f:case>
<f:case value="5">
<f:render partial="Textmedia/Partnerlogos" section="Content" arguments="{_all}"/>
</f:case>
<f:defaultCase>
<ep:container rteContent="true" data="{data}">
<f:render partial="Textmedia/Default" section="Content" arguments="{_all}"/>
</ep:container>
</f:defaultCase>
</f:switch>
</f:section>
</html>
@@ -0,0 +1,25 @@
<html data-namespace-typo3-fluid="true" lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:layout name="Default"/>
<f:section name="Main">
<div class="relative w-full aspect-w-16 aspect-h-9 bg-cover bg-center"
style="background-image: url({f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/lazy.png')})">
<iframe class="absolute top-0 left-0 w-full h-full"
width="640" height="360" allowfullscreen
title="eingebettetes Video"
data-src="{ep:uri.video(value: data.header_link, layout: data.layout)}"
referrerpolicy="strict-origin-when-cross-origin"
data-cookiefirst-category="advertising"></iframe>
<div class="cookiefirst-disabled-resource">
<div class="absolute top-1/2 left-1/2 tranform -translate-xy-1/2">
Bitte <a href="#" onclick="CookieFirst.acceptCategory('advertising'); return false" class="underline">Marketing-Cookies akzeptieren</a>, um dieses Video anzusehen.
</div>
</div>
</div>
</f:section>
</html>