Product content check as page content (vitec_productcheck)

The product audit of public/product-check/ becomes data for the React frontend: new content element vitec_productcheck (plugin registration, wizard entry, TypoScript USER func) delivers under content.productcheck either the overview (every product with one {ok,count} check per field - hero, photos, og, video, teaser, subtitle, description, description2, highlights, capabilities, applications, features incl. icon count, resources, datasheets, solutions - plus per-field summary) or, with ?check=<uid>, the detail of one product (texts as stored HTML, images with original URL and 480px thumbnail, videos, feature cards with icons, resources, datasheets, solutions). ProductCheckService ports the PDO queries of the standalone page to Doctrine; the renderer is always USER_INT so the audit is never served from the page cache; check is excluded from the cHash. Migration adds the element to page 607 (/products/product-check). The standalone page stays untouched. Verified on DEV: overview 85 products in 0.13 s warm, detail 0.2-0.9 s, thumbnails resolve.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
orascheandClaude Fable 5.1 committed 2026-11-12 11:34:59 +01:00
1 parent b36dceb486
commit 4bc38b1760
8 files changed
+519

No files matched your search

@@ -28,6 +28,11 @@ services:
Evomedien\Vitec\Service\SsrPurgeService:
public: true
# Fetched via GeneralUtility::makeInstance from the USER func
# ProductCheckJsonRenderer (TypoScript userFunc, no DI there).
Evomedien\Vitec\Service\ProductCheckService:
public: true
# SSR dashboard tiles (the WidgetConfigurationInterface argument is
# injected by the dashboard compiler pass via the tag).
Evomedien\Vitec\Widgets\SsrStatusWidget:
@@ -100,6 +100,20 @@ tt_content {
}
}
# Product Content Check - the product audit table as data (page
# /products/product-check). Always USER_INT, see ProductCheckJsonRenderer.
vitec_productcheck < lib.contentElementWithHeader
vitec_productcheck {
fields {
content {
fields {
productcheck = USER
productcheck.userFunc = Evomedien\Vitec\UserFunc\ProductCheckJsonRenderer->render
}
}
}
}
# EXT:solr search results as JSON - the search endpoint for the React frontend
solr_pi_results < lib.contentElementWithHeader
solr_pi_results {
@@ -27,6 +27,16 @@ use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
$registerPluginWithFlexForm('Productlist', 'Show Products by Category', 'FILE:EXT:vitec/Configuration/FlexForms/Productlist.xml', 'vitec-plugin-productlist');
$registerPluginWithFlexForm('Productfinder', 'Product Finder (filter data)', 'FILE:EXT:vitec/Configuration/FlexForms/Productfinder.xml', 'vitec-plugin-productlist');
$registerPluginWithFlexForm('Productfeature', 'Featured Product Card', 'FILE:EXT:vitec/Configuration/FlexForms/Productfeature.xml', 'vitec-plugin-productlist');
// Product content audit as page content (2026-11-12): no FlexForm, the
// element has nothing to configure - data comes from ProductCheckService.
ExtensionUtility::registerPlugin(
'Vitec',
'Productcheck',
'Product Content Check (audit table)',
'vitec-plugin-productlist',
'plugins',
'Live audit of every product record: one row per product, one check per content field, details per row. Place once on /products/product-check.'
);
$registerPluginWithFlexForm('Simplecard', 'Simple Card', 'FILE:EXT:vitec/Configuration/FlexForms/Simplecard.xml', 'vitec-plugin-simplecard');
$registerPluginWithFlexForm('Productshow', 'Show Single Product', 'FILE:EXT:vitec/Configuration/FlexForms/Productshow.xml', 'vitec-plugin-productshow');
$registerPluginWithFlexForm('Usecaseshow', 'Single Success Story', 'FILE:EXT:vitec/Configuration/FlexForms/Usecase.xml', 'vitec-plugin-usecaseshow');
@@ -32,6 +32,14 @@ mod {
CType = vitec_productfinder
}
}
productcheck {
iconIdentifier = vitec-plugin-productlist
title = Product Content Check (audit table)
description = Live audit of all product records - one row per product, one check per content field. Internal page /products/product-check.
tt_content_defValues {
CType = vitec_productcheck
}
}
productshow {
iconIdentifier = vitec-plugin-productshow
title = Show single VITEC Product