Crear menu link items en Drupal 8

Hace mucho tiempo ya que no escribía nada.

Llevo un tiempo metido de lleno con Drupal 8 y la experiencia va siendo buena. Falta mucho por hacer, pero el camino que lleva es bastante bueno y prometedor. 
Por ejemplo, una de las cosas que me ha surgido a lo largo de este tiempo ha sido la creación de enlaces en menús por código, y no a través de la inferfaz que drupal ofrece. Puede surgir la necesidad de crear un nuevo menú con muchos enlaces, y como es lógico, sería ridículo y una pérdida de tiempo hacer el proceso de ir creando uno a uno los links a través de la interfaz en un entorno de prueba, para luego volver a realizar la misma tarea en un entorno de producción.

Para ello podemos usar el hook_post_update_NAME .  Podéis ver lo que este hook ofrece, pero a grandes rasgos, nos permite ejecutar alguna acción a continuación de hook_update_N como pueda ser la de nuestro caso, la creación de entidades.

A continuación, se muestra un simple ejemplo de cómo añadir enlaces al menú principal

/**
 * Implements hook_post_update_mainmenu_items().
 * Performs actions to set up menus.
 */
function navi_site_topgear_master_post_update_mainmenu_items() {
  // Create default menu_link items for MAIN NAVIGATION menu.
  $menu_link_items = array(
    array(
      'link' => ['uri' => 'internal:/menu1'],
      'title' => 'Menu 1',
      'menu_name' => 'main',
      'weight' => 0,
    ),
    array(
      'link' => ['uri' => 'internal:/menu2'],
      'title' => 'Menu 2',
      'menu_name' => 'main',
      'weight' => 1,
    ),
    array(
      'link' => ['uri' => 'internal:/menu3'],
      'title' => 'Menu 3',
      'menu_name' => 'main',
      'weight' => 2,
    ),
  );
  foreach ($menu_link_items as $menu_link) {
    $entity = entity_create('menu_link_content', $menu_link)->save();
  }
}

Como podéis ver, es muy sencillo. Veamos ahora como hacer si lo que queremos es crear enlaces con hijos. El proceso sería el mismo, solo que únicamente necesitamos crear el enlace padre primero, para después indicar a los hijos el id de su padre. Veamos un ejemplo:

/**
 * Implements hook_post_update_mainmenu_items().
 * Performs actions to set up menus.
 */
function navi_site_topgear_master_post_update_mainmenu_items() {
  // Create default menu_link items for MAIN NAVIGATION menu.
  $menu_link_content = MenuLinkContent::create([
    'title' => 'Menu 1',
    'link' => ['uri' => 'internal:/menu1'],
    'menu_name' => 'main',
    'weight' => 0,
    'expanded' => TRUE,
  ]);
  $menu_link_content->save();
  
  $mid = $menu_link_content->getPluginId();
  $menu_link_items = array(
    array(
      'link' => ['uri' => 'internal:/menu1/hijo1'],
      'title' => 'hijo 1',
      'menu_name' => 'main',
      'weight' => 0,
      'parent' => $mid,
    ),
    array(
      'link' => ['uri' => 'internal:/menu1/hijo2'],
      'title' => 'hijo 2',
      'menu_name' => 'main',
      'weight' => 1,
      'parent' => $mid,
    ),
    array(
      'link' => ['uri' => 'internal:/menu1/hijo3'],
      'title' => 'hijo 3',
      'menu_name' => 'main',
      'weight' => 2,
      'parent' => $mid,
    ),
  );
  foreach ($menu_link_items as $menu_link) {
    $entity = entity_create('menu_link_content', $menu_link)->save();
  }
}

De esta forma, conseguimos crear por código un menú de los niveles que queramos, sin necesidad de recurrir a hacerlo de forma manual a través de la interfaz.

Ver

Comentarios

Imagen de Ignacio Farré
Muy bueno

Gracias por compartir, la verdad es que es muy fácil crear enlaces en el menú, lo estaba buscando para crear enlaces dinámicos dependiendo del mes en que  estamos.

Deja

un Comentario

Filtered HTML

  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.

Plain text

  • No se permiten etiquetas HTML.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
CAPTCHA
Esta pregunta es para comprobar si usted es un visitante humano y prevenir envíos de spam automatizado.