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:
1 parent
c6759186cb
commit
bb7c03235d
237 files changed
+6698
-1749
No files matched your search
Executable → Regular
+59
-5
@@ -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
|
||||
Executable → Regular
File mode changed.
@@ -0,0 +1,30 @@
|
||||
# =============================================================================
|
||||
# VITEC news integration — headless JSON output
|
||||
#
|
||||
# All supported EXT:news content element types use the same JSON renderer.
|
||||
# The renderer returns a stable payload with:
|
||||
# - mode = list | detail
|
||||
# - items/news = serialised records
|
||||
# - settings = the relevant FlexForm settings for the frontend
|
||||
# =============================================================================
|
||||
|
||||
tt_content.news_pi1 =< lib.contentElementWithHeader
|
||||
tt_content.news_pi1 {
|
||||
fields {
|
||||
content {
|
||||
fields {
|
||||
news = USER
|
||||
news.userFunc = Evomedien\Vitec\UserFunc\NewsJsonRenderer->render
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tt_content.news_newsliststicky < tt_content.news_pi1
|
||||
tt_content.news_newsselectedlist < tt_content.news_pi1
|
||||
tt_content.news_newsdetail < tt_content.news_pi1
|
||||
tt_content.news_newsdatemenu < tt_content.news_pi1
|
||||
tt_content.news_categorylist < tt_content.news_pi1
|
||||
tt_content.news_newssearchform < tt_content.news_pi1
|
||||
tt_content.news_newssearchresult < tt_content.news_pi1
|
||||
tt_content.news_taglist < tt_content.news_pi1
|
||||
Reference in new issue
Block a user