Product detail CR: resources band layout select, fields parked in Misc

- customer change request (2026-10-26): Resources = Downloads, the
  detail band is simplified - capabilities leave the section, Technical
  Highlights move left, the resource cards into the right column
  (frontend already built on dev.vitec.com)
- TCA: capabilities, datasheets and downloads moved to the Misc tab -
  parked, not removed; their JSON keys are unchanged. The planned
  automatic newest-datasheet/documentation cards stay deferred by
  request (the download route already serves the newest file per
  Collateral convention, so the foundation is there)
- new resources_layout select on the Resources tab, English label and
  description: Layout 1 = 50-50 (default, highlights left / cards
  right), Layout 2 = 33-33-33 (highlights over two columns, cards in
  the third); ext_tables.sql column added
- the manual resource card restype vocabulary gains Datasheet and
  Brochure (select items plus icon picker seeds, no code change - the
  renderer passes restype through as type): an editor can pin a single
  datasheet card by linking the download record, which stays current
  because the download route always serves the newest file
- ProductShowJsonRenderer: the resources envelope gains sectionLayout
  ('50-50'|'33-33-33'); verified live - Diamond-H delivers 33-33-33,
  untouched products the 50-50 default, layout/items unchanged
- spec bumped to v1.26 (additive revision row, field table 7.15.1),
  mirrored; frontend briefing notes the new key

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
orascheandClaude Fable 5 committed 2026-10-26 19:36:18 +01:00
1 parent 8adbe8cc90
commit 46049bf30d
5 files changed
+42 -12

No files matched your search

@@ -255,7 +255,12 @@ class ProductShowJsonRenderer
'solutions' => $this->getProductSolutions($uid), 'solutions' => $this->getProductSolutions($uid),
// Detail-only like heroimage: resource cards are detail-page // Detail-only like heroimage: resource cards are detail-page
// furniture a list never shows. // furniture a list never shows.
'resources' => $this->getProductResources($uid), 'resources' => array_merge(
$this->getProductResources($uid),
// Section layout (customer CR 2026-10-26): how the front end
// arranges the Technical Highlights / Resources band.
['sectionLayout' => (string)(($product['resources_layout'] ?? '') ?: '50-50')]
),
]; ];
// schema.org JSON-LD (Product + optional VideoObject) as a ready-to-emit // schema.org JSON-LD (Product + optional VideoObject) as a ready-to-emit
@@ -23,13 +23,13 @@ return [
], ],
], ],
'types' => [ 'types' => [
'1' => ['showitem' => 'title, subtitle, slug, teaser, description, description2, applications, capabilities, highlights, contentelement, contentelementcta, portfolio, showdatapath, textrelatedproducts, relatedprodukt, related_texts, solutions, '1' => ['showitem' => 'title, subtitle, slug, teaser, description, description2, applications, highlights, contentelement, contentelementcta, portfolio, showdatapath, textrelatedproducts, relatedprodukt, related_texts, solutions,
--div--;Resources, resources, datasheets, downloads, --div--;Resources, resources, resources_layout,
--div--;SEO, seotitle, urltitle, seometa, keywords, structureddata, --div--;SEO, seotitle, urltitle, seometa, keywords, structureddata,
--div--;Images and Videos, heroimage, productimage, ogimage, video, videofile, --div--;Images and Videos, heroimage, productimage, ogimage, video, videofile,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories,
--div--;Visibility, hideonapp, hideonwebsite, hideondatasheets, hideonproducts, shortcut, shortcutpid, --div--;Visibility, hideonapp, hideonwebsite, hideondatasheets, hideonproducts, shortcut, shortcutpid,
--div--;Misc, legacy, supportproduct, subproduct, --div--;Misc, capabilities, datasheets, downloads, legacy, supportproduct, subproduct,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime'], --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime'],
], ],
'columns' => [ 'columns' => [
@@ -465,6 +465,23 @@ return [
'enableMultiSelectFilterTextfield' => true, 'enableMultiSelectFilterTextfield' => true,
], ],
], ],
// Resources band layout (customer CR 2026-10-26): the detail page pairs
// the Technical Highlights with the resource cards; capabilities left the
// band (field parked in the Misc tab, still in the JSON for now).
'resources_layout' => [
'exclude' => true,
'label' => 'Resources Section Layout',
'description' => 'How the detail page arranges the Technical Highlights / Resources band. Layout 1 (default): Technical Highlights on the left, resource cards on the right (50/50). Layout 2: Technical Highlights spread over two columns, resource cards in the third (33/33/33).',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'default' => '50-50',
'items' => [
['label' => 'Layout 1 - 50/50 (Technical Highlights left, Resources right)', 'value' => '50-50'],
['label' => 'Layout 2 - 33/33/33 (Technical Highlights in two columns, Resources in the third)', 'value' => '33-33-33'],
],
],
],
'resources' => [ 'resources' => [
'exclude' => true, 'exclude' => true,
'label' => 'Resources', 'label' => 'Resources',
@@ -2,10 +2,12 @@
/** /**
* Resource cards on the product's Resources tab (decision 2026-09-24): * Resource cards on the product's Resources tab (decision 2026-09-24):
* documentation / support entries, several per type, each an editable card * documentation / support / datasheet / brochure entries, several per type,
* (title, text, icon) around one link. Datasheets are NOT an option here - * each an editable card (title, text, icon) around one link. A manual
* they are the `datasheets` MM selection of download records next to this * datasheet card links the download record directly - the download route
* list and join the same JSON envelope as ready-made cards. Child table of * always serves the newest file, so the card never goes stale. The old
* `datasheets` MM selection next to this list still joins the same JSON
* envelope but is parked in the Misc tab (CR 2026-10-26). Child table of
* tx_vitec_domain_model_product via the `resources` inline field - edited * tx_vitec_domain_model_product via the `resources` inline field - edited
* only there (hideTable), no Extbase model on purpose: the headless * only there (hideTable), no Extbase model on purpose: the headless
* renderers query the rows directly, the Extbase path never touches them. * renderers query the rows directly, the Extbase path never touches them.
@@ -61,6 +63,8 @@ return [
'items' => [ 'items' => [
['label' => 'Product Documentation', 'value' => 'documentation'], ['label' => 'Product Documentation', 'value' => 'documentation'],
['label' => 'Technical Support', 'value' => 'support'], ['label' => 'Technical Support', 'value' => 'support'],
['label' => 'Datasheet', 'value' => 'datasheet'],
['label' => 'Brochure', 'value' => 'brochure'],
], ],
'default' => 'documentation', 'default' => 'documentation',
], ],
@@ -98,6 +102,8 @@ return [
'items' => [ 'items' => [
['label' => 'Document', 'value' => 'document'], ['label' => 'Document', 'value' => 'document'],
['label' => 'Support', 'value' => 'support'], ['label' => 'Support', 'value' => 'support'],
['label' => 'Datasheet', 'value' => 'datasheet'],
['label' => 'Brochure', 'value' => 'brochure'],
], ],
], ],
], ],
@@ -3,9 +3,9 @@
| | | | | |
|---|---| |---|---|
| **Document identifier** | EVO‑VITEC‑HL‑001 | | **Document identifier** | EVO‑VITEC‑HL‑001 |
| **Version** | 1.25 | | **Version** | 1.26 |
| **Status** | Released | | **Status** | Released |
| **Date** | 2026‑10‑23 | | **Date** | 2026‑10‑26 |
| **Applies to** | `evomedien/vitec` on TYPO3 v14.3 (headless) | | **Applies to** | `evomedien/vitec` on TYPO3 v14.3 (headless) |
| **Owner** | evomedien — VITEC relaunch | | **Owner** | evomedien — VITEC relaunch |
@@ -38,6 +38,7 @@
| 1.23 | 2026‑10‑09 | **New interface (additive).** Product type-ahead for the megamenu catalog panel: lean page type `?type=7385&q=` (7.16) returning `suggestions` and up to six product cards via Solr, last term completed as a prefix. The megamenu gained the panel layout `catalog`, filled by the VITEC listener `ProvideProductCatalog` (main categories → subcategory groups → products with one-line teasers). | | 1.23 | 2026‑10‑09 | **New interface (additive).** Product type-ahead for the megamenu catalog panel: lean page type `?type=7385&q=` (7.16) returning `suggestions` and up to six product cards via Solr, last term completed as a prefix. The megamenu gained the panel layout `catalog`, filled by the VITEC listener `ProvideProductCatalog` (main categories → subcategory groups → products with one-line teasers). |
| 1.24 | 2026‑10‑23 | **Interface change (additive).** New frontend layout **22 Solution Group Page** for the eight solution group hero pages (zones hero = `colPos1`, main = `colPos0`). Element order: `vitec_markethero` + `vitec_introparagraph` in the hero zone; `vitec_marketintro` 2, `vitec_introparagraph` + 4 `text_only` cards (challenges), `vitec_introparagraph` + 4 alternating `horizontal`/`horizontal_reverse` cards (capabilities, bullets as `<ul>`), `vitec_usecaselist` (testimonials, shipped hidden until stories are picked), `vitec_marketinsights`, `vitec_ctabanner` in main — imported from the agency Template‑06 workbooks by `vitec:import-solution-group-workbooks`; page properties as on the sub‑solution pages. | | 1.24 | 2026‑10‑23 | **Interface change (additive).** New frontend layout **22 Solution Group Page** for the eight solution group hero pages (zones hero = `colPos1`, main = `colPos0`). Element order: `vitec_markethero` + `vitec_introparagraph` in the hero zone; `vitec_marketintro` 2, `vitec_introparagraph` + 4 `text_only` cards (challenges), `vitec_introparagraph` + 4 alternating `horizontal`/`horizontal_reverse` cards (capabilities, bullets as `<ul>`), `vitec_usecaselist` (testimonials, shipped hidden until stories are picked), `vitec_marketinsights`, `vitec_ctabanner` in main — imported from the agency Template‑06 workbooks by `vitec:import-solution-group-workbooks`; page properties as on the sub‑solution pages. |
| 1.25 | 2026‑10‑23 | **Interface change (additive).** The markets branch is aligned with the agreed agency structure: `/markets` eleven market hero pages their sub‑market pages (the use‑case level stays sections per 7.17). New frontend layout **23 Market Hero Page** (zones hero = `colPos1`, main = `colPos0`): `vitec_markethero` (CTA anchors `#submarkets`) + `vitec_introparagraph` (header carries the hero H1) in the hero zone; `vitec_marketintro`, `vitec_introparagraph`, sub‑market `vitec_card`s whose `primary_cta` links the child page, `vitec_ctabanner` in main (`vitec_customerlogos` and `vitec_usecaselist` ship hidden until filled editorially). Imported by `vitec:import-market-hero-workbooks`; the tree itself by `vitec:align-market-pages` (renames with slug redirects, child slugs normalised — this also repairs embedded‑slash slugs). Sub‑market pages gained the full page‑properties set. | | 1.25 | 2026‑10‑23 | **Interface change (additive).** The markets branch is aligned with the agreed agency structure: `/markets` eleven market hero pages their sub‑market pages (the use‑case level stays sections per 7.17). New frontend layout **23 Market Hero Page** (zones hero = `colPos1`, main = `colPos0`): `vitec_markethero` (CTA anchors `#submarkets`) + `vitec_introparagraph` (header carries the hero H1) in the hero zone; `vitec_marketintro`, `vitec_introparagraph`, sub‑market `vitec_card`s whose `primary_cta` links the child page, `vitec_ctabanner` in main (`vitec_customerlogos` and `vitec_usecaselist` ship hidden until filled editorially). Imported by `vitec:import-market-hero-workbooks`; the tree itself by `vitec:align-market-pages` (renames with slug redirects, child slugs normalised — this also repairs embedded‑slash slugs). Sub‑market pages gained the full page‑properties set. |
| 1.26 | 2026‑10‑26 | **Interface change (additive).** Product detail resources band simplified (customer CR): the `resources` envelope gains **`sectionLayout`** — `50-50` (default) \| `33-33-33` — from the new per‑product select *Resources Section Layout* (Layout 1: Technical Highlights left, resource cards right, 50/50; Layout 2: highlights over two columns, cards in the third). Capabilities leave the band editorially; the TCA fields `capabilities`, `datasheets` and `downloads` are parked in the Misc tab — all three stay in the payload unchanged. The automatic newest‑datasheet/documentation cards remain deferred; meanwhile the manual card `restype` vocabulary gains `datasheet` and `brochure` — a pinned datasheet card links the download record and stays current because the download route always serves the newest file. |
This document is drafted in the style of, and adopts the terminology conventions of, This document is drafted in the style of, and adopts the terminology conventions of,
ISO/IEC/IEEE 42010 (architecture description), ISO/IEC/IEEE 26514 (information for ISO/IEC/IEEE 42010 (architecture description), ISO/IEC/IEEE 26514 (information for
@@ -933,7 +934,7 @@ Produced by `ProductShowJsonRenderer::serializeProduct()`. Members:
| `ogimage`, `videofile` | object \| null | FAL singletons | | `ogimage`, `videofile` | object \| null | FAL singletons |
| `relatedprodukt` | array | card shape `{uid, title, slug, subtitle, teaser, description, link, images}`, backend order | | `relatedprodukt` | array | card shape `{uid, title, slug, subtitle, teaser, description, link, images}`, backend order |
| `solutions` | array | solution card shape `{uid, title, slug, subtitle, teaser, description, detailUrl, isGroup, image}` via `tx_vitec_product_solution_mm`, backend order; an editor may select individual Generic Solutions or the eight group‑level records (`isGroup: true`, linking to the group page) | | `solutions` | array | solution card shape `{uid, title, slug, subtitle, teaser, description, detailUrl, isGroup, image}` via `tx_vitec_product_solution_mm`, backend order; an editor may select individual Generic Solutions or the eight group‑level records (`isGroup: true`, linking to the group page) |
| `resources` | object | list envelope `{layout, items[]}`: hand‑written cards (`type` `documentation\|support`, `title`, `text`, `icon`, resolved `url` per 9.12; a card without a resolvable link is dropped) followed by the `datasheets` MM selection of download records as `type: datasheet` cards (title/teaser/icon from the record, `url` = the public download route); `layout` is `carousel` above three cards in total — **detail payload only** | | `resources` | object | list envelope `{layout, items[]}`: hand‑written cards (`type` `documentation\|support\|datasheet\|brochure`, `title`, `text`, `icon`, resolved `url` per 9.12; a card without a resolvable link is dropped) followed by the `datasheets` MM selection of download records as `type: datasheet` cards (title/teaser/icon from the record, `url` = the public download route); `layout` is `carousel` above three cards in total; `sectionLayout` (`50-50` default \| `33-33-33`) mirrors the per‑product *Resources Section Layout* select — how the front end arranges the Technical Highlights / Resources band (1.26) — **detail payload only** |
| `jsonLd` | string | ready‑to‑emit schema.org `@graph` (6.6), detail only | | `jsonLd` | string | ready‑to‑emit schema.org `@graph` (6.6), detail only |
#### 7.15.2 List payload (`vitec_productlist`, key `products`) #### 7.15.2 List payload (`vitec_productlist`, key `products`)
@@ -1614,4 +1615,4 @@ remediation.
- Header convention — the uniform header section across CEs, plugins and containers. - Header convention — the uniform header section across CEs, plugins and containers.
- `Configuration/Sets/Vitecset/setup.typoscript` — the single TypoScript entry point. - `Configuration/Sets/Vitecset/setup.typoscript` — the single TypoScript entry point.
*End of document EVO‑VITEC‑HL‑001 v1.25.* *End of document EVO‑VITEC‑HL‑001 v1.26.*
+1
View File
@@ -61,6 +61,7 @@ CREATE TABLE tx_vitec_domain_model_product (
related_texts int(11) DEFAULT '0' NOT NULL, related_texts int(11) DEFAULT '0' NOT NULL,
solutions int(11) DEFAULT '0' NOT NULL, solutions int(11) DEFAULT '0' NOT NULL,
resources int(11) DEFAULT '0' NOT NULL, resources int(11) DEFAULT '0' NOT NULL,
resources_layout varchar(20) DEFAULT '50-50' NOT NULL,
datasheets int(11) DEFAULT '0' NOT NULL, datasheets int(11) DEFAULT '0' NOT NULL,
KEY parent (pid) KEY parent (pid)
); );