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
@@ -95,6 +95,13 @@ final class ProductTextImportController
|
||||
'description' => 'c:Product Introduction#1:body',
|
||||
'description2' => 'c:Product Overview — H2#1:body',
|
||||
'capabilities' => 'g:Key Capability Group',
|
||||
// Decisions 2026-09-18 (field walkthrough completed): the new
|
||||
// 'Technical Highlight' spec rows and the Why-Choose benefit cards
|
||||
// each compose into one block; meta description is trimmed from the
|
||||
// intro because the SEO sheet still ships none.
|
||||
'highlights' => 'g:Technical Highlight',
|
||||
'applications' => 'g:Why Choose Card',
|
||||
'seometa' => 'x:seometa',
|
||||
'textrelatedproducts' => 'p:Related Products — H2#1',
|
||||
'keywords' => 'm:primaryKeyword',
|
||||
];
|
||||
@@ -372,7 +379,12 @@ final class ProductTextImportController
|
||||
}
|
||||
|
||||
if (!empty($body['saveMapping'])) {
|
||||
$this->mappingRepository->save(self::MAPPING_KEY, array_filter($map), '-');
|
||||
// Merge instead of overwrite: a field whose dropdown was empty on
|
||||
// THIS submit keeps its stored selector (this is how `teaser` got
|
||||
// lost once). Clearing a mapping on purpose means picking another
|
||||
// source, not leaving the select blank.
|
||||
$stored = $this->mappingRepository->load(self::MAPPING_KEY)['mapping'] ?? [];
|
||||
$this->mappingRepository->save(self::MAPPING_KEY, array_filter($map) + $stored, '-');
|
||||
}
|
||||
|
||||
$summary = [];
|
||||
|
||||
Reference in new issue
Block a user