it-swarm.com.de

Wie erstelle ich programmgesteuert Menüverknüpfungen?

Ich muss programmgesteuert in Drupal 8) einige Links zu vorhandenen (oder neuen) Menüs hinzufügen.

14
skorzh

Um einen Menüpunkt automatisch zu erstellen, kann dieser in ein hook_update_N in der Datei mymodule.install 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 auch programmgesteuert ein ganzes Menü erstellen:

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

Wenn Sie moduldefinierte Menü-Links erstellen möchten, fügen Sie Ihrer custom_module.links.menu.yml Datei 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 Spalte id des übergeordneten Elements in menu_tree table und route_name ist die interne Routen-ID von Drupal, mit der der Menüpunkt verknüpft werden soll. Es ist in menu_tree Tabelle als route_name.

Weitere Informationen und Optionen finden Sie unter Bereitstellen von moduldefinierten Menü-Links und Hinzufügen eines Menü-Links .

8
colan

Um die Antwort von @skorzh zu erweitern und auf den Kommentar von @Matt zu antworten, müssen Sie die übergeordnete ID abrufen und als "übergeordnet" festlegen, wenn Sie ein Menüelement in einem anderen verschachteln möchten. Als Beispiel verschachtelt dieser Code das Element in der obersten Ebene mit der Variablen $top_level unten.

  $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