Drupal 8 & Drupal 9 - Créer des éléments de menu dans le code
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();
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();
}
}