Checkpoint: headless JSON architecture documented + cleanup (Stufe 1+2)

Restore point before Stufe 3 (central resolver-service refactoring).

Includes this session's work:
- Success Story (usecase) rebuild: new fields/tabs, UsecaseSerializer,
  thin List/Show renderers, MM relations, inline content elements.
- vitec_columns content block (two-column layout with per-item content)
  incl. unified header section; special-cased JSON resolution.
- Container per-column flex (items[].config align/justify) + gap on parent.
- Unified header section across CEs/plugins/containers; header fields in JSON.
- ISO-style architecture spec: Documentation/Headless-JSON-Architecture.md.
- Cleanup: removed local scratch + verified .bak backups.
- Fixes: B-6 (undefined thumbnail variable in Downloadcardcollection image
  resolver), B-7 (unsatisfiable legacy CType OR branch in Downloadcard/Datasheets).

Rollback: git reset --hard snapshot-2026-07-09-pre-stufe3

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
o-rascheandClaude Opus 4.8 committed 2026-07-09 10:01:56 +02:00
1 parent c6759186cb
commit bb7c03235d
237 files changed
+6698 -1749

No files matched your search

+59 -5
View File
@@ -2,6 +2,12 @@
# VITEC container content elements — self-contained JSON rendering
# Children collected via Evomedien\Vitec\DataProcessing\ContainerChildrenProcessor
# (exception-safe; returns [] on any error, never crashes the outer CE).
#
# Per-column flex settings (align/justify) live on the PARENT record
# (tx_vitec_col{1..4}_align/justify) and are attached by the processor to each
# column in `items` (items[].config.align/justify) — so they apply to ALL
# children of that column. The whole-grid gap (tx_vitec_gap) is emitted here as
# the parent-level `gap`.
# =============================================================================
tt_content.vitec_cols_50_50 = JSON
@@ -70,9 +76,27 @@ tt_content.vitec_cols_50_50 {
header.field = header
subheader = TEXT
subheader.field = subheader
headerLayout = INT
headerLayout.field = header_layout
headerPosition = TEXT
headerPosition.field = header_position
headerLink = TEXT
headerLink {
htmlSpecialChars = 1
typolink {
parameter.field = header_link
returnLast = result
}
}
tx_vitec_bg_variant = TEXT
tx_vitec_bg_variant.field = tx_vitec_bg_variant
# Parent-level: column gap scale (1–5) for the whole grid.
gap = TEXT
gap.field = tx_vitec_gap
# Columns with their children + per-column flex (align/justify) in
# items[].config — assembled by ContainerChildrenProcessor.
items = JSON
items {
dataProcessing {
@@ -83,18 +107,48 @@ tt_content.vitec_cols_50_50 {
}
}
tt_content.vitec_cols_33_33_33 =< tt_content.vitec_cols_50_50
tt_content.vitec_cols_25_25_25_25 =< tt_content.vitec_cols_50_50
tt_content.vitec_cols_66_33 =< tt_content.vitec_cols_50_50
tt_content.vitec_cols_33_66 =< tt_content.vitec_cols_50_50
tt_content.vitec_cols_33_33_33 < tt_content.vitec_cols_50_50
tt_content.vitec_cols_25_25_25_25 < tt_content.vitec_cols_50_50
tt_content.vitec_cols_66_33 < tt_content.vitec_cols_50_50
tt_content.vitec_cols_33_66 < tt_content.vitec_cols_50_50
# -----------------------------------------------------------------------------
# VITEC · Container — single-column container with a custom CSS class.
# Inherits the full structure of the grid containers and adds the `cssClass`
# field, read from the element's FlexForm (settings.cssClass).
# Single column -> no grid gap.
# -----------------------------------------------------------------------------
tt_content.vitec_container =< tt_content.vitec_cols_50_50
tt_content.vitec_container < tt_content.vitec_cols_50_50
tt_content.vitec_container.fields.gap >
tt_content.vitec_container.fields.cssClass = TEXT
tt_content.vitec_container.fields.cssClass.data = flexform:pi_flexform:settings.cssClass
tt_content.vitec_container.fields.cssClass.stdWrap.ifEmpty.cObject = TEXT
tt_content.vitec_container.fields.cssClass.stdWrap.ifEmpty.cObject.value =
# -----------------------------------------------------------------------------
# VITEC · Cards Carousel — container whose children (typically vitec_card
# elements) become the slides. Inherits the grid-container JSON structure
# (`items` via ContainerChildrenProcessor) and adds carousel settings read
# from the element's FlexForm. Single slide track -> no grid gap.
# -----------------------------------------------------------------------------
tt_content.vitec_cards_carousel < tt_content.vitec_cols_50_50
tt_content.vitec_cards_carousel.fields.gap >
tt_content.vitec_cards_carousel.fields.carousel = JSON
tt_content.vitec_cards_carousel.fields.carousel {
fields {
slidesPerView = TEXT
slidesPerView.data = flexform:pi_flexform:settings.slidesperview
showArrows = TEXT
showArrows.data = flexform:pi_flexform:settings.showarrows
showIndicators = TEXT
showIndicators.data = flexform:pi_flexform:settings.showindicators
loop = TEXT
loop.data = flexform:pi_flexform:settings.loop
autoplay = TEXT
autoplay.data = flexform:pi_flexform:settings.autoplay
autoplayInterval = TEXT
autoplayInterval.data = flexform:pi_flexform:settings.autoplayinterval
}
}
tt_content.vitec_cards_carousel.fields.cssClass = TEXT
tt_content.vitec_cards_carousel.fields.cssClass.data = flexform:pi_flexform:settings.cssClass