Drupal 8 & Drupal 9 - Créer des éléments de menu dans le code

Posté le Mardi 2 mars 2021 - 08:16
Dernière mise à jour le Mardi 2 mars 2021 - 13:58

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();
    }
  }

 

Aller plus loin ?

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 !

You are so dazzling! I don't really see that I've truly surveyed anything like that as of now. So unbelievable to find someone two or three phenomenal examinations on this issue. Genuinely.. grateful for wrapping this up. This site page is something that is needed on the web, somebody with a scramble of progress! 

Ajouter un commentaire

Ne sera pas publié

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...