Checkpoint: headless JSON architecture documented + cleanup (Stufe 1+2)
Restore point before Stufe 3 (central resolver-service refactoring). Includes this session's work: - Success Story (usecase) rebuild: new fields/tabs, UsecaseSerializer, thin List/Show renderers, MM relations, inline content elements. - vitec_columns content block (two-column layout with per-item content) incl. unified header section; special-cased JSON resolution. - Container per-column flex (items[].config align/justify) + gap on parent. - Unified header section across CEs/plugins/containers; header fields in JSON. - ISO-style architecture spec: Documentation/Headless-JSON-Architecture.md. - Cleanup: removed local scratch + verified .bak backups. - Fixes: B-6 (undefined thumbnail variable in Downloadcardcollection image resolver), B-7 (unsatisfiable legacy CType OR branch in Downloadcard/Datasheets). Rollback: git reset --hard snapshot-2026-07-09-pre-stufe3 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
c6759186cb
commit
bb7c03235d
237 files changed
+6698
-1749
No files matched your search
Executable → Regular
File mode changed.
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<T3DataStructure>
|
||||
<sheets>
|
||||
<sDEF>
|
||||
<ROOT>
|
||||
<sheetTitle>Carousel Settings</sheetTitle>
|
||||
<type>array</type>
|
||||
<el>
|
||||
<settings.slidesperview>
|
||||
<label>Slides per view (desktop)</label>
|
||||
<config>
|
||||
<type>select</type>
|
||||
<renderType>selectSingle</renderType>
|
||||
<items>
|
||||
<numIndex index="0">
|
||||
<label>4</label>
|
||||
<value>4</value>
|
||||
</numIndex>
|
||||
<numIndex index="1">
|
||||
<label>3</label>
|
||||
<value>3</value>
|
||||
</numIndex>
|
||||
<numIndex index="2">
|
||||
<label>2</label>
|
||||
<value>2</value>
|
||||
</numIndex>
|
||||
<numIndex index="3">
|
||||
<label>1</label>
|
||||
<value>1</value>
|
||||
</numIndex>
|
||||
</items>
|
||||
<default>4</default>
|
||||
</config>
|
||||
</settings.slidesperview>
|
||||
|
||||
<settings.showarrows>
|
||||
<label>Show prev/next arrows</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>1</default>
|
||||
</config>
|
||||
</settings.showarrows>
|
||||
|
||||
<settings.showindicators>
|
||||
<label>Show slide indicators (dots)</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>1</default>
|
||||
</config>
|
||||
</settings.showindicators>
|
||||
|
||||
<settings.loop>
|
||||
<label>Loop (wrap around at the end)</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.loop>
|
||||
|
||||
<settings.autoplay>
|
||||
<label>Autoplay</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.autoplay>
|
||||
|
||||
<settings.autoplayinterval>
|
||||
<label>Autoplay interval (ms)</label>
|
||||
<config>
|
||||
<type>number</type>
|
||||
<default>5000</default>
|
||||
</config>
|
||||
</settings.autoplayinterval>
|
||||
|
||||
<settings.cssClass>
|
||||
<label>Additional CSS Class</label>
|
||||
<config>
|
||||
<type>input</type>
|
||||
<size>30</size>
|
||||
<eval>trim</eval>
|
||||
</config>
|
||||
</settings.cssClass>
|
||||
|
||||
<settings.debug>
|
||||
<label>Allow Debug Output</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.debug>
|
||||
</el>
|
||||
</ROOT>
|
||||
</sDEF>
|
||||
</sheets>
|
||||
</T3DataStructure>
|
||||
Executable → Regular
File mode changed.
Executable → Regular
File mode changed.
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<T3DataStructure>
|
||||
<meta>
|
||||
<langDisable>1</langDisable>
|
||||
</meta>
|
||||
<sheets>
|
||||
<sDEF>
|
||||
<ROOT>
|
||||
<sheetTitle>Event List Settings</sheetTitle>
|
||||
<type>array</type>
|
||||
<el>
|
||||
<settings.daysinadvance>
|
||||
<label>Days in advance (0 = no limit)</label>
|
||||
<description>Only show upcoming events starting within the next N days, e.g. 60.</description>
|
||||
<config>
|
||||
<type>number</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.daysinadvance>
|
||||
|
||||
<settings.showpast>
|
||||
<label>Include past events</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.showpast>
|
||||
|
||||
<settings.limit>
|
||||
<label>Maximum number of events (0 = all)</label>
|
||||
<config>
|
||||
<type>number</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.limit>
|
||||
|
||||
<settings.debug>
|
||||
<label>Allow Debug Output</label>
|
||||
<config>
|
||||
<type>check</type>
|
||||
<default>0</default>
|
||||
</config>
|
||||
</settings.debug>
|
||||
</el>
|
||||
</ROOT>
|
||||
</sDEF>
|
||||
</sheets>
|
||||
</T3DataStructure>
|
||||
Executable → Regular
+4
@@ -32,6 +32,10 @@ return [
|
||||
'provider' => SvgIconProvider::class,
|
||||
'source' => 'EXT:vitec/Resources/Public/Icons/vitec-plugin-usecaselist.svg',
|
||||
],
|
||||
'vitec-plugin-eventlist' => [
|
||||
'provider' => SvgIconProvider::class,
|
||||
'source' => 'EXT:vitec/Resources/Public/Icons/vitec-plugin-eventlist.svg',
|
||||
],
|
||||
'vitec-plugin-downloadcard' => [
|
||||
'provider' => SvgIconProvider::class,
|
||||
'source' => 'EXT:vitec/Resources/Public/Icons/vitec-plugin-downloadcard.svg',
|
||||
|
||||
Executable → Regular
File mode changed.
Executable → Regular
File mode changed.
Executable → Regular
+42
-9
@@ -20,7 +20,7 @@ config {
|
||||
# =============================================================================
|
||||
|
||||
tt_content {
|
||||
vitec_productlist < lib.contentElement
|
||||
vitec_productlist < lib.contentElementWithHeader
|
||||
vitec_productlist {
|
||||
fields {
|
||||
content {
|
||||
@@ -32,7 +32,28 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_productshow < lib.contentElement
|
||||
news_pi1 < lib.contentElementWithHeader
|
||||
news_pi1 {
|
||||
fields {
|
||||
content {
|
||||
fields {
|
||||
news = USER
|
||||
news.userFunc = Evomedien\Vitec\UserFunc\NewsJsonRenderer->render
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
news_newsliststicky < tt_content.news_pi1
|
||||
news_newsselectedlist < tt_content.news_pi1
|
||||
news_newsdetail < tt_content.news_pi1
|
||||
news_newsdatemenu < tt_content.news_pi1
|
||||
news_categorylist < tt_content.news_pi1
|
||||
news_newssearchform < tt_content.news_pi1
|
||||
news_newssearchresult < tt_content.news_pi1
|
||||
news_taglist < tt_content.news_pi1
|
||||
|
||||
vitec_productshow < lib.contentElementWithHeader
|
||||
vitec_productshow {
|
||||
fields {
|
||||
content {
|
||||
@@ -44,7 +65,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_usecaselist < lib.contentElement
|
||||
vitec_usecaselist < lib.contentElementWithHeader
|
||||
vitec_usecaselist {
|
||||
fields {
|
||||
content {
|
||||
@@ -56,7 +77,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_usecaseshow < lib.contentElement
|
||||
vitec_usecaseshow < lib.contentElementWithHeader
|
||||
vitec_usecaseshow {
|
||||
fields {
|
||||
content {
|
||||
@@ -68,7 +89,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_marketshow < lib.contentElement
|
||||
vitec_marketshow < lib.contentElementWithHeader
|
||||
vitec_marketshow {
|
||||
fields {
|
||||
content {
|
||||
@@ -80,7 +101,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_solutionshow < lib.contentElement
|
||||
vitec_solutionshow < lib.contentElementWithHeader
|
||||
vitec_solutionshow {
|
||||
fields {
|
||||
content {
|
||||
@@ -92,7 +113,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_downloadcard < lib.contentElement
|
||||
vitec_downloadcard < lib.contentElementWithHeader
|
||||
vitec_downloadcard {
|
||||
fields {
|
||||
content {
|
||||
@@ -104,7 +125,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_downloadcardcollection < lib.contentElement
|
||||
vitec_downloadcardcollection < lib.contentElementWithHeader
|
||||
vitec_downloadcardcollection {
|
||||
fields {
|
||||
content {
|
||||
@@ -116,7 +137,7 @@ tt_content {
|
||||
}
|
||||
}
|
||||
|
||||
vitec_datasheets < lib.contentElement
|
||||
vitec_datasheets < lib.contentElementWithHeader
|
||||
vitec_datasheets {
|
||||
fields {
|
||||
content {
|
||||
@@ -127,6 +148,18 @@ tt_content {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vitec_eventlist =< lib.contentElementWithHeader
|
||||
vitec_eventlist {
|
||||
fields {
|
||||
content {
|
||||
fields {
|
||||
eventlist = USER
|
||||
eventlist.userFunc = Evomedien\Vitec\UserFunc\EventlistJsonRenderer->render
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Include container (layout) rendering definitions
|
||||
|
||||
Executable → Regular
File mode changed.
@@ -34,6 +34,7 @@ use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
|
||||
$registerPluginWithFlexForm('Downloadcard', 'Download Card', 'FILE:EXT:vitec/Configuration/FlexForms/Downloadcard.xml', 'vitec-plugin-downloadcard');
|
||||
$registerPluginWithFlexForm('Downloadcardcollection', 'Download Card Collection', 'FILE:EXT:vitec/Configuration/FlexForms/Downloadcardcollection.xml', 'vitec-plugin-downloadcardcollection');
|
||||
$registerPluginWithFlexForm('Datasheets', 'Datasheets', 'FILE:EXT:vitec/Configuration/FlexForms/Datasheets.xml');
|
||||
$registerPluginWithFlexForm('Eventlist', 'Event List', 'FILE:EXT:vitec/Configuration/FlexForms/Eventlist.xml', 'vitec-plugin-eventlist');
|
||||
|
||||
// Change frame_class to allow multiple selections.
|
||||
$GLOBALS['TCA']['tt_content']['columns']['frame_class']['config']['renderType'] = 'selectCheckBox';
|
||||
@@ -50,4 +51,9 @@ use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
|
||||
['label' => 'Vitec: Highlight Box', 'value' => 'vitec-highlight'],
|
||||
]
|
||||
);
|
||||
|
||||
// Inline parent pointer: content elements owned by a Success Story record.
|
||||
$GLOBALS['TCA']['tt_content']['columns']['tx_vitec_usecase_content'] = [
|
||||
'config' => ['type' => 'passthrough'],
|
||||
];
|
||||
})();
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
defined('TYPO3') or die();
|
||||
|
||||
use B13\Container\Tca\ContainerConfiguration;
|
||||
use B13\Container\Tca\Registry;
|
||||
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
(static function (): void {
|
||||
$l = 'LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:';
|
||||
|
||||
/** @var Registry $registry */
|
||||
$registry = GeneralUtility::makeInstance(Registry::class);
|
||||
|
||||
$registry->configureContainer(
|
||||
(new ContainerConfiguration(
|
||||
'vitec_cards_carousel',
|
||||
$l . 'cards_carousel.title',
|
||||
$l . 'cards_carousel.description',
|
||||
[
|
||||
[
|
||||
['name' => $l . 'cards_carousel.column', 'colPos' => 260],
|
||||
],
|
||||
]
|
||||
))
|
||||
->setIcon('EXT:vitec/Resources/Public/Icons/vitec-cards-carousel.svg')
|
||||
->setGroup('vitec_custom_components')
|
||||
->setSaveAndCloseInNewContentElementWizard(true)
|
||||
);
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_cards_carousel']['showitem'] =
|
||||
'--palette--;;general,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
pi_flexform;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cards_carousel.flexform.label,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
--palette--;;frames,
|
||||
--palette--;;appearanceLinks,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
--palette--;;language,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
|
||||
--palette--;;hidden,
|
||||
--palette--;;access';
|
||||
|
||||
ExtensionManagementUtility::addPiFlexFormValue(
|
||||
'*',
|
||||
'FILE:EXT:vitec/Configuration/FlexForms/CardsCarousel.xml',
|
||||
'vitec_cards_carousel'
|
||||
);
|
||||
|
||||
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
|
||||
mod.wizards.newContentElement.wizardItems.vitec_custom_components.elements.vitec_cards_carousel {
|
||||
iconIdentifier = vitec-cards-carousel
|
||||
title = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cards_carousel.title
|
||||
description = LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:cards_carousel.description
|
||||
tt_content_defValues {
|
||||
CType = vitec_cards_carousel
|
||||
}
|
||||
}
|
||||
TSCONFIG;
|
||||
})();
|
||||
Executable → Regular
+6
-2
@@ -35,10 +35,14 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_cols_25_25_25_25']['showitem'] =
|
||||
'--palette--;;general,
|
||||
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
|
||||
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:palette.grid;vitec_grid,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.1;vitec_col1_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.2;vitec_col2_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.3;vitec_col3_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.4;vitec_col4_flex,
|
||||
--palette--;;frames,
|
||||
--palette--;;appearanceLinks,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
|
||||
Executable → Regular
+5
-2
@@ -34,10 +34,13 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_cols_33_33_33']['showitem'] =
|
||||
'--palette--;;general,
|
||||
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
|
||||
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:palette.grid;vitec_grid,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.1;vitec_col1_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.2;vitec_col2_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.3;vitec_col3_flex,
|
||||
--palette--;;frames,
|
||||
--palette--;;appearanceLinks,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
|
||||
Executable → Regular
+4
-2
@@ -33,10 +33,12 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_cols_33_66']['showitem'] =
|
||||
'--palette--;;general,
|
||||
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
|
||||
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:palette.grid;vitec_grid,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.sidebar_33;vitec_col1_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.main_66;vitec_col2_flex,
|
||||
--palette--;;frames,
|
||||
--palette--;;appearanceLinks,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
|
||||
Executable → Regular
+4
-2
@@ -33,10 +33,12 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_cols_50_50']['showitem'] =
|
||||
'--palette--;;general,
|
||||
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
|
||||
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:palette.grid;vitec_grid,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.1;vitec_col1_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.2;vitec_col2_flex,
|
||||
--palette--;;frames,
|
||||
--palette--;;appearanceLinks,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
|
||||
Executable → Regular
+4
-2
@@ -33,10 +33,12 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_cols_66_33']['showitem'] =
|
||||
'--palette--;;general,
|
||||
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
|
||||
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:palette.grid;vitec_grid,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.main_66;vitec_col1_flex,
|
||||
--palette--;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:column.sidebar_33;vitec_col2_flex,
|
||||
--palette--;;frames,
|
||||
--palette--;;appearanceLinks,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
|
||||
Executable → Regular
+1
-2
@@ -32,8 +32,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
$GLOBALS['TCA']['tt_content']['types']['vitec_container']['showitem'] =
|
||||
'--palette--;;general,
|
||||
header;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.heading,
|
||||
subheader;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:section.subline,
|
||||
--palette--;;headers,
|
||||
tx_vitec_bg_variant,
|
||||
pi_flexform;LLL:EXT:vitec/Resources/Private/Language/locallang_containers.xlf:container.flexform.label,
|
||||
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
|
||||
|
||||
Executable → Regular
+81
@@ -27,6 +27,87 @@ use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
|
||||
],
|
||||
]);
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Shared parent-level setting: column gap scale (1–5) for the whole grid.
|
||||
// Concerns the container itself (not a single column); maps to a spacing
|
||||
// token in the React frontend. Rendered in the "Grid" palette on top of the
|
||||
// Appearance tab, above the per-column rows.
|
||||
// -------------------------------------------------------------------------
|
||||
ExtensionManagementUtility::addTCAcolumns('tt_content', [
|
||||
'tx_vitec_gap' => [
|
||||
'label' => $l . 'gap.label',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'items' => [
|
||||
['label' => $l . 'gap.option.1', 'value' => '1'],
|
||||
['label' => $l . 'gap.option.2', 'value' => '2'],
|
||||
['label' => $l . 'gap.option.3', 'value' => '3'],
|
||||
['label' => $l . 'gap.option.4', 'value' => '4'],
|
||||
['label' => $l . 'gap.option.5', 'value' => '5'],
|
||||
],
|
||||
'default' => '3',
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
||||
// Parent-element palette: settings that concern the whole grid, not a column.
|
||||
$GLOBALS['TCA']['tt_content']['palettes']['vitec_grid'] = [
|
||||
'showitem' => 'tx_vitec_gap',
|
||||
];
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Shared per-column flex alignment fields for the X-column containers.
|
||||
// Positional: col1 = first column, col2 = second, ... (max 4 columns).
|
||||
// "Align" -> CSS align-items (cross-axis alignment of the column's items)
|
||||
// "Justify" -> CSS justify-content (main-axis distribution within the column)
|
||||
// Reused across vitec_cols_50_50 / 33_66 / 66_33 / 33_33_33 / 25_25_25_25.
|
||||
// -------------------------------------------------------------------------
|
||||
$alignItems = [
|
||||
['label' => $l . 'flex.align.flex_start', 'value' => 'flex-start'],
|
||||
['label' => $l . 'flex.align.center', 'value' => 'center'],
|
||||
['label' => $l . 'flex.align.flex_end', 'value' => 'flex-end'],
|
||||
['label' => $l . 'flex.align.stretch', 'value' => 'stretch'],
|
||||
];
|
||||
$justifyItems = [
|
||||
['label' => $l . 'flex.justify.flex_start', 'value' => 'flex-start'],
|
||||
['label' => $l . 'flex.justify.center', 'value' => 'center'],
|
||||
['label' => $l . 'flex.justify.space_between', 'value' => 'space-between'],
|
||||
['label' => $l . 'flex.justify.space_around', 'value' => 'space-around'],
|
||||
['label' => $l . 'flex.justify.space_evenly', 'value' => 'space-evenly'],
|
||||
];
|
||||
|
||||
$columnFields = [];
|
||||
for ($i = 1; $i <= 4; $i++) {
|
||||
$columnFields['tx_vitec_col' . $i . '_align'] = [
|
||||
'label' => $l . 'flex.align.label',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'items' => $alignItems,
|
||||
'default' => 'stretch',
|
||||
],
|
||||
];
|
||||
$columnFields['tx_vitec_col' . $i . '_justify'] = [
|
||||
'label' => $l . 'flex.justify.label',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'items' => $justifyItems,
|
||||
'default' => 'flex-start',
|
||||
],
|
||||
];
|
||||
}
|
||||
ExtensionManagementUtility::addTCAcolumns('tt_content', $columnFields);
|
||||
|
||||
// One palette per column: Align + Justify on a single row. The visible row
|
||||
// label is overridden per container in its showitem (--palette--;<colLabel>;<palette>).
|
||||
for ($i = 1; $i <= 4; $i++) {
|
||||
$GLOBALS['TCA']['tt_content']['palettes']['vitec_col' . $i . '_flex'] = [
|
||||
'showitem' => 'tx_vitec_col' . $i . '_align, tx_vitec_col' . $i . '_justify',
|
||||
];
|
||||
}
|
||||
|
||||
// Register VITEC wizard group header
|
||||
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] = ($GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'] ?? '') . "\n" . <<<'TSCONFIG'
|
||||
mod.wizards.newContentElement.wizardItems.vitec {
|
||||
|
||||
@@ -0,0 +1,290 @@
|
||||
<?php
|
||||
return [
|
||||
'ctrl' => [
|
||||
'title' => 'VITEC Event',
|
||||
'label' => 'title',
|
||||
'label_alt' => 'city,eventstart',
|
||||
'tstamp' => 'tstamp',
|
||||
'crdate' => 'crdate',
|
||||
'versioningWS' => true,
|
||||
'languageField' => 'sys_language_uid',
|
||||
'transOrigPointerField' => 'l10n_parent',
|
||||
'transOrigDiffSourceField' => 'l10n_diffsource',
|
||||
'delete' => 'deleted',
|
||||
'default_sortby' => 'eventstart ASC',
|
||||
'enablecolumns' => [
|
||||
'disabled' => 'hidden',
|
||||
'starttime' => 'starttime',
|
||||
'endtime' => 'endtime',
|
||||
],
|
||||
'searchFields' => 'title,teaser,venue,booth,city,country',
|
||||
'iconfile' => 'EXT:vitec/Resources/Public/Icons/tx_vitec_domain_model_event.svg',
|
||||
'security' => [
|
||||
'ignorePageTypeRestriction' => true,
|
||||
],
|
||||
],
|
||||
'types' => [
|
||||
'1' => [
|
||||
'showitem' => 'title, slug, teaser, description,
|
||||
--div--;Event Details, eventstart, eventend, venue, booth, city, country, attendancemode, eventstatus,
|
||||
--div--;Links and Media, eventurl, meetinglink, image,
|
||||
--div--;Visibility, hideonwebsite, hideonapp,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, sys_language_uid, l10n_parent, l10n_diffsource,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime',
|
||||
],
|
||||
],
|
||||
'columns' => [
|
||||
'sys_language_uid' => [
|
||||
'exclude' => true,
|
||||
'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',
|
||||
'renderType' => 'selectSingle',
|
||||
'default' => 0,
|
||||
'items' => [
|
||||
['label' => '', 'value' => 0],
|
||||
],
|
||||
'foreign_table' => 'tx_vitec_domain_model_event',
|
||||
'foreign_table_where' => 'AND {#tx_vitec_domain_model_event}.{#pid}=###CURRENT_PID### AND {#tx_vitec_domain_model_event}.{#sys_language_uid} IN (-1,0)',
|
||||
],
|
||||
],
|
||||
'l10n_diffsource' => [
|
||||
'config' => [
|
||||
'type' => 'passthrough',
|
||||
],
|
||||
],
|
||||
'hidden' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.visible',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'items' => [
|
||||
[
|
||||
'label' => '',
|
||||
'invertStateDisplay' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'starttime' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
|
||||
'config' => [
|
||||
'type' => 'datetime',
|
||||
'default' => 0,
|
||||
],
|
||||
],
|
||||
'endtime' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
|
||||
'config' => [
|
||||
'type' => 'datetime',
|
||||
'default' => 0,
|
||||
],
|
||||
],
|
||||
|
||||
'title' => [
|
||||
'exclude' => false,
|
||||
'label' => 'Event Name',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 40,
|
||||
'max' => 255,
|
||||
'eval' => 'trim',
|
||||
'required' => true,
|
||||
],
|
||||
],
|
||||
'slug' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Slug',
|
||||
'config' => [
|
||||
'type' => 'slug',
|
||||
'size' => 50,
|
||||
'generatorOptions' => [
|
||||
'fields' => ['title'],
|
||||
'replacements' => ['/' => '-'],
|
||||
],
|
||||
'fallbackCharacter' => '-',
|
||||
'eval' => 'uniqueInSite',
|
||||
'default' => '',
|
||||
],
|
||||
],
|
||||
'teaser' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Teaser',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 40,
|
||||
'max' => 255,
|
||||
'eval' => 'trim',
|
||||
],
|
||||
],
|
||||
'description' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Description',
|
||||
'config' => [
|
||||
'type' => 'text',
|
||||
'cols' => 40,
|
||||
'rows' => 8,
|
||||
'enableRichtext' => true,
|
||||
],
|
||||
],
|
||||
|
||||
'eventstart' => [
|
||||
'exclude' => false,
|
||||
'label' => 'Event Start Date',
|
||||
'config' => [
|
||||
'type' => 'datetime',
|
||||
'format' => 'date',
|
||||
'default' => 0,
|
||||
'required' => true,
|
||||
],
|
||||
],
|
||||
'eventend' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Event End Date',
|
||||
'config' => [
|
||||
'type' => 'datetime',
|
||||
'format' => 'date',
|
||||
'default' => 0,
|
||||
],
|
||||
],
|
||||
'venue' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Venue',
|
||||
'description' => 'e.g. "Queen Sirikit National Convention Center (QSNCC)"',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 40,
|
||||
'max' => 255,
|
||||
'eval' => 'trim',
|
||||
],
|
||||
],
|
||||
'booth' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Booth / Stand',
|
||||
'description' => 'e.g. "Stand H10"',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 20,
|
||||
'max' => 255,
|
||||
'eval' => 'trim',
|
||||
],
|
||||
],
|
||||
'city' => [
|
||||
'exclude' => true,
|
||||
'label' => 'City',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 30,
|
||||
'max' => 255,
|
||||
'eval' => 'trim',
|
||||
],
|
||||
],
|
||||
'country' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Country',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 30,
|
||||
'max' => 255,
|
||||
'eval' => 'trim',
|
||||
],
|
||||
],
|
||||
'attendancemode' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Attendance Mode',
|
||||
'description' => 'Used for schema.org structured data (eventAttendanceMode).',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'default' => 'offline',
|
||||
'items' => [
|
||||
['label' => 'On-site (offline)', 'value' => 'offline'],
|
||||
['label' => 'Online', 'value' => 'online'],
|
||||
['label' => 'Hybrid (mixed)', 'value' => 'mixed'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'eventstatus' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Event Status',
|
||||
'description' => 'Used for schema.org structured data (eventStatus).',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'default' => 'scheduled',
|
||||
'items' => [
|
||||
['label' => 'Scheduled', 'value' => 'scheduled'],
|
||||
['label' => 'Cancelled', 'value' => 'cancelled'],
|
||||
['label' => 'Postponed', 'value' => 'postponed'],
|
||||
['label' => 'Rescheduled', 'value' => 'rescheduled'],
|
||||
['label' => 'Moved Online', 'value' => 'movedonline'],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'eventurl' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Event Website',
|
||||
'config' => [
|
||||
'type' => 'link',
|
||||
'allowedTypes' => ['url', 'page'],
|
||||
],
|
||||
],
|
||||
'meetinglink' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Book-a-Meeting Link',
|
||||
'description' => 'Link or email for the "Book a Meeting" call-to-action.',
|
||||
'config' => [
|
||||
'type' => 'link',
|
||||
'allowedTypes' => ['url', 'email', 'page'],
|
||||
],
|
||||
],
|
||||
'image' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Event Logo / Image',
|
||||
'config' => [
|
||||
'type' => 'file',
|
||||
'maxitems' => 1,
|
||||
'allowed' => 'common-image-types',
|
||||
],
|
||||
],
|
||||
|
||||
'hideonwebsite' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Hide on Website',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'default' => 0,
|
||||
],
|
||||
],
|
||||
'hideonapp' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Hide in App',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'default' => 0,
|
||||
],
|
||||
],
|
||||
|
||||
'categories' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.categories',
|
||||
'config' => [
|
||||
'type' => 'category',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
Executable → Regular
File mode changed.
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
return [
|
||||
'ctrl' => [
|
||||
'ctrl' => [
|
||||
'title' => 'VITEC Success Story',
|
||||
'label' => 'title',
|
||||
'tstamp' => 'tstamp',
|
||||
@@ -16,303 +16,325 @@ return [
|
||||
'starttime' => 'starttime',
|
||||
'endtime' => 'endtime',
|
||||
],
|
||||
'searchFields' => 'title,slug',
|
||||
'searchFields' => 'title,slug,subtitle,teaser,seo_title,seo_description',
|
||||
'iconfile' => 'EXT:vitec/Resources/Public/Icons/tx_vitec_domain_model_usecase.gif',
|
||||
'security' => [
|
||||
'ignorePageTypeRestriction' => true,
|
||||
],
|
||||
],
|
||||
'types' => [
|
||||
'1' => ['showitem' => 'title, slug, subtitle, teaser, description, singlepid, caseimage, logoimage,
|
||||
--div--;Visibility, hideonapp, hideonwebsite,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, sys_language_uid, l10n_parent, l10n_diffsource,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime', ],
|
||||
'types' => [
|
||||
'1' => [
|
||||
'showitem' =>
|
||||
'--div--;General,
|
||||
title, slug, subtitle,
|
||||
--div--;List view,
|
||||
card_image, customer_logo, teaser,
|
||||
--div--;Detail · Hero,
|
||||
hero_bgimage, hero_small_image, hero_video, hero_overlay_color, hero_overlay_opacity,
|
||||
--div--;Detail · Content,
|
||||
content_elements,
|
||||
--div--;Detail · Related,
|
||||
market, solutions, products, categories,
|
||||
--div--;SEO,
|
||||
seo_title, seo_description, no_index, no_follow, canonical_link,
|
||||
--palette--;Open Graph;ogPalette,
|
||||
--palette--;Twitter;twitterPalette,
|
||||
--div--;Appearance,
|
||||
layout_variant, background_variant, accent_color,
|
||||
featured, show_related, hero_layout, text_theme,
|
||||
--palette--;Visibility;visibilityPalette,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
|
||||
sys_language_uid, l10n_parent, l10n_diffsource,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
|
||||
hidden, starttime, endtime',
|
||||
],
|
||||
],
|
||||
'columns' => [
|
||||
'palettes' => [
|
||||
'ogPalette' => ['showitem' => 'og_title, og_description, --linebreak--, og_image'],
|
||||
'twitterPalette' => ['showitem' => 'twitter_title, twitter_description, --linebreak--, twitter_image'],
|
||||
'visibilityPalette' => ['showitem' => 'hideonwebsite, hideonapp'],
|
||||
],
|
||||
'columns' => [
|
||||
// ------------------------------------------------------------ system
|
||||
'sys_language_uid' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
|
||||
'config' => [
|
||||
'type' => 'language',
|
||||
],
|
||||
'config' => ['type' => 'language'],
|
||||
],
|
||||
'l10n_parent' => [
|
||||
'l10n_parent' => [
|
||||
'displayCond' => 'FIELD:sys_language_uid:>:0',
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'default' => 0,
|
||||
'items' => [
|
||||
['', 0],
|
||||
],
|
||||
'foreign_table' => 'tx_vitec_domain_model_download',
|
||||
'foreign_table_where' => 'AND {#tx_vitec_domain_model_download}.{#pid}=###CURRENT_PID### AND {#tx_vitec_domain_model_download}.{#sys_language_uid} IN (-1,0)',
|
||||
'items' => [['label' => '', 'value' => 0]],
|
||||
'foreign_table' => 'tx_vitec_domain_model_usecase',
|
||||
'foreign_table_where' => 'AND {#tx_vitec_domain_model_usecase}.{#pid}=###CURRENT_PID### AND {#tx_vitec_domain_model_usecase}.{#sys_language_uid} IN (-1,0)',
|
||||
],
|
||||
],
|
||||
'l10n_diffsource' => [
|
||||
'config' => [
|
||||
'type' => 'passthrough',
|
||||
],
|
||||
],
|
||||
'hidden' => [
|
||||
'l10n_diffsource' => ['config' => ['type' => 'passthrough']],
|
||||
'hidden' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.visible',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'items' => [
|
||||
[
|
||||
0 => '',
|
||||
1 => '',
|
||||
'invertStateDisplay' => true,
|
||||
],
|
||||
],
|
||||
'items' => [['value' => '', 'label' => '', 'invertStateDisplay' => true]],
|
||||
],
|
||||
],
|
||||
'starttime' => [
|
||||
'starttime' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'renderType' => 'inputDateTime',
|
||||
'eval' => 'datetime,int',
|
||||
'default' => 0,
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
],
|
||||
'config' => ['type' => 'datetime', 'default' => 0, 'behaviour' => ['allowLanguageSynchronization' => true]],
|
||||
],
|
||||
'endtime' => [
|
||||
'endtime' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'renderType' => 'inputDateTime',
|
||||
'eval' => 'datetime,int',
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'upper' => mktime(0, 0, 0, 1, 1, 2038),
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
],
|
||||
'config' => ['type' => 'datetime', 'default' => 0, 'range' => ['upper' => mktime(0, 0, 0, 1, 1, 2038)], 'behaviour' => ['allowLanguageSynchronization' => true]],
|
||||
],
|
||||
|
||||
'title' => [
|
||||
'exclude' => false,
|
||||
'label' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_db.xlf:tx_vitec_domain_model_download.title',
|
||||
'description' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_db.xlf:tx_vitec_domain_model_download.title.description',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 30,
|
||||
'eval' => 'trim',
|
||||
'required' => true,
|
||||
'default' => '',
|
||||
],
|
||||
// ----------------------------------------------------------- General
|
||||
'title' => [
|
||||
'label' => 'Title',
|
||||
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim', 'required' => true, 'default' => ''],
|
||||
],
|
||||
'slug' => [
|
||||
'exclude' => false,
|
||||
'label' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_db.xlf:tx_vitec_domain_model_download.slug',
|
||||
'description' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_db.xlf:tx_vitec_domain_model_download.slug.description',
|
||||
'config' => [
|
||||
'slug' => [
|
||||
'label' => 'Slug',
|
||||
'config' => [
|
||||
'type' => 'slug',
|
||||
'size' => 50,
|
||||
'generatorOptions' => [
|
||||
'fields' => ['title'], // TODO: adjust this field to the one you want to use
|
||||
'fieldSeparator' => '-',
|
||||
'replacements' => [
|
||||
'/' => '',
|
||||
],
|
||||
],
|
||||
'generatorOptions' => ['fields' => ['title'], 'fieldSeparator' => '-', 'replacements' => ['/' => '']],
|
||||
'fallbackCharacter' => '-',
|
||||
'eval' => 'uniqueInPid',
|
||||
],
|
||||
],
|
||||
'subtitle' => [
|
||||
'label' => 'Subtitle',
|
||||
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim', 'default' => ''],
|
||||
],
|
||||
|
||||
// --------------------------------------------------------- List view
|
||||
'card_image' => [
|
||||
'label' => 'Card Image',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'common-image-types'],
|
||||
],
|
||||
'singlepid' => [
|
||||
'exclude' => false,
|
||||
'label' => 'Page ID of Success Story',
|
||||
'description' => 'LLL:EXT:vitec/Resources/Private/Language/locallang_db.xlf:tx_vitec_domain_model_download.title.description',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 30,
|
||||
'eval' => 'trim',
|
||||
'required' => false,
|
||||
'default' => '',
|
||||
],
|
||||
'customer_logo' => [
|
||||
'label' => 'Customer Logo',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'common-image-types'],
|
||||
],
|
||||
'teaser' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Short Teaser (optional)',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 30,
|
||||
'eval' => 'trim',
|
||||
'default' => '',
|
||||
],
|
||||
'teaser' => [
|
||||
'label' => 'Teaser',
|
||||
'config' => ['type' => 'text', 'cols' => 40, 'rows' => 4, 'eval' => 'trim'],
|
||||
],
|
||||
'subtitle' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Subtitle',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 30,
|
||||
'eval' => 'trim',
|
||||
'default' => '',
|
||||
],
|
||||
|
||||
// ------------------------------------------------------ Detail · Hero
|
||||
'hero_bgimage' => [
|
||||
'label' => 'Background Image',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'common-image-types'],
|
||||
],
|
||||
'hideonapp' => [
|
||||
'exclude' => true,
|
||||
'label' => 'If checked - Product will not be shown on App',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'items' => [
|
||||
[
|
||||
0 => '',
|
||||
1 => '',
|
||||
'invertStateDisplay' => false,
|
||||
],
|
||||
],
|
||||
],
|
||||
'hero_small_image' => [
|
||||
'label' => 'Small Image',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'common-image-types'],
|
||||
],
|
||||
'hideonwebsite' => [
|
||||
'exclude' => true,
|
||||
'label' => 'If checked - Product will not be shown on Website',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'items' => [
|
||||
[
|
||||
0 => '',
|
||||
1 => '',
|
||||
'invertStateDisplay' => false,
|
||||
],
|
||||
],
|
||||
],
|
||||
'hero_video' => [
|
||||
'label' => 'Video',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'mp4,webm,ogv,mov,m4v'],
|
||||
],
|
||||
'description' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Description',
|
||||
'config' => [
|
||||
'type' => 'text',
|
||||
'enableRichtext' => 'true',
|
||||
'eval' => 'trim',
|
||||
'default' => '',
|
||||
],
|
||||
'defaultExtras' => 'richtext:rte_transform[mode=ts_css]',
|
||||
'hero_overlay_color' => [
|
||||
'label' => 'Overlay Color',
|
||||
'config' => ['type' => 'color'],
|
||||
],
|
||||
'caseimage' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Case Image',
|
||||
'config' => [
|
||||
'type' => 'inline',
|
||||
'foreign_table' => 'sys_file_reference',
|
||||
'foreign_field' => 'uid_foreign',
|
||||
'foreign_sortby' => 'sorting_foreign',
|
||||
'foreign_table_field' => 'tablenames',
|
||||
'foreign_match_fields' => [
|
||||
'fieldname' => 'caseimage',
|
||||
],
|
||||
'foreign_label' => 'uid_local',
|
||||
'foreign_selector' => 'uid_local',
|
||||
'overrideChildTca' => [
|
||||
'columns' => [
|
||||
'uid_local' => [
|
||||
'config' => [
|
||||
'appearance' => [
|
||||
'elementBrowserType' => 'file',
|
||||
'elementBrowserAllowed' => 'jpg,jpeg,png,gif',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'types' => [
|
||||
'0' => [
|
||||
'showitem' => '
|
||||
--palette--;;imageoverlayPalette,
|
||||
--palette--;;filePalette',
|
||||
],
|
||||
],
|
||||
],
|
||||
'maxitems' => 1,
|
||||
'appearance' => [
|
||||
'headerThumbnail' => [
|
||||
'field' => 'uid_local',
|
||||
'width' => '45',
|
||||
'height' => '45',
|
||||
],
|
||||
'enabledControls' => [
|
||||
'info' => true,
|
||||
'new' => false,
|
||||
'dragdrop' => true,
|
||||
'sort' => false,
|
||||
'hide' => true,
|
||||
'delete' => true,
|
||||
],
|
||||
'fileUploadAllowed' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
'logoimage' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Customer Logo',
|
||||
'config' => [
|
||||
'type' => 'inline',
|
||||
'foreign_table' => 'sys_file_reference',
|
||||
'foreign_field' => 'uid_foreign',
|
||||
'foreign_sortby' => 'sorting_foreign',
|
||||
'foreign_table_field' => 'tablenames',
|
||||
'foreign_match_fields' => [
|
||||
'fieldname' => 'logoimage',
|
||||
],
|
||||
'foreign_label' => 'uid_local',
|
||||
'foreign_selector' => 'uid_local',
|
||||
'overrideChildTca' => [
|
||||
'columns' => [
|
||||
'uid_local' => [
|
||||
'config' => [
|
||||
'appearance' => [
|
||||
'elementBrowserType' => 'file',
|
||||
'elementBrowserAllowed' => 'jpg,jpeg,png,gif',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'types' => [
|
||||
'0' => [
|
||||
'showitem' => '
|
||||
--palette--;;imageoverlayPalette,
|
||||
--palette--;;filePalette',
|
||||
],
|
||||
],
|
||||
],
|
||||
'maxitems' => 1,
|
||||
'appearance' => [
|
||||
'headerThumbnail' => [
|
||||
'field' => 'uid_local',
|
||||
'width' => '45',
|
||||
'height' => '45',
|
||||
],
|
||||
'enabledControls' => [
|
||||
'info' => true,
|
||||
'new' => false,
|
||||
'dragdrop' => true,
|
||||
'sort' => false,
|
||||
'hide' => true,
|
||||
'delete' => true,
|
||||
],
|
||||
'fileUploadAllowed' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
'categories' => [
|
||||
'hero_overlay_opacity' => [
|
||||
'label' => 'Overlay Opacity (0–1)',
|
||||
'config' => [
|
||||
'type' => 'category'
|
||||
]
|
||||
'type' => 'number',
|
||||
'format' => 'decimal',
|
||||
'default' => 0,
|
||||
'range' => ['lower' => 0, 'upper' => 1],
|
||||
'slider' => ['step' => 0.05, 'width' => 200],
|
||||
],
|
||||
],
|
||||
|
||||
// --------------------------------------------------- Detail · Content
|
||||
'content_elements' => [
|
||||
'label' => 'Content Elements',
|
||||
'config' => [
|
||||
'type' => 'inline',
|
||||
'foreign_table' => 'tt_content',
|
||||
'foreign_field' => 'tx_vitec_usecase_content',
|
||||
'foreign_sortby' => 'sorting',
|
||||
'appearance' => [
|
||||
'collapseAll' => true,
|
||||
'expandSingle' => true,
|
||||
'levelLinksPosition' => 'top',
|
||||
'showSynchronizationLink' => false,
|
||||
'showAllLocalizationLink' => false,
|
||||
'showPossibleLocalizationRecords' => false,
|
||||
'useSortable' => true,
|
||||
],
|
||||
'overrideChildTca' => [
|
||||
'columns' => [
|
||||
'colPos' => ['config' => ['default' => 999]],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
// --------------------------------------------------- Detail · Related
|
||||
'market' => [
|
||||
'label' => 'Market',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'foreign_table' => 'tx_vitec_domain_model_market',
|
||||
'items' => [['label' => '', 'value' => 0]],
|
||||
'default' => 0,
|
||||
'maxitems' => 1,
|
||||
],
|
||||
],
|
||||
'solutions' => [
|
||||
'label' => 'Solutions',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectMultipleSideBySide',
|
||||
'foreign_table' => 'tx_vitec_domain_model_solution',
|
||||
'MM' => 'tx_vitec_usecase_solution_mm',
|
||||
'size' => 6,
|
||||
'autoSizeMax' => 20,
|
||||
'maxitems' => 9999,
|
||||
],
|
||||
],
|
||||
'products' => [
|
||||
'label' => 'Products',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectMultipleSideBySide',
|
||||
'foreign_table' => 'tx_vitec_domain_model_product',
|
||||
'MM' => 'tx_vitec_usecase_product_mm',
|
||||
'size' => 6,
|
||||
'autoSizeMax' => 20,
|
||||
'maxitems' => 9999,
|
||||
],
|
||||
],
|
||||
'categories' => ['config' => ['type' => 'category']],
|
||||
|
||||
// --------------------------------------------------------------- SEO
|
||||
'seo_title' => [
|
||||
'label' => 'SEO Title',
|
||||
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim'],
|
||||
],
|
||||
'seo_description' => [
|
||||
'label' => 'Meta Description',
|
||||
'config' => ['type' => 'text', 'cols' => 40, 'rows' => 3, 'eval' => 'trim'],
|
||||
],
|
||||
'no_index' => [
|
||||
'label' => 'No Index',
|
||||
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'items' => [['value' => '', 'label' => '']]],
|
||||
],
|
||||
'no_follow' => [
|
||||
'label' => 'No Follow',
|
||||
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'items' => [['value' => '', 'label' => '']]],
|
||||
],
|
||||
'canonical_link' => [
|
||||
'label' => 'Canonical URL',
|
||||
'config' => ['type' => 'link'],
|
||||
],
|
||||
'og_title' => [
|
||||
'label' => 'og:title',
|
||||
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim'],
|
||||
],
|
||||
'og_description' => [
|
||||
'label' => 'og:description',
|
||||
'config' => ['type' => 'text', 'cols' => 40, 'rows' => 3, 'eval' => 'trim'],
|
||||
],
|
||||
'og_image' => [
|
||||
'label' => 'og:image',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'common-image-types'],
|
||||
],
|
||||
'twitter_title' => [
|
||||
'label' => 'twitter:title',
|
||||
'config' => ['type' => 'input', 'size' => 40, 'eval' => 'trim'],
|
||||
],
|
||||
'twitter_description' => [
|
||||
'label' => 'twitter:description',
|
||||
'config' => ['type' => 'text', 'cols' => 40, 'rows' => 3, 'eval' => 'trim'],
|
||||
],
|
||||
'twitter_image' => [
|
||||
'label' => 'twitter:image',
|
||||
'config' => ['type' => 'file', 'maxitems' => 1, 'allowed' => 'common-image-types'],
|
||||
],
|
||||
|
||||
// -------------------------------------------------------- Appearance
|
||||
'layout_variant' => [
|
||||
'label' => 'Detail Layout',
|
||||
'config' => [
|
||||
'type' => 'select', 'renderType' => 'selectSingle', 'default' => 'standard',
|
||||
'items' => [
|
||||
['label' => 'Standard', 'value' => 'standard'],
|
||||
['label' => 'Wide', 'value' => 'wide'],
|
||||
['label' => 'Centered', 'value' => 'centered'],
|
||||
['label' => 'Media-first', 'value' => 'media_first'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'background_variant' => [
|
||||
'label' => 'Background',
|
||||
'config' => [
|
||||
'type' => 'select', 'renderType' => 'selectSingle', 'default' => 'none',
|
||||
'items' => [
|
||||
['label' => 'None', 'value' => 'none'],
|
||||
['label' => 'Orange', 'value' => 'orange'],
|
||||
['label' => 'Blue', 'value' => 'blue'],
|
||||
['label' => 'Graphite', 'value' => 'graphite'],
|
||||
['label' => 'Midnight', 'value' => 'midnight'],
|
||||
['label' => 'Light', 'value' => 'light'],
|
||||
['label' => 'Dark', 'value' => 'dark'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'accent_color' => [
|
||||
'label' => 'Accent Color',
|
||||
'config' => ['type' => 'color'],
|
||||
],
|
||||
'hideonwebsite' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Hide on Website',
|
||||
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'items' => [['value' => '', 'label' => '']]],
|
||||
],
|
||||
'hideonapp' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Hide on App',
|
||||
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'items' => [['value' => '', 'label' => '']]],
|
||||
],
|
||||
'featured' => [
|
||||
'label' => 'Featured',
|
||||
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'items' => [['value' => '', 'label' => '']]],
|
||||
],
|
||||
'show_related' => [
|
||||
'label' => 'Show Related section',
|
||||
'config' => ['type' => 'check', 'renderType' => 'checkboxToggle', 'default' => 1, 'items' => [['value' => '', 'label' => '']]],
|
||||
],
|
||||
'hero_layout' => [
|
||||
'label' => 'Hero Layout',
|
||||
'config' => [
|
||||
'type' => 'select', 'renderType' => 'selectSingle', 'default' => 'fullscreen',
|
||||
'items' => [
|
||||
['label' => 'Fullscreen', 'value' => 'fullscreen'],
|
||||
['label' => 'Medium', 'value' => 'md'],
|
||||
['label' => 'Small', 'value' => 'sm'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'text_theme' => [
|
||||
'label' => 'Text Theme',
|
||||
'config' => [
|
||||
'type' => 'select', 'renderType' => 'selectSingle', 'default' => 'light',
|
||||
'items' => [
|
||||
['label' => 'Light', 'value' => 'light'],
|
||||
['label' => 'Dark', 'value' => 'dark'],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
];
|
||||
Executable → Regular
+59
-5
@@ -2,6 +2,12 @@
|
||||
# VITEC container content elements — self-contained JSON rendering
|
||||
# Children collected via Evomedien\Vitec\DataProcessing\ContainerChildrenProcessor
|
||||
# (exception-safe; returns [] on any error, never crashes the outer CE).
|
||||
#
|
||||
# Per-column flex settings (align/justify) live on the PARENT record
|
||||
# (tx_vitec_col{1..4}_align/justify) and are attached by the processor to each
|
||||
# column in `items` (items[].config.align/justify) — so they apply to ALL
|
||||
# children of that column. The whole-grid gap (tx_vitec_gap) is emitted here as
|
||||
# the parent-level `gap`.
|
||||
# =============================================================================
|
||||
|
||||
tt_content.vitec_cols_50_50 = JSON
|
||||
@@ -70,9 +76,27 @@ tt_content.vitec_cols_50_50 {
|
||||
header.field = header
|
||||
subheader = TEXT
|
||||
subheader.field = subheader
|
||||
headerLayout = INT
|
||||
headerLayout.field = header_layout
|
||||
headerPosition = TEXT
|
||||
headerPosition.field = header_position
|
||||
headerLink = TEXT
|
||||
headerLink {
|
||||
htmlSpecialChars = 1
|
||||
typolink {
|
||||
parameter.field = header_link
|
||||
returnLast = result
|
||||
}
|
||||
}
|
||||
tx_vitec_bg_variant = TEXT
|
||||
tx_vitec_bg_variant.field = tx_vitec_bg_variant
|
||||
|
||||
# Parent-level: column gap scale (1–5) for the whole grid.
|
||||
gap = TEXT
|
||||
gap.field = tx_vitec_gap
|
||||
|
||||
# Columns with their children + per-column flex (align/justify) in
|
||||
# items[].config — assembled by ContainerChildrenProcessor.
|
||||
items = JSON
|
||||
items {
|
||||
dataProcessing {
|
||||
@@ -83,18 +107,48 @@ tt_content.vitec_cols_50_50 {
|
||||
}
|
||||
}
|
||||
|
||||
tt_content.vitec_cols_33_33_33 =< tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_25_25_25_25 =< tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_66_33 =< tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_33_66 =< tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_33_33_33 < tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_25_25_25_25 < tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_66_33 < tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cols_33_66 < tt_content.vitec_cols_50_50
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# VITEC · Container — single-column container with a custom CSS class.
|
||||
# Inherits the full structure of the grid containers and adds the `cssClass`
|
||||
# field, read from the element's FlexForm (settings.cssClass).
|
||||
# Single column -> no grid gap.
|
||||
# -----------------------------------------------------------------------------
|
||||
tt_content.vitec_container =< tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_container < tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_container.fields.gap >
|
||||
tt_content.vitec_container.fields.cssClass = TEXT
|
||||
tt_content.vitec_container.fields.cssClass.data = flexform:pi_flexform:settings.cssClass
|
||||
tt_content.vitec_container.fields.cssClass.stdWrap.ifEmpty.cObject = TEXT
|
||||
tt_content.vitec_container.fields.cssClass.stdWrap.ifEmpty.cObject.value =
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# VITEC · Cards Carousel — container whose children (typically vitec_card
|
||||
# elements) become the slides. Inherits the grid-container JSON structure
|
||||
# (`items` via ContainerChildrenProcessor) and adds carousel settings read
|
||||
# from the element's FlexForm. Single slide track -> no grid gap.
|
||||
# -----------------------------------------------------------------------------
|
||||
tt_content.vitec_cards_carousel < tt_content.vitec_cols_50_50
|
||||
tt_content.vitec_cards_carousel.fields.gap >
|
||||
tt_content.vitec_cards_carousel.fields.carousel = JSON
|
||||
tt_content.vitec_cards_carousel.fields.carousel {
|
||||
fields {
|
||||
slidesPerView = TEXT
|
||||
slidesPerView.data = flexform:pi_flexform:settings.slidesperview
|
||||
showArrows = TEXT
|
||||
showArrows.data = flexform:pi_flexform:settings.showarrows
|
||||
showIndicators = TEXT
|
||||
showIndicators.data = flexform:pi_flexform:settings.showindicators
|
||||
loop = TEXT
|
||||
loop.data = flexform:pi_flexform:settings.loop
|
||||
autoplay = TEXT
|
||||
autoplay.data = flexform:pi_flexform:settings.autoplay
|
||||
autoplayInterval = TEXT
|
||||
autoplayInterval.data = flexform:pi_flexform:settings.autoplayinterval
|
||||
}
|
||||
}
|
||||
tt_content.vitec_cards_carousel.fields.cssClass = TEXT
|
||||
tt_content.vitec_cards_carousel.fields.cssClass.data = flexform:pi_flexform:settings.cssClass
|
||||
Executable → Regular
File mode changed.
@@ -0,0 +1,30 @@
|
||||
# =============================================================================
|
||||
# VITEC news integration — headless JSON output
|
||||
#
|
||||
# All supported EXT:news content element types use the same JSON renderer.
|
||||
# The renderer returns a stable payload with:
|
||||
# - mode = list | detail
|
||||
# - items/news = serialised records
|
||||
# - settings = the relevant FlexForm settings for the frontend
|
||||
# =============================================================================
|
||||
|
||||
tt_content.news_pi1 =< lib.contentElementWithHeader
|
||||
tt_content.news_pi1 {
|
||||
fields {
|
||||
content {
|
||||
fields {
|
||||
news = USER
|
||||
news.userFunc = Evomedien\Vitec\UserFunc\NewsJsonRenderer->render
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tt_content.news_newsliststicky < tt_content.news_pi1
|
||||
tt_content.news_newsselectedlist < tt_content.news_pi1
|
||||
tt_content.news_newsdetail < tt_content.news_pi1
|
||||
tt_content.news_newsdatemenu < tt_content.news_pi1
|
||||
tt_content.news_categorylist < tt_content.news_pi1
|
||||
tt_content.news_newssearchform < tt_content.news_pi1
|
||||
tt_content.news_newssearchresult < tt_content.news_pi1
|
||||
tt_content.news_taglist < tt_content.news_pi1
|
||||
Executable → Regular
+15
@@ -80,6 +80,14 @@ mod {
|
||||
CType = vitec_datasheets
|
||||
}
|
||||
}
|
||||
eventlist {
|
||||
iconIdentifier = vitec-plugin-eventlist
|
||||
title = VITEC Event List
|
||||
description = Upcoming VITEC events (trade shows) with date, venue, booth and links
|
||||
tt_content_defValues {
|
||||
CType = vitec_eventlist
|
||||
}
|
||||
}
|
||||
simplecard {
|
||||
iconIdentifier = vitec-plugin-simplecard
|
||||
title = Simple Card
|
||||
@@ -97,6 +105,13 @@ mod {
|
||||
}
|
||||
}
|
||||
|
||||
tx_news.templateLayouts {
|
||||
1 = Compact List
|
||||
2 = Featured Story
|
||||
3 = Editorial Grid
|
||||
4 = Detail Spotlight
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Backend Previews für klassische Plugins (list_type)
|
||||
############################################################
|
||||
|
||||
Reference in new issue
Block a user