Para criar um item de menu automaticamente, ele pode ser colocado no hook_update_Narquivo mymodule.installe será executado quando o banco de dados for atualizado (/update.php):
entity_create está obsoleto. Use \ Drupal :: entityTypeManager () -> obtenha armazenamento ('menu') - crie ([]);
Eyal
1
Eu acho que a solução correta deve usar os yamls de menu
Eyal
3
em qual gancho isso é usado corretamente?
Paul
11
Seria bom expandir a resposta? Não indica onde esse código pode ser colocado para gerar os itens de menu. Eu acho que pessoas como eu terão dificuldade em aceitar isso e implementá-lo de forma eficaz.
Cwiggo
6
Como você adicionaria um link de menu como filho a um link pai?
Matt
8
Se você deseja criar links de menu definidos por módulo, adicione algo como este exemplo ao seu arquivo 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) é a idcoluna do pai na menu_treetabela e route_nameé o ID da rota interna do Drupal para onde você deseja vincular o item de menu. Está na menu_treemesa como route_name.
Os inames de menu apenas ajudam se você souber com antecedência quais itens de menu deseja criar. A criação programática pode estar no salvamento do nó.
Duncanmoo 04/04
1
Como adicionar um item de menu traduzível dessa maneira? Como um item de menu, mas em três idiomas (títulos e caminhos diferentes de itens de menu).
MilanG 10/09
1
Para expandir a resposta @skorzh e responder ao comentário do @Matt, se você deseja aninhar um item de menu dentro de outro, é necessário obter o ID do pai e defini-lo como 'pai'. Como exemplo, esse código aninha o item dentro do nível superior usando a variável $top_levelabaixo.
$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();
Se você deseja criar links de menu definidos por módulo, adicione algo como este exemplo ao seu arquivo custom_module.links.menu.yml :
parent
(opcional) é aid
coluna do pai namenu_tree
tabela eroute_name
é o ID da rota interna do Drupal para onde você deseja vincular o item de menu. Está namenu_tree
mesa comoroute_name
.Consulte Fornecendo links de menu definidos pelo módulo e Adicionar um link de menu para obter mais detalhes e opções.
fonte
Para expandir a resposta @skorzh e responder ao comentário do @Matt, se você deseja aninhar um item de menu dentro de outro, é necessário obter o ID do pai e defini-lo como 'pai'. Como exemplo, esse código aninha o item dentro do nível superior usando a variável
$top_level
abaixo.fonte