sábado, marzo 02, 2013

Cómo construir un módulo en Drupal 7 paso a paso

Descripción paso a paso de cómo construir y activar un módulo en un sitio Drupal 7. Se requiere que ya haya sido instalado el núcleo del nuevo sitio Drupal 7 (Drupal Core) en una plataforma como DAMP (Drupal + Apache + MySQL + PHP).

Contenido

  1. Crear archivos básicos del módulo
  2. Definir los metadatos del módulo
  3. Implementar un enganche de Drupal 7
  4. Activar el módulo
  5. Visualizar la ejecución del módulo

1. Crear archivos básicos del módulo

Para crear un módulo se necesitan básicamente dos archivos: la declaración del módulo (.info) y la implementación de su funcionalidad (.module). Estos archivos deben estar ubicados en una carpeta que debe llamarse igual que los archivos. Paso a paso:
  • Ir a la carpeta de instalación de nuestro sitio Drupal (por ejemplo "/Users/usuario/Documents/DrupalSites/drupal-example").
  • Ubicar la carpeta donde se deben ubicar los módulos que desarrollemos: "/sites/all/modules/custom/".
  • En dicha ubicación crear una nueva carpeta con el nombre del nuevo módulo. Por ejemplo "drupal_example". Este nombre nada tiene que ver con el nombre del sitio ("drupal-example").
  • Allí creamos dos archivos de texto nuevos con el nombre del módulo ("drupal_example") y las dos extensiones que mencionamos al principio: "drupal_example.info" y "drupal_example.module". 


2. Definir los metadatos del módulo

El Archivo de metadatos (drupal_example.info) debe contener como mínimo las tres líneas siguientes: nombre, descripción y la versión del núcleo de Drupal con la que es compatible. 



Por su parte, el archivo de implementación del módulo (drupal_example.module) consiste en un archivo  que comienza con el marcador de apertura de PHP (<%php), el cual NO SE CIERRA. La razón es que Drupal podría interpretar cualquier carácter después del cierre del bloque PHP como parte del contenido a mostrar en la página, incluso algo tan aparentemente inocuo como un salto de línea. Para evitar este tipo de problemas, se considera TODO el contenido del archivo como un bloque PHP.

3. Implementar un enganche de Drupal 7

Lo que hacemos típicamente en un archivo de implementación de un módulo es extender o reemplazar la funcionalidad nativa de Drupal con nuestro propio código. Para hacerlo usamos un recurso llamado "enganche" (hook) que es invocado por el núcleo de Drupal en muchos puntos clave para para su funcionamiento interno. La lista de los enganches del sistema de módulos de Drupal 7 está en api.drupal.org.

Si un módulo habilitado implementa un enganche que sea relevante en la operación que se está ejecutando en ese momento, Drupal ejecuta el código del enganche definido en el módulo en lugar de su implementación nativa. Para nuestro ejemplo, vamos a implementar el enganche "hook_init", que es lo primero que se ejecuta cuando se va a construir el contenido de cualquier página de un sitio Drupal.

<?php
/**
 * Implements hook_init()
 *
 * Runs on every page
 */

function drupal_example_init()
{
  global $user; // Use the global variable $user
  $greeting = "$user->name, ";

  // Greets the user according to the current time
  if (date('A') == "PM")
    $greeting .= "Good afternoon!";
  else
    $greeting .= "Good morning!";

  print_r($greeting);
}



  • La convención es reemplazar la palabra "hook" en el nombre de la función por el nombre del módulo. Así, si el enganche se llama "hook_init", lo implementamos como "drupal_example_init".
  • Si el enganche recibe parámetros, nuestra función también debe recibir los mismos parámetros. En este caso no recibe ninguno.
  • Si el enganche devuelve contenido, también debe hacerlo nuestra función y, obviamente, con el mismo formato. Tampoco es el caso en este ejemplo.
  • Para mostrar un sencillo texto dinámico, usamos la variable global "$user", la cual se inicializa con los datos del usuario autenticado. Evidentemente si el visitante todavía no ha ingresado al sitio Drupal pues no va a existir la variable "$user".
  • Inicializamos la variable en la que vamos a construir un saludo sencillo con el nombre del usuario, que corresponde al atributo "name" de la variable "$user".
  • Usamos la función nativa de PHP "date()" para obtener la fecha y hora actuales. Le pasamos como parámetro el formato "A" para que retorne únicamente "AM" o "PM" dependiendo de la hora.
  • Dependiendo de la hora, se anexa a la variable de saludo el texto correspondiente.
  • Como el enganche no devuelve ningún contenido, simplemente usamos la función nativa de PHP "print_r()" para mostrar el texto en la salida estándar, que en este caso sería la parte de la página donde se invocó al enganche. 

4. Activar el módulo

  • Asegurarse de que el sitio Drupal esté ejecutándose. 
  • Abrir el sitio e ingresar como administrador.
  • En el menú administrativo click en "Modules".
  • En la lista que se despliega, bajar hasta la sección "OTHER" y habilitar el nuevo módulo marcando la casilla "ENABLED" correspondiente.
  • Click en "Save configuration".
  • En caso que no se viera el módulo, limpiar cache y recargar la página de módulos:
    • En el menú administrativo click en "Configuration".
    • En la sección "DEVELOPMENT" de la página que se despliega, click en "Performance".
    • En la página que se despliega click en "Clear all caches".


5. Visualizar la ejecución del módulo

Abrir cualquier página como usuario autenticado. Lo primero que debería mostrarse inmediatamente después del menú administrativo es el texto de nuestro saludo construido dinámicamente por nuestro módulo:


Como el texto no se devolvió como un contenido estructurado, no hace parte de ningún bloque de la diagramación que Drupal calcula para el sitio web. Se trata vilmente de un texto puesto como caiga en el código HTML de la página, como lo podemos evidenciar inspeccionando el elemento BODY: