- New, deliberately separate pipeline for sub-solutions (markets and
solutions must never break each other): generator
vitec:generate-subsolution-workbooks (list from the page tree below
/solutions, 39 workbooks, every sub-solution matched to its record),
SubsolutionWorkbookImporter + CLI vitec:import-subsolution-workbooks,
and a "Sub-Solutions" tab in the VITEC Import module with its own
inbox migrations/subsolutions_xlsx_in/
- Targets the existing template 5 "Solution Detail" without changing
it: hero element in colPos 1, the remaining sections in fixed order in
colPos 0, found again by CType on re-import; existing empty sub-solution
pages are switched to layout 5, missing ones created hidden;
detail_page set on the solution record
- Workbook per the Figma "07 Solution Detail page": hero without video
teaser, intro with headline and without learn-more/portfolio, extended
icon list, own page-layout reference image
- Shared content elements: market hero/intro/insights relabelled
"Market/Solution", market intro gains the optional intro_headline
field (new column, requires extension:setup)
- Fix: DataHandler puts every NEW record with a positive pid at the top
of its column, so pages built in one run came out reversed. Both
importers now track the page order per colPos and write
tt_content.sorting explicitly after the DataHandler run; re-applying
repairs pages imported earlier (verified on the control-room
sub-solution and sub-market page 443)
- migrations/fill_test_subsolution.php: realistic test content from
vitec.com copy and images for the control-room sub-solution
- Docs section 5z
thumbnail of the actual image (hero background, intro image, insights
cover), key copy in the summary line, full details expanded; card and
intro-paragraph previews are wrapped in the same mechanism
- New SubmarketPluginPreview for vitec_usecaselist / vitec_productfeature /
vitec_productlist: instead of bare standard boxes they now list the
selected story titles (flagging stories that still lack a quote), the
featured product and the hand-picked products in order
- Container-style collapse for whole page-module COLUMNS: a chevron at the
right of every column header folds a section down to its title row,
state kept per page and colPos in localStorage - the slot view of a
sub-market page folds to six slim bands
- Previews sit under the page module's pointer-events lock and its
click-to-edit layer: pointer events are re-enabled inside the collapse
markup and the toggle runs on pointerdown in the capture phase
- Two more v14 removals fixed on the way, both latent in the OLDER preview
classes too (Usecaseshow, Modelcard would have crashed the page module):
GridColumnItem::getRecord() now returns a Domain\Record object, and
StandaloneView is gone - previews normalize the record via a shared
helper and render through the ViewFactory
per sub-market (25, grouped by the 9 main markets): VITEC-styled Read me,
a Page-layout sheet embedding the Figma design with section markers,
DB-live dropdowns, soft character limits, a hidden Meta sheet and named
input cells. Names must NOT start with a cell-reference token - Excel
silently strips s1_-style names as repairs.
vitec:import-submarket-workbooks (dry-run default, idempotent) finds or
creates the page below its main market (hidden, layout 21), fills the six
colPos slots updating in place and never deleting, links detail_page on
the market record, downloads asset URLs into fileadmin/submarket_import/
for editorial review and writes the flexforms as DataHandler arrays.
Reading is three-layered after a bruising day of real-world Excel: named
ranges first, then a label scan over the locked column A with section
tracking - a customer save stripped ALL defined names and shifted rows,
so fixed addresses are not a contract.
Learned and fixed along the way: DuplicationBehavior moved to
Resource\Enum in v14; sys_file_reference rows via DataHandler need
pid/tablenames/uid_foreign or are dropped silently; handing DataHandler a
fresh NEW reference per run STACKS live references on re-import (caught
by a double-run test), so attachments are now content-idempotent - the
existing live reference is reused or retargeted and surplus duplicates
are deleted via cmdmap; RequestFactory replaces GeneralUtility::getUrl so
download failures carry their reason - which surfaced that the dev basic
auth blocked the server itself (server IP + loopback now allowlisted,
which a future SSR needs anyway) and that the core resource-consistency
check rightly rejects HTML masquerading as PNG.
Verified end to end on Broadcast & Media from a clean slate, twice in a
row: 12 elements in colPos 110-160, layout-21 payload, both images
attached exactly once with publicUrl in the JSON; second run reports
nothing but unchanged.
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.
- layout_variant gains the value "flipcard" (onChange: reload)
- "Card Back" palette in the Layout tab directly below layout_variant:
back_headline (Text, max 100) and back_text (Textarea, richtext),
displayCond-gated on the flipcard layout; serialised unconditionally -
the frontend keys the back face on layout_variant, not on field
presence (spec 7.7)
- backend preview: flipcard badge + back-headline line
- repair "[ Missing label ]" in the card selects: layout_variant /
background_variant are columns SHARED with vitec_ctabanner, and the
index-wise Content Blocks merge dropped four card-only values from
the base item list. Overrides/tt_content.php now pins the base column
to the cta-banner lists and hands vitec_card its full lists via
columnsOverrides (respected by FormEngine and DataHandler; an items
override can only extend, never shorten - array_replace_recursive)
- spec v1.19 incl. head-matter fix (version table was stuck at 1.17)
Server follow-up: database:updateschema "*.add,*.change" + cache:flush
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Resolves a cascade of TYPO3 v14 breaking changes that left every VITEC
plugin's JSON output silently empty:
1. `list_type` column dropped — all renderer page-discovery queries now
filter by `CType = 'vitec_X'`.
2. `#[AsAllowedCallable]` attribute added to every public render() —
without it v14 throws AllowedCallableException, which headless
silently filters via its "Oops, an error occurred!" guard.
3. `$GLOBALS['TSFE']->id` is null inside JSON cObj context — page id
now read from the `frontend.page.information` request attribute
(TSFE fallback kept for legacy entry points).
4. page.tsconfig wizard items migrated to `CType = vitec_X` directly
(legacy `CType=list, list_type=...` no longer exists in v14).
5. ContainerChildrenProcessor + ContentElementResolver dispatch the
PLUGIN_RENDERERS map by CType (primary) with list_type fallback.
Beyond the bug fix this commit also contains:
- Datasheets renderer rewritten to "products with newest datasheet"
semantics (filtered via Download.hideondatasheets).
- New vitec/card content block — multi-purpose card with backend
preview and layout/background/aspect/alignment/border/shadow options.
- New vitec_container CType (b13 single-column container, FlexForm
cssClass propagated into the JSON envelope).
- ContentElementResolver service for contentelement/contentelementcta
link resolution; ContainerChildrenProcessor for nested plugin
resolution inside b13 containers.
- Vitecset setup.typoscript: ContentElement import moved to top so
lib.contentElement is defined before VITEC's tt_content blocks.
- Cleanup: 98 .bak.<timestamp> debugging backups removed; *.bak.* and
/public/_assets_install/ added to .gitignore.
Resolves a cascade of TYPO3 v14 breaking changes that left every VITEC
plugin's JSON output silently empty:
1. `list_type` column dropped — all renderer page-discovery queries now
filter by `CType = 'vitec_X'`.
2. `#[AsAllowedCallable]` attribute added to every public render() —
without it v14 throws AllowedCallableException, which headless
silently filters via its "Oops, an error occurred!" guard.
3. `$GLOBALS['TSFE']->id` is null inside JSON cObj context — page id
now read from the `frontend.page.information` request attribute
(TSFE fallback kept for legacy entry points).
4. page.tsconfig wizard items migrated to `CType = vitec_X` directly
(legacy `CType=list, list_type=...` no longer exists in v14).
5. ContainerChildrenProcessor + ContentElementResolver dispatch the
PLUGIN_RENDERERS map by CType (primary) with list_type fallback.
Beyond the bug fix this commit also contains:
- Datasheets renderer rewritten to "products with newest datasheet"
semantics (filtered via Download.hideondatasheets).
- New vitec/card content block — multi-purpose card with backend
preview and layout/background/aspect/alignment/border/shadow options.
- New vitec_container CType (b13 single-column container, FlexForm
cssClass propagated into the JSON envelope).
- ContentElementResolver service for contentelement/contentelementcta
link resolution; ContainerChildrenProcessor for nested plugin
resolution inside b13 containers.
- Vitecset setup.typoscript: ContentElement import moved to top so
lib.contentElement is defined before VITEC's tt_content blocks.
- Cleanup: 98 .bak.<timestamp> debugging backups removed; *.bak.* and
/public/_assets_install/ added to .gitignore.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>