Como mostrar bloques programando en Drupal 8

Imagen
Bloques de juguete apilados

Poder mostrar los bloques que queramos utilizando código, es algo muy útil, pero si no sabemos qué tipo de bloques existen, puede ser confuso y complicado.

Primero veamos qué tipos de bloques existen y como distinguirlos.

Tipos de bloques:

  • Bloques de contenido: Estos son los bloques que creamos desde la parte administrativa de Drupal como bloques personalizados.
  • Bloques de plugin: Son creados en los módulos, los bloques que extienden de la clase Drupal\Core\Block\BlockBase, y tenemos que programarlos o ya vienen programados en algún modulo contribuido.
  • Bloques entidad de configuración: Son los más comunes, y se han creado a través de algún modulo, como los que se crean con Views y se colocan en Drupal a través de /admin/structure/block.

Como obtener el bloque y mostrarlo por codigo:

Vamos a ver cómo podemos obtener la ID de cada bloque y poder cargarlos dependiendo del tipo

Bloques de contenido:

Una vez que tenemos el bloque creado desde “Añadir bloque personalizado”, debemos editarlo para poder ver su id:

Editar un bloque personalizado en Drupal 8

Una vez que estamos editando el bloque, nos fijaremos en la URL, y podremos ver un numero después de /block en la ruta, el cual nos indicara su ID, en este ejemplo, la ID del bloque es 1 como se puede ver donde apunta la flecha.

Obtener la ID del bloque personalizado.

Pues esa ID, es la que debemos utilizar para cargar el bloque y después renderizarlo de la siguiente manera.

$bid = 1;
$block = \Drupal::entityTypeManager()->getViewBuilder('block_content')->load($bid);
$render = \Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block);

Ahora la variable $render contiene un array renderizable listo para mostrarlo, podemos hacerlo renderizandolo directamente, o enviándolo a una plantilla.

Bloques de plugin:

Como se ha mencionado, estos bloques hay que crearlos programándolos, y son los bloques que extienden de la clase Drupal\Core\Block\BlockBase.

Cuando tengamos el bloque localizado en el código, tenemos que fijarnos en la anotación que tiene al inicio de la clase, y mirar la ID:

ID de un bloque creado como un plugin

Para este ejemplo, el bloque se llama “neko_demo_block”, de modo que lo cargamos de la siguiente manera utilizando el servicio ‘plugin.manager.block’:

$block_manager = \Drupal::service('plugin.manager.block');
$config = [];
$block_plugin_id = 'neko_demo_block';
$plugin_block = $block_manager->createInstance($block_plugin_id, $config);
$render = $plugin_block->build();

Y al igual que con los bloques de contenido, en $render tendremos un array renderizable listo para renderizarlo o devolverlo y dejar que Drupal lo haga.

Bloques de entidad de configuración:

Vamos con el ultimo, en este caso, no importa de donde venga el bloque, puede ser un bloque creado por código, por algún modulo como Views o nosotros como un bloque personalizado. Lo primero que tenemos que hacer, es colocar el bloque en una región desde “Estructura -> Diseño de bloques”.

Una vez hayamos hecho esto, vamos a configurar el bloque:

Configurar un bloque en la parte administrativa de Drupal 8

Y miramos el valor de “Machine name” para tener su ID:

El machine name de un bloque en Drupal 8

Para este último ejemplo, la ID es “piedepagina”, de modo que repetimos casi el mismo código que con los bloques de contenido, solo que esta vez, en lugar de cargar bloques de la entidad “block_content”, los cargaremos de “block”:

$bid = “piedepagina”;
$block = \Drupal::entityTypeManager()->getViewBuilder('block')->load($bid);
$render = \Drupal::entityTypeManager()->getViewBuilder('block')->view($block);

Y de nuevo tenemos un array renderizable en $render para renderizarlo nosotros, o devolverlo para que Drupal lo haga.

Un ejemplo completo en GitHub

Os voy a dejar un ejemplo completo con todo el código en GitHub por si quedan dudas, que podáis verlo en acción, el código está dentro de un controlador llamado BlockController, y dentro podréis ver como cargar los distintos tipos de bloques accediendo a una ruta llamada /nireneko/block.

El controlador carga los bloques, y manda los arrays renderizables (que, en lugar de guardarlos en una variable, se guardan en un array) a una plantilla para que Drupal los renderice.

Las ID de los bloques tendréis que modificarlas en el código y además descomentar el código que queráis usar, ya que lo dejo todo comentado, para que podáis entrar a la ruta sin que os falle nada y así podáis ver lo que os interesa.

Artículos relacionados: