Drupal 7: Como crear un hook

En el articulo anterior "Que es un hook en drupal?",  explicamos que son y como funcionan los hooks y ya solo nos quedaría saber como poder identificarlos en el código y como poder replicarlo en nuestros módulos.

Drupal dispone de unas cuantas funciones para hacer esto, pero nosotros nos centraremos en tres, drupal_alter(), module_invoke_all(), module_invoke().

Como ya hemos podido ver existen,como normal general, dos tipos de hooks y esto se ve reflejado también a la hora de como se llaman. 

Drupal_alter()

Si lo que queremos es dejar que otros módulos puedan acceder a nuestros objetos, variables y demás, usaremos drupal_alter(). Este nos permite pasarle estar variables para que estén disponible para cualquier modulo dentro de drupal.

<?php
  …$data = consulta a la base de datos…
 // Permitimos que otros módulos modifiquen nuestra información
  drupal_alter(‘nombre_del_hook’, $data);
  // Esto nos creara el siguiente hook:  HOOK_nombre_del_hook_alter()
?>

Como vemos en el código anterior, a drupal_alter(), le pasamos dos variables, la primera será el nombre del gancho y la segunda sera los datos a modificar.

En caso de necesitar pasar mas información drupal_alter nos permite añadir hasta 3 contextos extras.

Estas variables “$data” que le pasamos se hacen por referencia, es decir, que hay que tener mucho cuidado con lo que hacemos porque estaremos editando la variable o objeto directamente.

Module_invoke(), module_invoke_all()

De otro modo, si lo que necesitamos es, avisar a la aplicación de que algo esta pasando, es decir, un evento, usaremos las funciones invoke.

Estas funciones llamaran a los hooks de los módulos que estemos invocando para que ejecuten sus propias acciones.

Para este trabajo, drupal, nos proporciona dos posibilidades. Una es invocar a todos los módulos para ver si instancian este hook.

<?php
  module_invoke_all(‘nombre_del_hook’);
?>

O si de lo contrario, solo quieres invocar un modulo en concreto para que ejecute una acción concreta usaremos este otro sistema.

<?php
  module_invoke('nombre_del_modulo', ‘name');
  @note: Tiene que ser el nombre del modulo sin “.module”
?>

Llamando a hooks con module_implements()

Aunque os dije que habían solo dos tipo de llamadas, en realidad, existe una tercera y aunque es una practica bastante común en el core de drupal, como normal general quienes implementan este tipo de llamadas, son módulos bastante importantes.

No obstante, os traigo un ejemplo de como implementarlo.

<?php
  foreach (module_implements(‘nombre_del_hook’) as $module) {
    $function = $module . '_nombre_del_hook';
    $function($arg1, $arg2);
  }
?>

Como vemos en el código anterior, lo que hacemos es un repaso por todos los módulos que implementan este hook y lo llamamos para que la función ejecute su código.

Este método es bastante interesante, porque nos permite tener todo el control del hook y decidir si queremos utilizar el hook como evento o como extension del mismo simplemente dependiendo de como hagamos la llamada y declaración del hook en nuestro modulo.

Total de votos: 167

Entradas relacionadas

Comentarios (1)

  • Imagen de borja

    borja

    Por ampliar un poco mas lo ya explicado aqui sobre module_implements. Este metodo para llamar a un hook, se utiliza cuando se desea llamar a un hook, pero no va a ser un alter, y se quieren pasar las variables por referencia, por ejemplo en los preprocess de los temas ya que module_invoke los pasa como valor. Es como si fuera una mezcla de module_invoke y drupal_alter.

Deja un comentario