Come posso creare collegamenti di menu a livello di codice?


14

Ho bisogno di aggiungere alcuni collegamenti al menu esistente (o al nuovo) a livello di codice in Drupal 8.

Risposte:


24

Per creare automaticamente una voce di menu, questa può essere inserita in a hook_update_Nsul file mymodule.installe verrà eseguita quando il database viene aggiornato (/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();
}

Puoi anche creare un intero menu a livello di codice:

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

1
entity_create è obsoleto. Usa \ Drupal :: entityTypeManager () -> get storage ('menu') - create ([]);
Eyal,

1
Penso che la soluzione corretta dovrebbe usare il menu yamls
Eyal,

3
in quale gancio viene utilizzato correttamente?
Paul,

11
Andrebbe bene espandere la risposta? Non indica dove è possibile posizionare questo codice per generare le voci di menu. Penso che le persone come me faranno fatica a prenderlo e ad attuarlo in modo efficace.
Cwiggo,

6
Come aggiungeresti un collegamento di menu come figlio a un collegamento principale?
Matt,

8

Se desideri creare collegamenti di menu definiti dal modulo, aggiungi qualcosa come questo esempio al tuo file 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(facoltativo) è la idcolonna del genitore nella menu_treetabella ed route_nameè l'ID del percorso interno di Drupal per cui desideri collegare la voce di menu. È nella menu_treetabella come route_name.

Vedere Fornire collegamenti a menu definiti dal modulo e Aggiungi un collegamento a menu per ulteriori dettagli e opzioni.


3
Il menu yamls è utile solo se si conosce in anticipo quali voci di menu si desidera creare, la creazione programmatica può essere salvata nel nodo.
Duncanmoo,

1
Come aggiungere una voce di menu traducibile in quel modo? Come una voce di menu, ma in 3 lingue (titoli e percorsi di voci di menu diversi).
MilanG

1

Per espandere la risposta @skorzh e rispondere al commento di @Matt, se si desidera nidificare una voce di menu all'interno di un'altra, è necessario ottenere l'id parent e impostarlo come 'parent'. Ad esempio, questo codice nidifica l'elemento all'interno del livello superiore usando la variabile $top_levelseguente.

  $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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.