Two work packages, one deploy.
Workbook field mapping completed (2026-09-18)
- highlights <- g:Technical Highlight (new spec-row component of the
full agency delivery; composeGroup() is generic, no change needed)
- applications <- g:Why Choose Card (benefit cards as one block)
- seometa <- new composed source x:seometa (Introduction body trimmed
at a word boundary to ~155 chars - the SEO sheet ships no meta
description, a trimmed intro beats an empty tag)
- teaser stays the hero one-liner, settling the varchar(255) question
- fix: "Save mapping" now merges over the stored mapping instead of
overwriting it - an empty dropdown no longer wipes a stored selector
Product model: solutions relation and Resources tab (2026-09-24)
- closes the gaps the full workbook walkthrough exposed (rows the
import deliberately skips because the model had no place for them)
- solutions: MM multi select to tx_vitec_domain_model_solution
(tx_vitec_product_solution_mm, relatedprodukt pattern), emitted by
both product renderers as solution cards in the shared shape
- Resources tab: inline child table tx_vitec_product_resource - per
entry a type (documentation/support), an editable card title/text,
an icon (free text with a value-picker seed set) and one link
(page/url/file/record via the link wizard). Deliberately no Extbase
model: only the UserFunc path reads the rows.
- datasheets: own MM selection of download records below the resource
list (tx_vitec_product_datasheet_mm); emitted into the SAME
resources envelope as ready-made type=datasheet cards (title/teaser/
icon from the record, url = the public /download/<slug> route, uid
fallback - private/hidden downloads 404 as everywhere)
- JSON `resources` (detail payload only, like heroimage): list envelope
{layout, items[]}; a hand-written card whose link is empty or
unresolvable is not emitted; layout switches to carousel above three
cards in total
- solutions hybrid (same day, after analysing all 100 workbooks: their
Solution Cards reference the 8 GROUPS in 98% of cases): new is_group
flag on the solution model, new idempotent CLI
vitec:create-solution-groups (8 group records; title source is
AlignSolutionsCommand::TARGET - now public -, category = the group's
own category, detail_page = the /solutions group page with -N
disambiguation). Group records are invisible to the solution list
and to vitec:align-solutions and only selectable in the product
relation; product solution cards carry isGroup
- spec raised to v1.18 (7.15 member table, 7.13.3 note, revision row;
the footer had been stuck at v1.15 since 1.16/1.17)
Requires on the server:
vendor/bin/typo3 database:updateschema "*.add,*.change"
vendor/bin/typo3 cache:flush
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
248 lines
9.6 KiB
PHP
248 lines
9.6 KiB
PHP
<?php
|
|
return [
|
|
'ctrl' => [
|
|
'title' => 'VITEC Solution',
|
|
'label' => 'title',
|
|
'tstamp' => 'tstamp',
|
|
'crdate' => 'crdate',
|
|
'cruser_id' => 'cruser_id',
|
|
'versioningWS' => true,
|
|
'languageField' => 'sys_language_uid',
|
|
'transOrigPointerField' => 'l10n_parent',
|
|
'transOrigDiffSourceField' => 'l10n_diffsource',
|
|
'delete' => 'deleted',
|
|
'enablecolumns' => [
|
|
'disabled' => 'hidden',
|
|
'starttime' => 'starttime',
|
|
'endtime' => 'endtime',
|
|
],
|
|
'searchFields' => 'title,subtitle,teaser',
|
|
'iconfile' => 'EXT:vitec/Resources/Public/Icons/tx_vitec_domain_model_solution.gif',
|
|
'security' => [
|
|
'ignorePageTypeRestriction' => true,
|
|
],
|
|
],
|
|
'types' => [
|
|
'1' => [
|
|
'showitem' => 'title, slug, detail_page, is_group, subtitle, teaser, description, image,
|
|
--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' => [
|
|
['', 0],
|
|
],
|
|
'foreign_table' => 'tx_vitec_domain_model_solution',
|
|
'foreign_table_where' => 'AND {#tx_vitec_domain_model_solution}.{#pid}=###CURRENT_PID### AND {#tx_vitec_domain_model_solution}.{#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' => [
|
|
[
|
|
0 => '',
|
|
1 => '',
|
|
'invertStateDisplay' => true,
|
|
],
|
|
],
|
|
],
|
|
],
|
|
'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,
|
|
],
|
|
],
|
|
],
|
|
'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,
|
|
],
|
|
],
|
|
],
|
|
'title' => [
|
|
'exclude' => false,
|
|
'label' => 'Title',
|
|
'config' => [
|
|
'type' => 'input',
|
|
'size' => 30,
|
|
'eval' => 'trim',
|
|
'required' => true,
|
|
'default' => '',
|
|
],
|
|
],
|
|
'slug' => [
|
|
'exclude' => false,
|
|
'label' => 'URL Segment',
|
|
'config' => [
|
|
'type' => 'slug',
|
|
'size' => 50,
|
|
'generatorOptions' => [
|
|
'fields' => ['title'],
|
|
'fieldSeparator' => '-',
|
|
'replacements' => [
|
|
'/' => '',
|
|
],
|
|
],
|
|
'fallbackCharacter' => '-',
|
|
'eval' => 'uniqueInPid',
|
|
],
|
|
],
|
|
'detail_page' => [
|
|
'exclude' => true,
|
|
'label' => 'Detail Page',
|
|
'description' => 'Page that presents this solution. Resolved to a URL in the JSON output; leave empty for no link.',
|
|
'config' => [
|
|
'type' => 'group',
|
|
'allowed' => 'pages',
|
|
'size' => 1,
|
|
'maxitems' => 1,
|
|
],
|
|
],
|
|
'is_group' => [
|
|
'exclude' => true,
|
|
'label' => 'Is Group',
|
|
'description' => 'Group-level record (one of the 8 solution groups, hybrid decision 2026-09-24). Kept out of solution lists and vitec:align-solutions; selectable in the product "Related Solutions" field.',
|
|
'config' => [
|
|
'type' => 'check',
|
|
'renderType' => 'checkboxToggle',
|
|
'default' => 0,
|
|
],
|
|
],
|
|
'subtitle' => [
|
|
'exclude' => true,
|
|
'label' => 'Subtitle',
|
|
'config' => [
|
|
'type' => 'input',
|
|
'size' => 30,
|
|
'eval' => 'trim',
|
|
'default' => '',
|
|
],
|
|
],
|
|
'teaser' => [
|
|
'exclude' => true,
|
|
'label' => 'Short Teaser (optional)',
|
|
'config' => [
|
|
'type' => 'input',
|
|
'size' => 30,
|
|
'eval' => 'trim',
|
|
'default' => '',
|
|
],
|
|
],
|
|
'description' => [
|
|
'exclude' => true,
|
|
'label' => 'Description',
|
|
'config' => [
|
|
'type' => 'text',
|
|
'enableRichtext' => true,
|
|
'eval' => 'trim',
|
|
'default' => '',
|
|
],
|
|
'defaultExtras' => 'richtext:rte_transform[mode=ts_css]',
|
|
],
|
|
'categories' => [
|
|
'config' => [
|
|
'type' => 'category',
|
|
],
|
|
],
|
|
'image' => [
|
|
'exclude' => true,
|
|
'label' => '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' => 'image',
|
|
],
|
|
'foreign_label' => 'uid_local',
|
|
'foreign_selector' => 'uid_local',
|
|
'overrideChildTca' => [
|
|
'columns' => [
|
|
'crop' => [
|
|
'config' => [
|
|
'cropVariants' => \Evomedien\Vitec\Tca\CropVariants::firstImage(),
|
|
],
|
|
],
|
|
'uid_local' => [
|
|
'config' => [
|
|
'appearance' => [
|
|
'elementBrowserType' => 'file',
|
|
'elementBrowserAllowed' => 'jpg,jpeg,png,gif,webp,svg',
|
|
],
|
|
],
|
|
],
|
|
],
|
|
'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,
|
|
],
|
|
],
|
|
],
|
|
],
|
|
];
|