Jak programowo tworzyć łącza menu?

14

Muszę dodać kilka linków do istniejącego menu (lub nowego) programowo w Drupal 8.

skorzh
źródło

Odpowiedzi:

24

Aby automatycznie utworzyć pozycję menu, można ją umieścić w hook_update_Npliku mymodule.installi będzie działać po aktualizacji bazy danych (/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();
}

Możesz także utworzyć całe menu programowo:

\Drupal::entityTypeManager()
  ->getStorage('menu')
  ->create([
    'id' => 'menu_test',
    'label' => 'Test menu',
    'description' => 'Description text',
  ])
  ->save();
skorzh
źródło
1
Utworzenie encji jest przestarzałe. Użyj \ Drupal :: entityTypeManager () -> get storage ('menu') - create ([]);
Eyal
1
Myślę, że poprawnym rozwiązaniem powinno być menu yaml
Eyal
3
w którym haku jest to właściwie stosowane?
Paul
11
Czy rozwinięcie odpowiedzi byłoby w porządku? Nie określa, gdzie można umieścić ten kod w celu wygenerowania pozycji menu. Myślę, że ludzie tacy jak ja będą mieli trudności z przyjęciem tego i skutecznym wdrożeniem.
cwiggo
6
Jak dodać łącze menu jako dziecko do łącza rodzica?
Matt
8

Jeśli chcesz utworzyć zdefiniowane moduły łącza menu, dodaj coś takiego jak ten przykład do pliku 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(opcjonalnie) to idkolumna elementu nadrzędnego w menu_treetabeli i route_namewewnętrzny identyfikator trasy Drupala, do którego chcesz połączyć element menu. Jest w menu_treetabeli jako route_name.

Aby uzyskać więcej informacji i opcji, zobacz Udostępnianie zdefiniowanych menu modułów i Dodaj łącze menu .

colan
źródło
3
Paski menu pomagają tylko wtedy, gdy wiesz z góry, jakie elementy menu chcesz utworzyć, tworzenie programowe może odbywać się przy zapisie węzła.
Duncanmoo
1
Jak w ten sposób dodać tłumaczone menu? Jak jedna pozycja menu, ale w 3 językach (różne tytuły pozycji i ścieżki).
MilanG
1

Aby rozwinąć odpowiedź @skorzh i odpowiedź na komentarz od @Matt, jeśli chcesz zagnieździć element menu wewnątrz innego, musisz uzyskać identyfikator nadrzędny i ustawić go jako „nadrzędny”. Na przykład ten kod zagnieżdża element na najwyższym poziomie, używając $top_levelponiższej zmiennej .

  $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
źródło