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()
/**
* @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;
}
Obtención de información
* 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();
return $query;
}
Generando la salida del bloque: hook_block_view()
* Implementa hook_block_view().
*
* Prepara los contenidos del bloque
*/
function current_posts_block_view($delta = ”) {
switch($delta){
case ‘current_posts’:
$block[‘subject’] = t(‘Current posts’);
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));
}
}
}
return $block;
}