Wie erstelle ich programmgesteuert Menülinks?

14

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

skorzh
quelle

Antworten:

24

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();
skorzh
quelle
1
entity_create ist veraltet. Verwenden Sie \ Drupal :: entityTypeManager () -> Speicher abrufen ('menu') - create ([]);
Eyal
1
Ich denke, dass die richtige Lösung das Menü yamls verwenden sollte
Eyal
3
in welchem ​​haken wird das richtig benutzt?
Paul
11
Wäre es in Ordnung, die Antwort zu erweitern? Es gibt nicht an, wo dieser Code platziert werden kann, um die Menüelemente zu generieren. Ich denke, Leute wie ich werden Mühe haben, dies zu akzeptieren und effektiv umzusetzen.
cwiggo
6
Wie würden Sie einem übergeordneten Link einen Menülink als untergeordnetes Element hinzufügen?
Matt
8

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.

colan
quelle
3
Menü-Yamls helfen nur, wenn Sie im Voraus wissen, welche Menüelemente Sie erstellen möchten. Die programmatische Erstellung kann auf dem Knoten gespeichert werden.
Duncanmoo
1
Wie füge ich so übersetzbare Menüpunkte hinzu? Wie ein Menüpunkt, jedoch in 3 Sprachen (verschiedene Menüpunkttitel und Pfade).
MilanG
1

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();
Wranvaud
quelle