Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

Hook_menu Drupal 7 creando páginas a través del módulo

11/05/2025, by Ivan

En la lección anterior vimos cómo mostrar información desde la base de datos usando la API de Drupal, concretamente los hooks hook_block_info() y hook_block_view(). En esta lección vamos a mostrar páginas, es decir, vamos a registrar rutas y asociarlas con contenido usando el hook hook_menu(). Esto nos permitirá integrarlas con el sistema de menús, el módulo de traducción, plantillas y más.

Empezaremos con algo sencillo: crearemos una página que muestra los títulos y descripciones de las 10 últimas noticias, creando así una pequeña lista de noticias. Usaremos el hook hook_menu(). A continuación lo explicamos, y luego lo aplicamos.

hook_menu()

Este hook define las rutas (paths) del módulo y devuelve el contenido asociado a esas rutas.

Cuando se activa un módulo, Drupal llama a hook_menu() para registrar las rutas. Los resultados se almacenan en caché en la base de datos, por eso es necesario limpiar la caché cuando se modifica este hook.

hook_menu() devuelve un array asociativo, donde las claves son las rutas y los valores son arrays con las propiedades de cada ruta. Si no hay rutas más específicas que respondan a una URL dada, Drupal usará la ruta registrada aquí. Por ejemplo, si se registra la ruta 'abc/def', esta se utilizará para atender la URL http://example.com/abc/def.

function mymodule_menu() {
  $items['abc/def'] = array(
    'page callback' => 'mymodule_abc_view',
  );
  return $items;
}

function mymodule_abc_view($ghi = 0, $jkl = '') {
  // código de la página
}

Si se accede a abc/def/1/Omsk, los argumentos "1" y "Omsk" se pasarán a la función mymodule_abc_view().

Los argumentos también pueden pasarse explícitamente:

function mymodule_menu() {
  $items['abc/def'] = array(
    'page callback' => 'mymodule_abc_view',
    'page arguments' => array(1, 'foo'),
  );
  return $items;
}

Documentación oficial: hook_menu en Drupal API

Ejemplo: crear una página

function sitemade_menu(){
  $items = array();
  $items['page_example'] = array(
    'title' => 'Página de ejemplo',
    'description' => 'Una página sencilla',
    'page callback' => '_page_example',
    'access callback' => TRUE,
    'expanded' => TRUE,
  );    
  return $items;
}

function _page_example($content = NULL) {
  $content = '';
  $query = db_select('node_revision', 'n');
  $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid');
  $query->innerJoin('node', 'd', 'n.nid = d.nid');
  $query->fields('n', array('title', 'nid', 'vid'));
  $query->fields('b', array('body_value'));
  $query->condition('d.type', 'news');
  $query->orderBy('n.timestamp', 'DESC');
  $query->range(0, 10);
  $result = $query->execute();
  while ($nodes = $result->fetch()) {
    $content .= '

' . $nodes->title . '

'; $content .= $nodes->body_value; } return $content; }

Para mostrar esta página en el menú principal:

function sitemade_menu(){
  $items = array();
  $items['page_example'] = array(
    'title' => 'Página de ejemplo',
    'description' => 'Una página sencilla',
    'page callback' => '_page_example',
    'access callback' => TRUE,
    'expanded' => TRUE,
    'type' => MENU_NORMAL_ITEM,
    'menu_name' => 'main-menu',
  );    
  return $items;
}

Después de limpiar la caché, veremos el enlace en el menú:

Add menu

Mostrar una página en el área administrativa

function sitemade_menu(){
  $items = array();
  $items['admin/config/content/page_example'] = array(
    'title' => 'Página de ejemplo',
    'description' => 'Una página sencilla',
    'page callback' => '_page_example',
    'access arguments' => array('administer site configuration'),
  );    
  return $items;
}

Esto hará que la página aparezca como enlace en la sección de administración:

Drupal add menu page

Drupal muestra automáticamente enlaces en rutas que comienzan con admin/config/content/*. Si usamos admin/config/people/*, aparecerá en la sección "Usuarios".

Ahora ya sabemos cómo crear bloques y páginas, lo cual es fundamental para mostrar contenido en módulos personalizados. En la próxima lección veremos hook_perm(), para definir nuevos permisos para usuarios.