Bloques Drupal ¿ como funcionan ?

Una de las funcionalidades más potentes de Drupal, a mi parecer, son los bloques. A poco que hayas trabajado con Drupal los has usado, pero llegar al fondo del asunto es más complejo de lo que parece.

¿ Que es un bloque ?

Un bloque en drupal es un elemento independiente que se puede visualizar de manera configurable. Podemos filtrar las páginas donde se ve este bloque, y además seleccionar en que región de la web se visualiza. Y aún más, para cada theme la configuración de bloques es independiente.

Regiones

Las regiones en Drupal son espacios de la web que a través de nuestro diseño (template) posicionamos allí donde queramos. Añadir una region en Drupal es sencillo, en el archivo .info (directorio theme) añadimos una línea que ponga:

regions[nombre_maquina_region]       =  Nombre Región

Una vez Añadida esta línea, en el apartado bloques de Drupal nos aparece esta región si seleccionamos este theme. Ojo con el theme registry y la caché que a veces nos juegan malas pasadas al no visualizarse estas nuevas regiones.

Tipos de bloque

Los bloques pueden ser de dos tipos : bloques generados por módulos o bloques estáticos de usuario. Los bloques generados aparecerán automáticamente según los módulos instalados o dependiendo de si creamos vistas de bloque. En cambio, los bloques de usuario, son trozos de código (html/php) que entramos a mano. Para crear estos bloques solo tenemos que clicar en "Añadir bloque" en la página de bloques.

¿ Código php dentro de los bloques de usuario ?

Podemos entrar código php dentro de un bloque de usuario. Primero debemos habilitar el módulo del core de Drupal "php filter". Esto nos permite añadir código php dentro de un campo de texto, en este caso un bloque. Recordad que hemos de añadir siempre los <?php ... ?> allá donde sea necesario, el php filter solo nos permite que estos se interpreten como php. 

Visualización especial de bloques

Podemos decidir donde se ve un bloque y donde no. Podemos entrar las páginas donde queremos ver este bloque o por otra parte visualizarlo en todas las página y añadir excepciones. Estas opciones funcionan a través de la url, por ejemplo si yo pongo "c*" todas las páginas con url que empiece por c veran (o excluiran) este bloque.

Por otro lado podemos usar código php para decidir si visualizar. Usad <?php ... ?> para poner código php y devolved con return true/false si se visualiza o no.

Pero hay más filtros interesantes dentro de la configuración de bloque. Podeis filtrar por usuarios y roles, por tipo de contenido del nodo, e incluso por idiomas (en caso de usar el multiples idiomas).

Bloques dentro de templates

Rizando el rizo, es posible llegar a visualizar un bloque dentro de un archivo tpl.php. Para incrustar un bloque desde el código de estos archivos solo tenemos que añadir el código:

<?php
$block = module_invoke('modulo', 'block_view', 'id_modulo');
print $block['content'];
?>

Hemos de tener varias cosas en cuenta: el primer argumento de module_invoke() es el nombre del modulo del bloque, por ejemplo si es un bloque de webform, tenemos que poner 'webform'. En caso de ser un bloque creado por usuario debemos poner 'block'. El segundo argumento es siempre 'block_view' si queremos visualizar. El último  argumento es el id del bloque. Este id lo podemos conseguir si vamos a la configuración del bloque y miramos la url que será del estilo admin/structure/block/manage/modulo/id-del-bloque .

¿ Bloques dentro de bloques ?

Usando esta última técnica y el php filter con código php podriamos incrustar un bloque dentro de otro bloque. Parace un poco raro pero yo lo he llegado a usar en un caso extremo.

Conclusión

Entender como funcionan los bloques es algo fundamental para usar Drupal al máximo de sus posibilidades. Cuando necesites añadir información complementaria, columnas laterales, o cualquier tipo de contenido estático, es siempre recomendable usar bloques antes que hacerlo con programación. De esta manera el usuario final podrá editar el contenido del bloque visualmente.