Antworten:
Um ein Menüelement automatisch zu erstellen, kann dieses in eine hook_update_NDatei mymodule.installeingefü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 idSpalte des übergeordneten Elements in der menu_treeTabelle und route_namedie interne Routen-ID von Drupal für die Position, zu der das Menüelement verknüpft werden soll. Es ist in der menu_treeTabelle 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();