web-dev-qa-db-fra.com

Comment créer des liens de menu par programmation?

J'ai besoin d'ajouter des liens vers le menu existant (ou vers un nouveau) par programme dans Drupal 8.

14
skorzh

Pour créer automatiquement un élément de menu, celui-ci peut être placé dans un hook_update_N sur le fichier mymodule.install et s'exécutera lorsque la base de données sera mise à jour (/update.php):

use Drupal\menu_link_content\Entity\MenuLinkContent;
$items = array(
  '1' => 'Menuitem 1',
  '2' => 'Menuitem 2',
  '3' => 'Menuitem 3'
);

foreach($items as $nid => $title) {
  $menu_link = MenuLinkContent::create([
    'title' => $title,
    'link' => ['uri' => 'internal:/node/' . $nid],
    'menu_name' => 'main',
    'expanded' => TRUE,
  ]);
  $menu_link->save();
}

Vous pouvez également créer un menu complet par programmation:

\Drupal::entityTypeManager()
  ->getStorage('menu')
  ->create([
    'id' => 'menu_test',
    'label' => 'Test menu',
    'description' => 'Description text',
  ])
  ->save();
24
skorzh

Si vous souhaitez créer des liens de menu définis par module, ajoutez quelque chose comme cet exemple à votre fichier custom_module.links.menu.yml :

custom_module.admin_item_1:
  title: 'New Admin Item 1'
  parent: system.admin
  description: 'Description of link goes here.'
  route_name: view.some_view_id.page_1

parent (facultatif) est la colonne id du parent dans le menu_tree table et route_name est l'ID de route interne de Drupal à l'endroit où vous souhaitez que l'élément de menu soit lié. C'est dans le menu_tree table comme route_name.

Voir Fournir des liens de menu définis par le module et Ajouter un lien de men pour plus de détails et d'options.

8
colan

Pour développer la réponse @skorzh et répondre au commentaire de @Matt, si vous souhaitez imbriquer un élément de menu dans un autre, vous devez obtenir l'ID parent et le définir comme "parent". Par exemple, ce code imbrique l'élément dans le niveau supérieur à l'aide de la variable $top_level au dessous de.

  $my_menu = \Drupal::entityTypeManager()->getStorage('menu_link_content')
    ->loadByProperties(['menu_name' => 'my-menu-name']);
  foreach ($my_menu as $menu_item) {
    $parent_id = $menu_item->getParentId();
    if (!empty($parent_id) {
      $top_level = $parent_id;
      break;
    }
  }
  $menu_link = MenuLinkContent::create([
    'title' => 'My menu link title',
    'link' => ['uri' => 'internal:/my/path'],
    'menu_name' => 'my-menu-name',
    'parent' => $top_level,
    'expanded' => TRUE,
    'weight' => 0,
  ]);
  $menu_link->save();
1
wranvaud