Sep 122011
 

Post to Twitter Post to Facebook


Como ya sabemos , los blocks son trozos de texto o funcionalidades localizadas en ciertas regiones de nuestro template, como por ejemplo : login form, who´s online,recent comments o search form.

Para crear nuestros propios blocks podemos seguir dos caminos :

  • Usando la interfaz de Drupal : Esta opción es muy recomendable cuando nuestro block es un contenido estático relacionado con el site.
  • Usando la block API : Usaremos esta opción cuando necesitemos blocks muy dinámicos,relacionados con un módulo que hemos desarrollado o un block algo más complejo.

En este post veremos cómo construir un block usando la API que drupal nos ofrece de una forma rápida y sencilla, dándonos la posibilidad de construir cualquier block que necesitemos.

Creando y configurando nuestro block.

Crearemos nuestro block dentro de un nuevo módulo, por tanto creamos un nuevo directorio en sites\all\modules al que llamaremos approval. A continuación creamos nuestro fichero approval.info :

name = Approval
description = Blocks for facilitating pending content workflow.
package = Pro Drupal Development
core = 7.x
version = VERSION
files [] = approval.module

Ahora creamos el fichero approval.module donde definiremos y configuraremos nuestro block. Con hook_block_info haremos que nuestro block aparezca en la lista de blocks de la página de administración, aquí definiremos varios atributos de nuestro block, para ello definimos hook_block_info de la siguiente forma:

<!--?php<br /-->
/**
 * @file
 * Implements various blocks to improve pending content workflow
 */

 /**
 * Implements hook_block_info().
 */

 function approval_block_info(){
 $blocks['pending_comments'] = array(
 'info' => t('Pending Comments'),
 'status' => TRUE,
 'region' => 'sidebar_first',
 'weight' => 0,
 'visibility' => 1,
 );
 return $blocks;
 }

Ahora podemos comprobar como nuestro block ya aparece disponible en la lista de blocks de la página de administración. Al haber establecido status = TRUE hemos activado nuestro block en la región siderbar_first :

A continuación vamos a añadir algunas opciones de configuración adicionales. Gracias a hook_block_configure añadiremos un nuevo campo al formulario de configuración en el que podremos establecer el número de comentarios pendientes que deseamos visualizar en nuestro block.


/**
 * Implements hook_block_configure().
 */

function approval_block_configure($delta){

 $form = array();

 switch ($delta) {
 case 'pending_comments':
 $form['pending_comment_count'] = array(
 '#type' => 'textfield',
 '#title' => t('Configure Number of Comments to Display'),
 '#size' => 6,
 '#description' => t('Enter the number of pending comments that will appear int the block.'),
 '#default_value' => variable_get('pending_comment_count', 5),
 );
 break;

 }

 return $form;
}

Finalmente para que todo funcione correctamente debemos implementar hook_block_save() para guardar los nuevos valores del campo de número de comentarios pendientes.Hook_block_save() se disparará automáticamente cuando enviemos los datos a través del formulario que creamos antes.

/**
* Implements hook_block_save().
*/
function approval_block_save($delta = '', $edit = array()){
 switch ($delta) {
 case 'pending_comments':
 variable_set('pending_comment_count', (int)$edit['pending_comment_count']);
 break;
 }
}
Visualizando el contenido del block

Una vez que ya hemos definido y establecido opciones de configuración  de nuestro block, es hora crear la vista que mostrará la lista de comentarios pendientes en nuestro block. Esto lo haremos implementando hook_block_view , estableceremos el título visible de nuestro block y asociaremos el contenido del bloque con lo que obtengamos en la función approval_block_content donde realizaremos la consulta a la base de datos para traernos los comentarios pendientes de publicar (status = 0),note que en la consulta tenemos en cuenta el número de comentarios pendientes que deseamos como máximo, el cual establecimos en las opciones de configuración del block.

/**
 * Implements hook_block_view().
 */
function approval_block_view($delta = ''){

 switch($delta){
 case 'pending_comments':
 $block['subject'] = t('Pending Comments');
 $block['content'] = approval_block_contents($delta);
 return $block;
 break;
 }
}

/**
 * A module-defined block content function
 */
function approval_block_contents($delta){

 switch($delta){
 case 'pending_comments':
 if(user_access('administer comments')){
 $nbr_comments = variable_get('pending_comment_count');
 $result = db_query("SELECT cid,subject FROM {comment} WHERE status = 0 LIMIT $nbr_comments");
 $items = array();
 foreach ($result as $row) {
 $items[] = l($row->subject, 'comment/'.$row->cid.'/edit');
 }
 return array('#markup' => theme('item_list', array('items' => $items)));
 break;
 }
 }
}

Con esto ya hemos terminado de crear nuestro block el cual se mostrará en la región de sidebar_first :

Conclusiones y posibles errores

Hemos podido ver que desarrollar nosotros un block no es nada complejo y nos aporta una gran flexibilidad a cambio.Si tras completar nuestro block este no aparece donde debería,comprueba los siguientes puntos :

  • Tenemos comentarios sin publicar (status = 0 ). Si no tenemos ningún comentario sin publicar nuestro bloque no aparecerá, por tanto es importante verificar este punto.
  • No tenemos ningún error de código. Una letra mal puesta puede dar al traste con todo el trabajo realizado y volvernos locos buscando el error.
  • Nuestro módulo Approval esta activado y tenemos la caché vacía.

Ahora a experimentar! :-)

Bibliografía : Pro Drupal 7 Development

Sorry, the comment form is closed at this time.