Drupal 7: Que es un hook en drupal?

Buenas Drupaleros, hoy nos reunimos en este articulo para hablar de los hooks. En este articulo veremos que son, para que sirven y como se usan.

Empecemos por el principio.

Bien, lo primero que vamos hacer es intentar entender que son los hooks y porque son tan importantes en drupal.

Como todos ya habreis podido comprobar, drupal, es un complejo sistema de módulos y plantillas los cuales se unen e interactuan entre ellos, generalmente “sin problemas”, haciendo que la union de todos estos factores de como resultado una magnifica web.

Pero… y como es esto posible? como es capaz de poder obtener información de cientos de módulos y reconvertirlo en una pagina web operativa? 

Estas son de las primera preguntas que a todo principiante se le debe de venir a la cabeza y bien la respuesta es muy fácil todo esto es el resultado de la magia de usar hooks. 

Como su propio nombre indica en español hook significa gancho y el nombre esta perfectamente elegido pues, lo que hace drupal es ir “pescando” por los módulos como haría cualquier pescador en el mar, y que usa un pescador para pescar a parte de una caña? Bingo! un gancho!.

Vamos al código

Seguro que si habeis entrado en cualquier modulo de los contribuidos habréis visto funciones con unos nombres bastante extraños y con unos comentarios aun mas extraños de cabecera como por ejemplo este:

<?php
/**
 * Implements hook_menu();
 */
function NOMBRE_DEL_MODULO_menu() {
  $items[‘…’] = ….
  ….
  return $items;
}
?>

Esto, no es mas que los estándares de drupal para poder declarar un hook, pero veamos un poquito mas de cerca el código anterior y vamos a ir desgranándolo.

/**
 * Implements hook_menu();
 */

Esto que acabamos de ver es lo primero que debemos poner antes de empezar el hook y no es mas que comentar el nombre del hook que vamos a usar. 

Definir el nombre del hook antes de usar es una practica obligada por las buenas practicas de drupal a la hora de programar módulos y temas.

Aunque pueda carecer de sentido, es cierto que, cuando tenéis que repasar módulos contribuidos esta, es de gran ayuda.

Prestar atención a la palabra “hook” esto no es trivial. Esto nos servirá para poder diferenciar cual es la parte fija y cual es la parte que hemos de sobrescribir.

Bueno, y ahora os estaréis preguntando, que significa esto de la parte fija y la parte que se sobrescribe. 

Como os comentaba al principio drupal cuando se va de “pesca” no puede saber que funciones a de buscar en la inmensidad de módulos que existen y menos aun si contamos que tu mismo puedes crear tu propio hook con su propio nombre.

Entonces, como lo hace? sencillo!, bueno mas o menos!… lo que hace drupal es asignar una palabra fija a modo de referencia, en este caso _menu y un comodín que variará, en este caso NOMBRE_DEL_MODULO, pero veamos un ejemplo real:

<?php
/**
 * Implements hook_menu();
 */
function contador_visitas_menu() {
  $items[‘…’] = ….
  ….
  return $items;
}
?>

Como podéis ver, he cambiado “NOMBRE_DEL_MODULO” por un nombre que podría ser mas real “contador_visitas” y en este caso cuando drupal lea mi archivo “contador_visitas.module” de mi modulo “contador_visitas” verá, que he echo una declaración a un hook porque ha encontrado la referencia ”_menu" con el nombre del modulo “contador_visitas”.

La importancia de los nombres.

Empezáis ya a ver la importancia de los nombres de las carpetas y archivos? todo esta relacionado. Pero dejadme enseñaros como funciona este proceso. Para esto haremos uso de nuestra imaginación.

Primero, drupal bucea en los módulos que hay activos, entre ellos encuentra el mío, “contador_visitas”, luego navega en busca de “contador_visitas.module” (el_nombre_del_modulo + “.module”), existe? sí, entra y busca la cadena de referencia que este buscando en ese momento, en este caso “_menu” y le añade en nombre del modulo, “contador_visitas”.

Dejadme aclarar que, esto, como ya os podéis imaginar, es un procedimiento muy costoso para el servidor y por eso este procedimiento solo lo realiza en la primera carga de la aplicación ya sea después de limpiar caches o después de una instalación y lo guarda en caches, por eso siempre que añadamos un hook tendremos que limpiar caches.

En este caso el resultado de lo que drupal esta buscando es “contador_visitas_menu”, existe? sí, pues entra y guarda la función para llamarla cuando sea necesaria.

Y voilá, drupal acaba de acceder a nuestro hook y nos va permitir poder extender el código de drupal con el nuestro.

Existen una larga lista de hooks que drupal trae en el core, lista aquí, pero también tendréis que tener en cuenta que cualquier otro modulo podria traer con sigo llamadas a sus propios hooks, siempre es bueno leerse la documentación del modulo.

Hook como activador de eventos

Los hooks también tienen una doble funcionalidad, aparte de, como ya hemos visto, extender funcionalidades o modificar objetos del código drupal o de cualquier modulo contribuido que nos lo permita, podemos usarlo a modo de un activador de eventos.

Es decir, imaginemos que tenemos una acción que realiza una serie de operaciones, pero nosotros queremos interceptar esas operaciones y modificar su comportamiento para adaptarla a nuestra aplicación. 

En este caso, usaríamos los hooks para poder modificar el comportamiento normal de la acción, utilizando la misma inercia que usamos para expandir el código del drupal.

Veamos un ejemplo:

<?php
/**
 * Implements hook_node_delete();
 */
function contador_visitas_node_delete($node) {
  ….
  Eliminar visitas de este nodo. 
  ….
}
?>

Siguiendo el modulo de este ejemplo, lo que acabamos de hacer con el código anterior, es simplemente decirle a drupal que, cuando un nodo sea eliminado, nos avise que nosotros tenemos que realizar cambios en la base de datos.  

Notar la diferencia que existe entre extender o utilizar un evento, este será dependiendo de la llamada del hook.

Total de votos: 220

Entradas relacionadas

Comentarios (3)

  • Imagen de ematiello

    ematiello

    Muy buena info, seria bueno profundizarla.

  • Imagen de Gallardo

    Gallardo

    Quisiera bloquear el contenido y debloquearlo con un like en fb o google + tal y como lo hacen el código de este articulo, como lo hago?? Ayudaa!!

  • Imagen de admin

    admin

    Esto es un modulo custom que realicé para drupaleros. el widget en si es este (http://codecanyon.net/item/social-locker-for-jquery/3408941) a partir de ahí lo implemente para drupaleros. un saludo.

Deja un comentario