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 !

Ajouter un commentaire

Ne sera pas publié

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