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:
orascheandClaude Fable 5 committed 2026-09-24 14:15:43 +02:00
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,
],
],
],
];