Unify list plugins, add solution list and per-story detail page

- vitec_usecaselist: layout + record selection like marketlist
- new plugin vitec_solutionlist (spec 7.13.3, key "solutions")
- tx_vitec_domain_model_usecase: detail_page -> resolved detailUrl
  (also gives story cards in vitec_modelcard a link for the first time)
- "Show Toolbar" checkbox on product/market/solution/usecase lists
- spec bumped to v1.9

BREAKING: vitec_productlist and vitec_usecaselist now emit an object
instead of a bare array. Consumers must read products.products and
usecases.usecases. Also found: productlist had a configurable layout
that was never serialised; it is emitted now, but keeps its own 0-3
vocabulary instead of grid/list/carousel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
orascheandClaude Opus 5 committed 2026-08-17 16:29:06 +02:00
1 parent 4ef3ad0026
commit 12eb40614b
23 files changed
+559 -28

No files matched your search

@@ -152,20 +152,30 @@ 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
// iterating `products` directly. `layout` was configurable in the
// FlexForm all along but had never been emitted - note that product
// layouts are numbered 0..3 here, not the grid/list/carousel
// vocabulary the other lists use.
$response = [
'layout' => (string)($settings['layout'] ?? '0'),
'showToolbar' => (bool)($settings['showtoolbar'] ?? false),
'products' => $productsData,
];
if ($debugMode) {
return json_encode([
'products' => $productsData,
'debug' => [
'pageId' => (int)($GLOBALS['TSFE']->id ?? 0),
'categoryUids' => $categoryUids,
'productCount' => count($productsData),
'settings' => $settings,
'fallbackFiles' => $this->collectFallbackFilesFromProducts($productsData),
],
]);
$response['debug'] = [
'pageId' => (int)($GLOBALS['TSFE']->id ?? 0),
'categoryUids' => $categoryUids,
'productCount' => count($productsData),
'settings' => $settings,
'fallbackFiles' => $this->collectFallbackFilesFromProducts($productsData),
];
}
return json_encode($productsData);
return json_encode($response);
} catch (\Throwable $e) {
return '';
}