Products megamenu as a data-driven catalog with a Solr product type-ahead

- evo_megamenu_json stays project-neutral: new panel layout "catalog";
  for such entries the MenuBuilder dispatches the new PSR-14 event
  BuildCatalogEvent and emits whatever a listener sets as `catalog`
  (null without a listener). The entry's teaser cards serve as the
  featured tiles; the teaser inline field now also shows for "catalog",
  and the entry form reloads when the layout changes. README section
  "Layout catalog"
- VITEC listener ProvideProductCatalog fills it, modelled on the Ross
  Video products menu: main categories below the "Product" root, their
  subcategories as groups, products with a plain-text one-line teaser;
  same visibility rules as the product list, Product Finder links
  (/products?cat=&subcat=), empty categories and groups left out, three
  queries for the whole catalog
- Product type-ahead GET /_json/?type=7385&q= (USER_INT page type,
  ProductMenuSearchJsonRenderer): Solr restricted to products, last term
  completed as a prefix, up to six product cards plus their titles as
  autocomplete suggestions; endpoint announced in catalog.search
- Spec v1.23 (clause 7.16: product type-ahead)
This commit is contained in:
orasche committed 2026-10-09 13:40:23 +02:00
1 parent b5fcdb2b5a
commit 887caed2aa
8 files changed
+502 -6

No files matched your search

+29 -3
View File
@@ -17,9 +17,10 @@ A plugin called **Megamenu**. Inside it:
| **Teaser card** | kicker, headline, text, link, image — for editorial panels |
| **Featured** | one highlighted block per entry, edited on the entry itself |
Two panel layouts per entry: `columns` for a structure menu (products,
solutions, markets) and `teasers` for a small link column next to cards
(news, stories).
Three panel layouts per entry: `columns` for a structure menu (products,
solutions, markets), `teasers` for a small link column next to cards
(news, stories), and `catalog` for a data-driven panel whose content comes
from the site package (see below).
## Installation
@@ -89,6 +90,31 @@ An item whose target page does not exist yet carries `"pending": true`.
column heading instead), `mute` (show, not clickable) or `hide`. This keeps
a menu shippable while its deeper pages are still being built.
### Layout `catalog`
For panels built from data rather than by hand — a product catalog with
categories, groups and items, a search bar, whatever the site needs. The
extension stays project-neutral: it dispatches
`Evomedien\EvoMegamenuJson\Event\BuildCatalogEvent` for every catalog entry
and emits whatever a listener sets via `setCatalog()` verbatim as
`catalog` on the entry (`null` without a listener). The entry's teaser cards
are emitted as `teasers` as usual and serve as the panel's featured tiles;
its columns are ignored.
```php
#[AsEventListener(identifier: 'site/megamenu-catalog')]
final class ProvideCatalog
{
public function __invoke(BuildCatalogEvent $event): void
{
$event->setCatalog(['categories' => [/* … */]]);
}
}
```
`getEntry()` hands the listener the raw entry row (to tell several catalog
entries apart), `getStage()` the content stage.
## Notes
* Every link is a resolved URL — page, record, external or file, run through