menu
Crear un bloque en Drupal 8
El código de Drupal 8 es diferente del de versiones anteriores. Se han adoptado conceptos y estandares modernos, la programación es ahora mayoritariamente orientada a objetos y se usan componentes de Symfony.
Ahora crear un módulo, una página o un bloque es totalmente diferente. Mi intención con esta serie de artículos es mostrar como se hace ahora para facilitaros el paso a esta nueva versión que vale mucho la pena.
Puedes leer otros artículos de esta serie:
- Crear un módulo para Drupal 8
- Crear una página desde un módulo para Drupal 8
- Añadir parametros a una página en Drupal 8
- Plugins en Drupal 8
- Crear un bloque en Drupal 8
Un bloque es un plugin
Así, cada bloque estará definido en una clase que tendrá que:
- Estar en la subcarpeta src/Plugin/Block de nuestro módulo
- Tener la anotación @Block
- Implementar la interfaz Drupal\Core\Block\BlockPluginInterface
Vamos por partes.
Crear un módulo para nuestro bloque
Lo primero que debemos hacer, si no tenemos ya uno, es crear un módulo personalizado para que contega nuestro bloque. Crearemos uno llamado custom.
PRO TIP: Si vais a la página de proyecto de drupal.org para el proyecto custom (http://drupal.org/project/custom), vereis que existe, pero de una forma curiosa. El creador de este "módulo" lo describe como un proyecto placeholder para protejer el nombre custom que usualmente utilizan las webs con Drupal para código personalizado. Así que, podemos llamar a nuestro módulo así sin problema.
Crearemos la carpeta /modules/custom y, en su interior, el archivo custom.info.yml con este contenido:
name: Custom
core: 8.x
type: module
Crear el archivo que contendrá nuestro bloque
Drupal 8 sigue la recomendación PSR-4 que describe la estructura y nombres que deben tener carpetas y archivos de las clases y su espacio de nombres para que puedan cargarse automáticamente. En nuestro caso, crearemos la carpeta src/Plugin/Block en nuestro módulo y en su interior el archivo CustomHelloWorldBlock.php
La clase BlockBase
La interfaz BlockPluginInterface es compleja. Las clases que la implementan tienen que ocuparse de gestionar muchos aspectos del bloque que, en su mayoria, son iguales para todos. Por ello existe la clase abstracta BlockBase, que implementa la mayoria de métodos de la interfaz con la lógica común. Se ocupa de contruir el formulario de configuración y de gestionar el acceso al bloque y deja para nuestra implementación la responsabilidad de definir que mostrará el bloque.
En nuestro caso, utilizaremos BlockBase, nuestra clase quedará así:
<?php
namespace Drupal\custom\Plugin\Block;
use Drupal\Core\Block\BlockBase;
class CustomHelloWorldBlock extends BlockBase {
public function build() {
...
}
}
Construyendo nuestro bloque: la funcion build
Como veis, solo definimos una funcion: build. Esta es la única función que debemos incluir obligatoriamente y es la encargada de construir nuestro bloque; debe devolver un Render Array.
Un Render Array define lo que se va a mostrar pero permite su manipulación posterior y gestionar como se cachea. En futuros artículos entraremos en más detalle.
El contenido de nuestrá función build será:
...
return array(
'#markup' => $this->t("Hello, World!"),
);
...
Mostrando nuestro bloque
Ahora ya podemos colocar nuestro bloque en una región de nuestra página y configurar cual será su título y su visibilidad. Desde Drupal 8 además, ¡podemos crear nuestro bloque tantas veces como queramos!