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 =
}