Para crear un elemento de menú automáticamente, esto se puede colocar en un hook_update_Narchivo mymodule.instally se ejecutará cuando se actualice la base de datos (/update.php):
entity_create está en desuso. Use \ Drupal :: entityTypeManager () -> obtener almacenamiento ('menú') - crear ([]);
Eyal
1
Creo que la solución correcta debería usar el menú yamls
Eyal
3
¿En qué gancho se usa esto correctamente?
Paul
11
¿Estaría bien expandir la respuesta? No indica dónde se puede colocar este código para generar los elementos del menú. Creo que las personas como yo tendrán dificultades para tomar esto e implementarlo de manera efectiva.
cwiggo
66
¿Cómo agregaría un enlace de menú como hijo a un enlace padre?
Matt
8
Si desea crear enlaces de menú definidos por módulos, agregue algo como este ejemplo a su archivo 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(opcional) es la idcolumna del elemento primario en la menu_treetabla y route_namees la ID de ruta interna de Drupal para el lugar al que desea vincular el elemento del menú. Está en la menu_treemesa como route_name.
Los yamls de menú solo ayudan si sabe de antemano qué elementos de menú desea crear, la creación programática puede estar en el guardado del nodo.
Duncanmoo
1
¿Cómo agregar un elemento de menú traducible de esa manera? Como un elemento de menú, pero en 3 idiomas (diferentes títulos y rutas de elementos de menú).
MilanG
1
Para ampliar la respuesta de @skorzh y responder al comentario de @Matt, si desea anidar un elemento de menú dentro de otro, debe obtener la identificación principal y establecerla como 'principal'. Como ejemplo, este código anida el elemento dentro del nivel superior utilizando la variable a $top_levelcontinuación.
$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();
Si desea crear enlaces de menú definidos por módulos, agregue algo como este ejemplo a su archivo custom_module.links.menu.yml :
parent
(opcional) es laid
columna del elemento primario en lamenu_tree
tabla yroute_name
es la ID de ruta interna de Drupal para el lugar al que desea vincular el elemento del menú. Está en lamenu_tree
mesa comoroute_name
.Consulte Proporcionar enlaces de menú definidos por el módulo y Agregar un enlace de menú para obtener más detalles y opciones.
fuente
Para ampliar la respuesta de @skorzh y responder al comentario de @Matt, si desea anidar un elemento de menú dentro de otro, debe obtener la identificación principal y establecerla como 'principal'. Como ejemplo, este código anida el elemento dentro del nivel superior utilizando la variable a
$top_level
continuación.fuente