Como crio links de menu programaticamente?

14

Preciso adicionar alguns links ao menu existente (ou ao novo) programaticamente no Drupal 8.

skorzh
fonte

Respostas:

24

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):

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();
}

Você também pode criar um menu inteiro programaticamente:

\Drupal::entityTypeManager()
  ->getStorage('menu')
  ->create([
    'id' => 'menu_test',
    'label' => 'Test menu',
    'description' => 'Description text',
  ])
  ->save();
skorzh
fonte
1
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.

Consulte Fornecendo links de menu definidos pelo módulo e Adicionar um link de menu para obter mais detalhes e opções.

colan
fonte
3
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();
wranvaud
fonte