¿Cómo creo enlaces de menú mediante programación?

14

Necesito agregar algunos enlaces al menú existente (o al nuevo) mediante programación en Drupal 8.

skorzh
fuente

Respuestas:

24

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

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

También puede crear un menú completo mediante programación:

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

Consulte Proporcionar enlaces de menú definidos por el módulo y Agregar un enlace de menú para obtener más detalles y opciones.

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