Antworten:
Um ein Menüelement automatisch zu erstellen, kann dieses in eine hook_update_N
Datei mymodule.install
eingefügt werden und wird ausgeführt, wenn die Datenbank aktualisiert wird (/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();
}
Sie können ein gesamtes Menü auch programmgesteuert erstellen:
\Drupal::entityTypeManager()
->getStorage('menu')
->create([
'id' => 'menu_test',
'label' => 'Test menu',
'description' => 'Description text',
])
->save();
Wenn Sie moduldefinierte Menüverknüpfungen erstellen möchten , fügen Sie Ihrer Datei custom_module.links.menu.yml Folgendes hinzu :
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
(Optional) ist die id
Spalte des übergeordneten Elements in der menu_tree
Tabelle und route_name
die interne Routen-ID von Drupal für die Position, zu der das Menüelement verknüpft werden soll. Es ist in der menu_tree
Tabelle als route_name
.
Siehe Bereitstellung von Modul definiertes Menü Links und hinzufügen Menü - Link für weitere Informationen und Optionen.
Um die Antwort auf @skorzh zu erweitern und auf den Kommentar von @Matt zu antworten, müssen Sie die übergeordnete ID abrufen und als 'übergeordnet' festlegen, wenn Sie einen Menüeintrag in einen anderen verschachteln möchten. Als Beispiel verschachtelt dieser Code das Element in der obersten Ebene unter Verwendung der folgenden Variablen $top_level
.
$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();