Note : Il est aussi possible de créer des éléments de menu dans le fichier MODULE.links.menu.yml, cf : https://kgaut.net/snippets/2017/drupal-8-creer-un-element-de-menu-vers-… et https://kgaut.net/snippets/2018/drupal-8-drupal-9-menu-ajouter-un-eleme…
Les extraits de codes suivants peuvent être placer dans des fonctions d'update (MODULE_UPDATE_9001() par exemple).
Créer un élément de menu simple vers un nœud dans le menu principal (main)
$menuItem = MenuLinkContent::create([
'title' => 'Mon Menu avec un lien vers un noeud',
'link' => ['uri' => 'internal:/node/5'],
'menu_name' => 'main',
'expanded' => TRUE,
'weight' => 2,
]);
$menuItem->save();
Créer un élément de menu sans lien
$menuItem = MenuLinkContent::create([
'title' => 'Mon menu sans lien',
'link' => ['uri' => 'route:<nolink>'],
'menu_name' => 'main',
'expanded' => TRUE,
'weight' => 2,
]);
$menuItem->save();
Un élément de sous-menu
$childMenuItem = MenuLinkContent::create([
'title' => 'Mon sous menu',
'link' => ['uri' => 'internal:/node/4'],
'menu_name' => 'main',
'expanded' => TRUE,
'parent' => 'menu_link_content:' . $menuItemParent->uuid(),
'weight' => 2,
]);
$childMenuItem->save();
Comme signalé par le bon Opi en commentaire, la ligne
'parent' => 'menu_link_content:' . $menuItem->uuid(),
peut être replacé par un version plus générique :
'parent' => $menuItem->getPluginId(),
Ainsi :
$childMenuItem = MenuLinkContent::create([
'title' => 'Mon sous menu',
'link' => ['uri' => 'internal:/node/4'],
'menu_name' => 'main',
'expanded' => TRUE,
'parent' => $menuItem->getPluginId()
'weight' => 2,
]);
$childMenuItem->save();
Arborescence complète
Et voici un exemple complet, à adapter à votre besoin pour créer une arborescence, c'est largement perfectible, mais ça fait le taf.
$items = [
'Mon élément parent' => [
'uri' => 'route:<nolink>',
'children' => [
'Un menu item' => 'internal:/node/5',
'Une autre item' => 'internal:/node/6',
],
],
'Un autre parent' => [
'uri' => 'route:<nolink>',
'children' => [
'Salut' => 'internal:/node/7',
"c'est" => 'internal:/node/8',
'cool' => 'internal:/node/9',
],
],
];
$poids = 0;
foreach($items as $parent => $data) {
$menuItem = MenuLinkContent::create([
'title' => $parent,
'link' => ['uri' => $data['uri']],
'menu_name' => 'main',
'expanded' => TRUE,
'weight' => ++$poids,
]);
$menuItem->save();
foreach ($data['children'] as $child => $subdata) {
$childMenuItem = MenuLinkContent::create([
'title' => $child,
'link' => ['uri' => $subdata['uri']],
'menu_name' => 'main',
'expanded' => TRUE,
'parent' => 'menu_link_content:' . $menuItem->uuid(),
'weight' => ++$poids,
]);
$childMenuItem->save();
}
}
Contenus en rapport
Dans le fichier monmodule.links.menu.yml :
monmodule.menu.cle:
title: 'Titre de ma mage'
description: 'Liste des options'
route_name: view.admin_options.page
parent: system.admin_content
weight: 90
Quelques explications :
Voici comment créer un Menu item (élément de menu) avec des paramètres GET.
Dans le contrôleur / Bloc...
Dans le fichier mon_module.links.menu.yml, on peut facilement placer un élément de menu dans une arborescence via la clé parent.
Commentaires
Merci pour le récap ; 2 remarques :
- 'parent' => 'menu_link_content:' . $menuItem->uuid(), peut être replacé par 'parent' => $menuItem->getPluginId(),
- dans l'exemple "Créer un élément de menu sans lien" l'uri doit être 'route:<nolink>' (il manque les chevrons)
Merci Opi pour la correction et la suggestion !
Ajouter un commentaire