Product texts: mapping completed; product model: solutions + resources
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/datasheet), editable card title
and text, an icon (free text with a value-picker seed set) and one
link (page/url/file/record via the link wizard, so the Download tab
works too). Deliberately no Extbase model: only the UserFunc path
reads the rows.
- JSON `resources` (detail payload only, like heroimage): list envelope
{layout, items[]}; a card whose link is empty or unresolvable is not
emitted; layout switches to carousel above three cards
- spec raised to v1.18 (7.15 member table, 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>
This commit is contained in:
1 parent
4a7ea387a0
commit
3df66b1353
9 files changed
+394
-4
No files matched your search
@@ -23,7 +23,8 @@ return [
|
||||
],
|
||||
],
|
||||
'types' => [
|
||||
'1' => ['showitem' => 'title, subtitle, slug, teaser, description, description2, applications, capabilities, highlights, contentelement, contentelementcta, downloads, portfolio, showdatapath, textrelatedproducts, relatedprodukt,
|
||||
'1' => ['showitem' => 'title, subtitle, slug, teaser, description, description2, applications, capabilities, highlights, contentelement, contentelementcta, downloads, portfolio, showdatapath, textrelatedproducts, relatedprodukt, solutions,
|
||||
--div--;Resources, resources,
|
||||
--div--;SEO, seotitle, urltitle, seometa, keywords, structureddata,
|
||||
--div--;Images and Videos, heroimage, productimage, ogimage, video, videofile,
|
||||
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories,
|
||||
@@ -431,6 +432,37 @@ return [
|
||||
'enableMultiSelectFilterTextfield' => true, // Optional: Adds a search box for filtering
|
||||
],
|
||||
],
|
||||
'solutions' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Related Solutions',
|
||||
'description' => 'Solutions this product belongs to - emitted as solution cards',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectMultipleSideBySide',
|
||||
'foreign_table' => 'tx_vitec_domain_model_solution',
|
||||
'MM' => 'tx_vitec_product_solution_mm',
|
||||
'size' => 10,
|
||||
'maxitems' => 9999,
|
||||
'minitems' => 0,
|
||||
'enableMultiSelectFilterTextfield' => true,
|
||||
],
|
||||
],
|
||||
'resources' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Resources',
|
||||
'description' => 'Resource cards (documentation, support, datasheet) on the product detail page. A card without a link is not emitted.',
|
||||
'config' => [
|
||||
'type' => 'inline',
|
||||
'foreign_table' => 'tx_vitec_product_resource',
|
||||
'foreign_field' => 'product',
|
||||
'foreign_sortby' => 'sorting',
|
||||
'appearance' => [
|
||||
'collapseAll' => true,
|
||||
'levelLinksPosition' => 'top',
|
||||
'useSortable' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
'productimage' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Product Image(s)',
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Resource cards on the product's Resources tab (decision 2026-09-24):
|
||||
* documentation / support / datasheet entries, several per type, each an
|
||||
* editable card (title, text, icon) around one link. Child table of
|
||||
* tx_vitec_domain_model_product via the `resources` inline field - edited
|
||||
* only there (hideTable), no Extbase model on purpose: the headless
|
||||
* renderers query the rows directly, the Extbase path never touches them.
|
||||
*/
|
||||
return [
|
||||
'ctrl' => [
|
||||
'title' => 'Product Resource',
|
||||
'label' => 'title',
|
||||
'label_alt' => 'restype',
|
||||
'label_alt_force' => true,
|
||||
'tstamp' => 'tstamp',
|
||||
'crdate' => 'crdate',
|
||||
'delete' => 'deleted',
|
||||
'sortby' => 'sorting',
|
||||
'hideTable' => true,
|
||||
'enablecolumns' => [
|
||||
'disabled' => 'hidden',
|
||||
],
|
||||
'iconfile' => 'EXT:vitec/Resources/Public/Icons/tx_vitec_domain_model_download.gif',
|
||||
'security' => [
|
||||
'ignorePageTypeRestriction' => true,
|
||||
],
|
||||
],
|
||||
'types' => [
|
||||
'1' => ['showitem' => 'restype, title, cardtext, icon, link, hidden'],
|
||||
],
|
||||
'columns' => [
|
||||
'hidden' => [
|
||||
'exclude' => true,
|
||||
'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.visible',
|
||||
'config' => [
|
||||
'type' => 'check',
|
||||
'renderType' => 'checkboxToggle',
|
||||
'items' => [
|
||||
[
|
||||
'label' => '',
|
||||
'invertStateDisplay' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'product' => [
|
||||
'config' => [
|
||||
'type' => 'passthrough',
|
||||
],
|
||||
],
|
||||
'restype' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Type',
|
||||
'config' => [
|
||||
'type' => 'select',
|
||||
'renderType' => 'selectSingle',
|
||||
'items' => [
|
||||
['label' => 'Product Documentation', 'value' => 'documentation'],
|
||||
['label' => 'Technical Support', 'value' => 'support'],
|
||||
['label' => 'Datasheet', 'value' => 'datasheet'],
|
||||
],
|
||||
'default' => 'documentation',
|
||||
],
|
||||
],
|
||||
'title' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Card title',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 40,
|
||||
'eval' => 'trim',
|
||||
'default' => '',
|
||||
],
|
||||
],
|
||||
'cardtext' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Card text',
|
||||
'config' => [
|
||||
'type' => 'text',
|
||||
'cols' => 40,
|
||||
'rows' => 3,
|
||||
'eval' => 'trim',
|
||||
],
|
||||
],
|
||||
'icon' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Icon',
|
||||
'description' => 'Icon identifier as used by the front end. Free text; the picker offers the seed set.',
|
||||
'config' => [
|
||||
'type' => 'input',
|
||||
'size' => 20,
|
||||
'eval' => 'trim',
|
||||
'default' => '',
|
||||
'valuePicker' => [
|
||||
'items' => [
|
||||
['label' => 'Document', 'value' => 'document'],
|
||||
['label' => 'Support', 'value' => 'support'],
|
||||
['label' => 'Datasheet', 'value' => 'datasheet'],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'link' => [
|
||||
'exclude' => true,
|
||||
'label' => 'Link',
|
||||
'description' => 'Page, external URL, file or a Download record (link browser tab "Download"). A card without a link is not emitted to the front end.',
|
||||
'config' => [
|
||||
'type' => 'link',
|
||||
'allowedTypes' => ['page', 'url', 'file', 'record'],
|
||||
'size' => 50,
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
Reference in new issue
Block a user