Backend of the sub-market template (spec agreed section by section with

the customer workflow in mind: the customer fills one XLSX per sub-market,
an importer builds the page).

- Frontend layout 21 'Sub-Market Page' in the existing
  BackendLayoutDataProvider: six zones, one per Figma section, emitted as
  colPos110..colPos160 - the JSON groups plus appearance.layout are the
  front-end contract (spec clause 7.17). A first attempt via page-TSconfig
  BackendLayouts was the wrong mechanism next to the provider and was
  removed again
- New Content Blocks vitec_markethero, vitec_marketintro,
  vitec_marketinsights (field bags, serialized unprefixed under data);
  the workflow section reuses intro-paragraph + vitec_card flip cards
- Stories gained quote/quote_person/quote_role (Testimonial tab),
  maintained once per story, emitted on every story card; usecaselist
  gained the layout value 'testimonials'
- New plugin vitec_productfeature: one referenced product as a full
  product card, serialisation shared with the product list (cObj made
  protected for the subclass)
- vitec_productlist gained hand-picked product selection: exactly the
  chosen products in the editor's order, category filter ignored,
  visibility filters kept - closes the long-standing single-select gap
- New CLI vitec:generate-submarket-workbooks: one protected customer
  XLSX per sub-market (9 main markets, 25 sub-markets from the Market
  category tree) - dropdowns filled live from the database, named ranges
  as the importer contract, hidden Meta sheet pinning submarket/group/
  record uid, soft character-limit warnings, asset URL fields

Verified end to end on Broadcast & Media: layout-21 payload with colPos110
carrying the hero element and its subline. Spec raised to v1.20.
This commit is contained in:
orasche committed 2026-10-02 10:18:36 +02:00
1 parent f0b0694842
commit 90ae6803a4
31 files changed
+493 -7

No files matched your search

@@ -3,9 +3,9 @@
| | |
|---|---|
| **Document identifier** | EVO‑VITEC‑HL‑001 |
| **Version** | 1.19 |
| **Version** | 1.20 |
| **Status** | Released |
| **Date** | 2026‑09‑25 |
| **Date** | 2026‑10‑01 |
| **Applies to** | `evomedien/vitec` on TYPO3 v14.3 (headless) |
| **Owner** | evomedien — VITEC relaunch |
@@ -32,6 +32,7 @@
| 1.17 | 2026‑09‑11 | **Interface change (additive).** The product list payload gained `successStories` (7.15.2.1): stories an editor attaches to a `sys_category` (tab *Options*, with its own layout), emitted in the list envelope beside `products`. Each card carries `forCategories` — the product categories it came from — so the front end can hide it with the same `?cat=`/`?subcat=` filter it applies to the products. Story links reuse the 7.5 rule, with the detail page taken from the element or the new site setting `vitec.storyDetailPid`. |
| 1.18 | 2026‑09‑24 | **Interface change (additive).** Products gained `solutions` — an MM relation to solutions, emitted as solution cards in both product payloads — and a **Resources tab**: child table `tx_vitec_product_resource` with documentation / support cards (editable title, text and icon around one link, resolved per 9.12; cards without a resolvable link are not emitted) plus a `datasheets` MM selection of download records rendered into the same envelope as `type: datasheet` cards, delivered detail‑only as the `resources` list envelope whose `layout` switches to `carousel` above three cards in total (7.15). The `solutions` relation accepts group‑level records: the eight groups exist as `is_group = 1` solutions (created by `vitec:create-solution-groups`, excluded from lists and from `vitec:align-solutions`) because the agency workbooks reference the group level. Editorial: the footer had been stuck at v1.15 since 1.16/1.17 (2026‑09‑11). |
| 1.19 | 2026‑09‑25 | **Interface change (additive).** The `vitec_card` Content Block gained the `layout_variant` value `flipcard` and a *Card Back* palette: `back_headline` (string, max 100) and `back_text` (richtext → HTML). The two fields are `displayCond`‑gated on the flipcard layout in the backend but serialised unconditionally (7.7) — the front end **shall** key the back face on `layout_variant`, never on field presence, because stored back values persist when an editor switches the layout away. Backend repair: `vitec_layout_variant` / `vitec_background_variant` are shared with `vitec_ctabanner`, and the index‑wise Content‑Blocks merge had dropped four card‑only select values (“Missing label”) — per‑type item lists now come from `columnsOverrides` (7.7); the Card‑Back palette lives in the Layout tab below the variant select. Editorial: the head‑matter version had been stuck at v1.17 since 1.18. |
| 1.20 | 2026‑10‑01 | **Interface change (additive).** Sub-market page template: frontend layout 21 with one colPos group per design section (`colPos110`..`colPos160`, clause 7.17); new Content Blocks `vitec_markethero`, `vitec_marketintro`, `vitec_marketinsights`; new plugin `vitec_productfeature` (key `productfeature`, one product in the 7.15.2 item shape); story cards gained `quote`/`quotePerson`/`quoteRole`; `vitec_usecaselist` gained the layout value `testimonials`; `vitec_productlist` gained hand-picked product selection (editor order, category filter ignored). Field semantics: Template_Sub-Market_Spezifikation_2026-10-01.md. |
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
@@ -1131,6 +1132,43 @@ content is extracted from the page’s `tt_content` rows via
`index.queue.pages.fields.content` because the headless JSON output carries no
`TYPO3SEARCH` markers.
---
### 7.17 Sub-market page template (frontend layout 21)
A sub-market page is identified by `appearance.layout == "layout-21"`. Its
content is NOT read from element order: the backend layout assigns one column
per design section, and the JSON groups them as
| Group | Section | Elements |
|---|---|---|
| `colPos110` | Hero | `vitec_markethero` |
| `colPos120` | Intro | `vitec_marketintro` |
| `colPos130` | Workflow | `vitec_introparagraph` + container with `vitec_card` flip cards |
| `colPos140` | Testimonials | `vitec_usecaselist`, `layout: "testimonials"` |
| `colPos150` | Products | `vitec_productfeature` + `vitec_productlist` (hand-picked) |
| `colPos160` | Industry Insights | `vitec_marketinsights` |
The three `vitec_market*` elements are Content Blocks: their fields arrive
unprefixed under the element's `data` (7.7). Field reference and empty-value
semantics ("empty url = card hidden" etc.) are specified in
`Template_Sub-Market_Spezifikation_2026-10-01.md`; the per-field limits live
in the backend field descriptions.
Related interface additions (all additive):
- **Story cards** (7.5 shape, everywhere they appear) carry `quote`,
`quotePerson`, `quoteRole` - maintained once per story, empty strings until
maintained. The testimonial card renders them; the `vitec_usecaselist`
FlexForm gained the `layout` value `testimonials` for this.
- **`vitec_productfeature`** (payload key `productfeature`): exactly one
referenced product as a full product card in the 7.15.2 item shape, `null`
when unset or the product is not visible. Serialisation is shared with the
product list (one source of truth).
- **`vitec_productlist`** gained the FlexForm field *Hand-picked products*:
when set, the list contains exactly those products in the editor's order;
the category selection is ignored, the visibility filters stay in force.
## 8 Content‑type catalogue
| CType | TS pattern | Renderer / Processor | Payload key | Kind |