Add evo_megamenu_json extension and seed the megamenu
- 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
This commit is contained in:
1 parent
e9eaa62d89
commit
5bb4e374b4
31 files changed
+2251
-4
No files matched your search
@@ -0,0 +1,101 @@
|
||||
# EVO Megamenu JSON
|
||||
|
||||
An editable megamenu for headless TYPO3. One content element holds the whole
|
||||
menu; the extension publishes it as JSON, the front end renders it.
|
||||
|
||||
Project-neutral by design — nothing in here knows which site it runs on.
|
||||
|
||||
## What the editor gets
|
||||
|
||||
A plugin called **Megamenu**. Inside it:
|
||||
|
||||
| Level | Holds |
|
||||
|---|---|
|
||||
| **Entry** | one item in the main bar: label, target page, panel layout |
|
||||
| **Column** | a heading (optionally a link) and its items |
|
||||
| **Item** | label, link, teaser line, badge, thumbnail, “page not ready” flag |
|
||||
| **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).
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
composer require evomedien/evo-megamenu-json
|
||||
vendor/bin/typo3 extension:setup
|
||||
vendor/bin/typo3 database:updateschema "*.add,*.change"
|
||||
```
|
||||
|
||||
In the site configuration, add the set **EVO Megamenu (JSON)** and set:
|
||||
|
||||
| Setting | Meaning |
|
||||
|---|---|
|
||||
|
||||
| `megamenu.contentUid` | uid of the Megamenu element to publish on every page |
|
||||
| `megamenu.storagePid` | alternative: folder whose first Megamenu element is used |
|
||||
|
||||
Leave both uid and pid at 0 and the menu is only rendered where the element
|
||||
sits — useful while building it.
|
||||
|
||||
## Payload
|
||||
|
||||
```json
|
||||
"megaMenu": {
|
||||
"settings": {
|
||||
"stage": 3, "openOn": "hover", "closeDelay": 140, "columnsPerRow": 4,
|
||||
"panelWidth": "container", "pendingBehaviour": "fallback",
|
||||
"showCounts": true, "showViewAll": true, "viewAllLabel": "View all %s"
|
||||
},
|
||||
"entries": [
|
||||
{
|
||||
"title": "Products",
|
||||
"link": "/products",
|
||||
"layout": "columns",
|
||||
"columns": [
|
||||
{
|
||||
"title": "IP Video Streaming",
|
||||
"link": "/products/ip-video-streaming",
|
||||
"items": [
|
||||
{ "title": "Appliances", "link": "/products/ip-video-streaming/appliances",
|
||||
"pending": true, "teaser": "MGW Diamond, Ace, Pico",
|
||||
"image": { "url": "/fileadmin/...", "alternative": "", "title": "", "width": 600, "height": 400 } }
|
||||
]
|
||||
}
|
||||
],
|
||||
"featured": { "kicker": "Datasheet", "title": "MGW Diamond-H", "text": "…", "link": "/product/…", "image": { } }
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`settings` travels with the menu on purpose: the front end reads hover
|
||||
behaviour, close delay, column count and labels from the payload instead of
|
||||
hard-coding them, so an editor can change them without a deploy.
|
||||
|
||||
### Content stages
|
||||
|
||||
`stage` decides how much detail is emitted — 1 structure only, 2 adds images,
|
||||
teaser lines and cards, 3 adds the featured block. Later stages only **add**
|
||||
keys, so a front end written for stage 1 keeps working when the stage is
|
||||
raised.
|
||||
|
||||
### `pending`
|
||||
|
||||
An item whose target page does not exist yet carries `"pending": true`.
|
||||
`settings.pendingBehaviour` says what to do with it: `fallback` (link to the
|
||||
column heading instead), `mute` (show, not clickable) or `hide`. This keeps
|
||||
a menu shippable while its deeper pages are still being built.
|
||||
|
||||
## Notes
|
||||
|
||||
* Every link is a resolved URL — page, record, external or file, run through
|
||||
typolink at render time.
|
||||
* Translations are overlaid per record, so a menu can be localised entry by
|
||||
entry.
|
||||
* The renderer never throws: a broken menu returns an empty value rather than
|
||||
taking the page payload down.
|
||||
* Without `friendsoftypo3/headless` the element has no JSON envelope to render
|
||||
into — the extension is built for headless installations.
|
||||
Reference in new issue
Block a user