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):
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.
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();
Jeśli chcesz utworzyć zdefiniowane moduły łącza menu, dodaj coś takiego jak ten przykład do pliku custom_module.links.menu.yml :
parent
(opcjonalnie) toid
kolumna elementu nadrzędnego wmenu_tree
tabeli iroute_name
wewnętrzny identyfikator trasy Drupala, do którego chcesz połączyć element menu. Jest wmenu_tree
tabeli jakoroute_name
.Aby uzyskać więcej informacji i opcji, zobacz Udostępnianie zdefiniowanych menu modułów i Dodaj łącze menu .
źródło
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_level
poniższej zmiennej .źródło