Vue d'ensemble
- Module
websourcemegamenu, espace de nomsWebsource\MegaMenu\(PSR-4 danssrc/), implémenteWidgetInterface. Contrôleur d'administrationAdminWebsourceMegaMenu(Apparence > Websource Mega Menu). Menu/: catalogue des types (NodeCatalog), nettoyage (FieldSanitizer,TreeSanitizer,MenuSettings,ColorSanitizer,SvgSanitizer), bibliothèque d'icônes (IconLibrary).Source/: une source par famille (CategorySource,CmsSource,BrandSource,ProductSource,SupplierSource,PageSource), réunies dansSourceRegistry; interfaceSourceInterface.Resolve/TreeResolvertransforme l'arbre enregistré (JSON) en arbre prêt à afficher ;Render/MenuRendererproduit le balisage ;Front/MenuPresenterajoute le cache ;Render/JsonLdBuilderémet unSiteNavigationElement(une baliseapplication/ld+jsonpar menu rendu).
Hooks greffés
| Hook | Rôle |
|---|---|
displayNavFullWidth, displayTop, displayFooter | Rendu des menus en ligne dont le réglage hook vaut ce hook. |
actionFrontControllerSetMedia | Charge views/css/menu.css seulement si un menu est en ligne, et views/js/menu.js seulement pour les menus en barre. |
actionShopDataDuplication | Copie des menus lors de la duplication d'une boutique. |
actionObject{Category,CMS,Manufacturer,Product}{Add,Update,Delete}After (objets surveillés : WATCHED_OBJECTS) | Invalidation du cache. |
actionWebsourceThemeExport, actionWebsourceThemeImport | Section megamenu (version 1) du paquet de thème. |
Le module n'expose pas de hook personnalisé.
Widget
{widget name='websourcemegamenu' menu=3}
{widget name='websourcemegamenu' menu='Menu principal'}
menu accepte l'identifiant ou le nom (insensible à la casse) d'un menu en ligne. Sans menu, le widget rend les menus dont l'emplacement correspond au hook d'appel. getWidgetVariables() renvoie ['wsmm_html' => '…'] ; le gabarit est module:websourcemegamenu/views/templates/hook/menu.tpl. L'emplacement « Je le place moi-même » correspond à la valeur widget du réglage hook (MenuSettings::HOOK_WIDGET).
Réglages d'un menu (Menu\MenuSettings)
Exemple constaté sur la boutique de test : {"hook":"displayNavFullWidth","layout":"bar","theme":"light","panel":"auto","align":"start","mobile":"push","aria_label":{"1":"Menu principal"},"max_depth":4}.
| Clé | Valeurs (défaut en premier) |
|---|---|
hook | displayNavFullWidth, displayTop, displayFooter, widget |
layout | bar, columns (forcé à columns quand hook = displayFooter, à bar sinon) |
theme | light, dark, brand |
panel | auto, content, full |
align | start, center |
mobile | push, accordion |
aria_label | tableau par identifiant de langue |
max_depth | 4 ; de 2 à 6 |
Options d'un élément
Icône : mode both, icon, text ; place before, after ; taille xs, sm, md, lg, xl. Pastille : position float, inline ; forme pill, rounded, square ; couleurs prédéfinies ou personnalisées (hexadécimal à 3, 4, 6 ou 8 chiffres, rgb(), rgba(), validés côté serveur). Position dans la barre : start, center, end (marges automatiques de flexbox). Visibilité : all, desktop, mobile. Liens libres : http, https, mailto, tel ou adresse relative, une adresse par langue ; options nouvel onglet (rel="noopener") et nofollow.
Balisage et CSS
Conteneur : <nav class="wsmm wsmm--bar wsmm--theme-light wsmm--panel-auto wsmm--align-start wsmm--m-push"> (classes dérivées des réglages ; is-ready est ajouté par menu.js). Éléments : .wsmm__item (+ .wsmm__item--has-panel, .is-open à l'ouverture), .wsmm__toggle (bouton avec aria-expanded), .wsmm__panel.
Barre horizontale à partir de 992 px ; tiroir ou accordéon en dessous.
Variables CSS propres : --wsmm-bg, --wsmm-fg, --wsmm-accent, --wsmm-soft, --wsmm-line, --wsmm-pbg (fond des panneaux), --wsmm-max (largeur maximale), --wsmm-push-w (largeur du tiroir), --wsmm-ic (taille d'icône), --wsmm-emo, --wsmm-bd-bg, --wsmm-bd-fg (pastille).
Variables du thème lues, avec valeurs de repli : --color-brand-50, --color-brand-600, --color-brand-700, --color-brand-fill, --color-brand-on, --color-accent-600, --color-accent-fill, --color-accent-on, --color-ink, --color-line, --color-surface, --container-max, --radius-xl, --radius-2xl, --wst-card-shadow.
Cache (Cache\MenuCache)
APCu si disponible, sinon mémoire de la requête ; durée 900 secondes ; clé par menu, langue, boutique et groupe de clients ; invalidation par numéro de version (mise en ligne, modification d'un objet surveillé). WebsourceMegaMenu::createCache()->forget() vide tout.
Contrôleur AdminWebsourceMegaMenu
Écrans : liste (par défaut), &edit=<id> (éditeur). Actions AJAX (ajax=1&action=<nom>, jeton du back-office, réponses JSON) :
| Action | Paramètres | Effet |
|---|---|---|
create | name, hook (+ option d'exemple) | Crée un menu. |
sync | id + brouillon (réglages et arbre) | Sauvegarde automatique. |
publish | id | Copie le brouillon en version en ligne. |
discard | id | Abandonne le brouillon. |
toggle | id, active | Affiche ou masque le menu. |
delete, duplicate | id | Supprime ; duplique (copie hors ligne). |
copyToShop | id, id_shop | Multiboutique : copie le brouillon, hors ligne, dans une autre boutique. |
searchProducts | q | Recherche de produits pour l'éditeur. |
upload | fichier | Image d'un visuel (5 Mo), stockée dans uploads/images/. |
uploadIcon | fichier | Icône (1 Mo ; SVG réécrit après nettoyage par liste blanche, PNG, JPG, WebP, GIF, AVIF). |
Table {prefix}websourcemegamenu_menu
| Colonne | Contenu |
|---|---|
id_menu, id_shop | Identifiant, boutique. |
name | Nom interne. |
active | 1 = affiché. |
is_published | 1 = une version en ligne existe. |
settings_draft, settings_live | Réglages JSON, brouillon et en ligne. |
tree_draft, tree_live | Arbre JSON, brouillon et en ligne. |
date_add, date_upd | Dates. |
Export / import de thème (section megamenu, version 1)
Menus exportés avec brouillon et version en ligne, réglages et arbre complet ; textes indexés par code ISO de langue ; catégories, pages, marques et produits référencés par clé stable (jamais par identifiant) ; images en adresse absolue. L'import repasse par MenuSettings et TreeSanitizer.
Méthodes publiques utiles
WebsourceMegaMenu::createPresenter(): MenuPresenter, createCache(): MenuCache, renderWidget(), getWidgetVariables().
Traductions
translations/fr.php, translations/en.php ; régénération par php tools/build-translations.php depuis tools/en.php.