sys_category gains a story selection and a layout (Options tab, alongside
the images field EXT:news puts there), so one editorial decision serves
every product list that renders the category. ProductListJsonRenderer emits
them beside the products in the 7.3 list envelope; each card carries
forCategories - the product categories it came from - so the front end hides
it with the same ?cat=/?subcat= filter it applies to the products. Stories
are collected over the category and its descendants and deduplicated.
Story links follow the existing rule (detail page's parent path plus slug,
which SuccessStoryPathRewrite maps back), taking the page from the element's
FlexForm or the new site setting vitec.storyDetailPid.
Spec raised to 1.17 with clause 7.15.2.1; the header had been left at 1.12
although entries up to 1.15 already existed, so today's two entries were
renumbered to 1.16 and 1.17.
The headless-mixed set was active although the site runs full headless. On
any request whose Accept header equals exactly 'application/json' it
re-imported the headless page configuration, and 'page < lib.headlessPage'
replaced the whole page object - dropping every field later sets had added:
mainNavigation, footerMenu, metaMenu, megaMenu, jsonLd. The header is not
part of the page cache key, so whichever request rendered first decided what
everyone got, which made it look like a concurrency race. Removing the set
restores the full 15-key payload for every Accept variant.
fix-asset-perms.sh only covered _assets, fileadmin/icons and the extension's
Resources/Public, so anything an importer wrote under public/fileadmin kept
the mount's permissions and returned 403 - most visibly the success-story
images in the megamenu. It now covers public/fileadmin as a whole.
- new project-neutral extension evo_megamenu_json (Evomedien): a Megamenu
plugin holding entries, columns, items, teaser cards and a featured slot
as nested records; presentation settings travel with the payload so the
front end reads behaviour instead of hard-coding it; published as
page.10.fields.megaMenu, driven by the site settings megamenu.contentUid
and megamenu.storagePid
- vitec:seed-megamenu fills one element from the live structure: 5 entries,
26 columns, 95 items, 4 story cards; items without a page yet are flagged
pending so the front end falls back to the column link
- vitec:debug-sets prints the resolved site set order
- read-only diagnostics: check_megamenu_schema.php, check_typoscript_templates.php
- docs: schema updates run via extension:setup (database:updateschema no
longer exists in v14), and a JSON Accept header activates headless-mixed,
which strips every set-added page field
Apache Solr 10 runs on a dedicated VPS behind a Caddy HTTPS proxy
(vitecsolr.evomedien.de) because the managed webserver only allows
outgoing standard ports. Credentials stay out of git: the site config
carries %env()% placeholders resolved via putenv() in the git-ignored
config/system/additional.php.
- composer: apache-solr-for-typo3/solr 14.0.0-RC1 (the only line
compatible with TYPO3 14; final 14.0.0 will arrive via composer update)
- config.yaml: read connection https/443, core_en per language,
env placeholder credentials; .gitignore covers additional.php
- setup.typoscript: config.index_enable = 1 (page indexing silently
refuses without it), solr_pi_results JSON renderer registration,
results highlighting, and content field extraction from tt_content
rows - the headless JSON output has no TYPO3SEARCH markers, so the
default page content extraction indexed an empty content field
- SearchJsonRenderer (renderer #27): JSON output for the search plugin
on /search. GET q/page in; { query, page, resultsPerPage, numFound,
totalPages, results[], suggestions } out. Disables the page cache per
request: config.no_cache is gone in TYPO3 v14, and q/page are
excluded from cHash, so cached variants would collide
- ext_localconf.php: q and page added to cacheHash excludedParameters
- SolrIndexCommand (vitec:solr-index): works the index queue from the
CLI with connection diagnostics and a --debug single-step mode -
EXT:solr 14 ships no console commands and the backend button indexes
one item per click
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>