Una vez gestionados los datos principales del módulo, a veces, es necesario poder presentar información en forma de bloques, tal como mencionamos en la 7ª entrega del curso de Drupal 7.
A continuación, detallaremos los pasos fundamentales para la generación de bloques desde un módulo.

Declaración de un Bloque: hook_block_info()

Este el el hook principal para la definición de bloques. Veamos un ejemplo de definición en un fichero .module:
<?php
/**
 * @file
 * Module file for block_example.
 */
/**
* Implementa hook_block_info().
*/
function current_posts_block_info() {
  $blocks[‘current_posts’] = array(
    ‘info’ => t(‘Current posts’), //El nombre que aparecerá en el listado de bloques
    ‘cache’ => DRUPAL_CACHE_PER_ROLE, //Default
  );
  return $blocks;
}
A partir de est momento debería salir el bloque en el listado de bloques.

Obtención de información

Es el momento de recoger los datos que queremos presentar en el bloque, para ello utilizamos una función creada por nosotros:
/**
* Función de obtención de Contenido
*
* Intenta recoger los elementos que están en la base de datos entre una fecha y otra.
*
* @return
*   Un result set de los post entre dos fechas.
*/
function current_posts_contents(){
  //Coge la fecha de hoy
  $today = getdate();
  //Calcula la fecha hace una semana
  $start_time = mktime(0, 0, 0,$today[‘mon’],($today[‘mday’] – 7), $today[‘year’]);
  //Coge la hora actual como la fecha final
  $end_time = time();

  //Usa el API de Database para hacer la consulta
  $query = db_select(‘node’, ‘n’)
    ->fields(‘n’, array(‘nid’, ‘title’, ‘created’))
    ->condition(‘status’, 1) //Published.
    ->condition(‘created’, array($start_time, $end_time), ‘BETWEEN’)
    ->orderBy(‘created’, ‘DESC’) //Most recent first.
    ->execute();

//devuelve los resultados de la consulta
  return $query;
}

Generando la salida del bloque: hook_block_view()

Para generar la salida será necesario implementar el hook_block_view() en el fichero .module. Veamos un ejemplo de utilización:
/**
* Implementa hook_block_view().
*
* Prepara los contenidos del bloque
*/
function current_posts_block_view($delta = ”) {
   //verifica que bloque es el que quiere presentar
  switch($delta){
   //en caso de que sea nuestro bloque
    case ‘current_posts’:
      //genera un array para definir el bloque
      $block[‘subject’] = t(‘Current posts’);
      //verifica los permisos del usuario, en este caso para acceder al contenido
      if(user_access(‘access content’)){
        //Usamos nuestra función para recoger los datos
        $result = current_posts_contents();
        //Genera un array para introducir los datos de la consulta de manera estructurada
        $items = array();
        //Bucle que recorre los resultados y obtiene cada nodo para introducir los datos en el array
        foreach ($result as $node){
          $items[] = array(
            ‘data’ => l($node->title, ‘node/’ . $node->nid),
          );
        }
        //Verifica que el array no esta vacio
        if (empty($items)) { //No content in the last week.
          $block[‘content’] = t(‘No posts available.’);
        }
        else {
          //Pasa los datos a la funcion theme para maquetarlos
          $block[‘content’] = theme(‘item_list’, array(
            ‘items’ => $items));
        }
      }
  }
  //Devuelve el bloque a dibujar
  return $block;
}

Probando

Una vez genradas estas funciones será necesario activar el módulo, verificar que el bloque está presente en el listado, asignarle una región y recargar la página para ver los resultados.
Licencia Creative Commons