Success stories: downloads and product sections become real plugins
- comparison report migrations/check_product_downloads.php (kept, read-only): download records vs. the delivered product workbooks - 34 of 74 workbook products have a datasheet, the entire Datapath line has none in the pool (import came from vitec.com; queued for Joe), ~35 orphan datasheets belong to products without records; a vitec:link-product-downloads re-run added seven clean links (Artio x2, Diamond-H, the three TOUGH records, X-View) - RTE resolution fixed at the root: ContentElementResolver and ContainerChildrenProcessor passed bodytext RAW into the payload, so t3:// links leaked unresolved; both now run RTE columns (bodytext, vitec_quote) through RteResolver::html() - the imported "Download Success Story" RTE buttons carried the wrong link identifier (tx_vitec_download -> download, one-time migration fix_download_record_links.php) AND old-site uids - missing here or, worse, accidentally pointing at foreign PDFs. New vitec:convert-story-download-buttons replaces them with real vitec_downloadcard plugins: the download is resolved by STORY title (manual map for ISR / "Okada Manilla", exact-title fallback for suffixless PDFs like "Lord's Cricket Ground"); 29 converted, 4 stories without a delivered PDF have their button hidden. New FlexForm layout "Success Story Download" (story_download) applied everywhere; the FE renders it as the previous centered button - the ADIB "Featured Products" text section (the only one site-wide, verified by scan_story_headers.php) is now ONE vitec_productlist with hand-picked products via old-name aliases and the new FlexForm layout "Success Story Products" (story_products); the four text elements are deleted. vitec:convert-story-product-sections stays re-runnable for future imports - the productlist envelope additionally carries "columns" (= number of products, capped at 4) so the story grid renders as many columns as it has products - additive key, available to every product list; and hand-picked lists now ship successStories as an empty array (the empty category selection used to aggregate stories over the WHOLE tree, leaking story cards into the section) - the story downloadcards carry header "Downloads" (set on convert and backfilled): the front end builds the story anchor nav from element headers, so the section now appears there - diagnosis scripts kept: check_download_record, check_story_elements, scan_story_headers; verified live on the ADIB payload (structured download object, productlist [5,18,6], texts 10 -> 5) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
80f6da7949
commit
d87e64f73b
12 files changed
+763
-2
No files matched your search
@@ -212,6 +212,7 @@ class ProductListJsonRenderer
|
||||
$productsData[] = $this->serializeProduct($product);
|
||||
}
|
||||
|
||||
|
||||
// Envelope with layout and toolbar flag, matching the other list
|
||||
// plugins. This turned the payload from a bare array into an object:
|
||||
// the front end has to read `products.products` instead of
|
||||
@@ -221,6 +222,11 @@ class ProductListJsonRenderer
|
||||
// vocabulary the other lists use.
|
||||
$response = [
|
||||
'layout' => (string)($settings['layout'] ?? '0'),
|
||||
// grid hint (Olli 2026-10-28): the column count follows the
|
||||
// number of products, so a 2-product story section renders
|
||||
// 2 columns, a 3-product one 3 - the front end reads this
|
||||
// instead of guessing from the array length. Capped at 4.
|
||||
'columns' => min(4, max(1, count($productsData))),
|
||||
'showToolbar' => (bool)($settings['showtoolbar'] ?? false),
|
||||
'products' => $productsData,
|
||||
// Success stories the editor attached to these categories
|
||||
@@ -231,7 +237,12 @@ class ProductListJsonRenderer
|
||||
// 2026-09-16 on front-end request - it used to deliver the
|
||||
// empty envelope), so forCategories keeps driving the
|
||||
// ?cat=/?subcat= filter exactly like on per-category lists.
|
||||
'successStories' => $this->successStoriesFor(
|
||||
// Hand-picked lists (sub-market Products section, the story
|
||||
// "Featured Products" section) show EXACTLY the picked
|
||||
// products - no ride-along stories (2026-10-28: without this
|
||||
// the empty category selection aggregated stories over the
|
||||
// WHOLE tree and story cards leaked into the section).
|
||||
'successStories' => ($selectedUids !== [] && !$allProducts) ? [] : $this->successStoriesFor(
|
||||
($allProducts || $categoryUids === []) ? $this->allProductCategoryUids() : $categoryUids,
|
||||
(int)($settings['storysinglepid'] ?? 0)
|
||||
),
|
||||
|
||||
Reference in new issue
Block a user