Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

9.2. ¿Qué significa "gancho" en Drupal?

04/05/2025, by Ivan

Este artículo está destinado a familiarizarte con Drupal. Más adelante escribiremos ejemplos de código, después de agregar nuestro módulo personalizado.

Drupal no es un sistema monolítico en el que todo sea perfecto y nada necesite ser modificado. Muy a menudo, los clientes solicitan añadir una u otra funcionalidad al sitio. Para poder mantener el código núcleo de Drupal y agregar funcionalidad a Drupal, utilizamos módulos. El sistema modular permite ampliar las capacidades de Drupal. Pero, ¿qué pasa si necesitamos ampliar las capacidades de un módulo ya existente? Por supuesto, podemos enviar una solicitud para mejorar la funcionalidad necesaria creando un issue en drupal.org, y tal vez en un mes, dos... un año o dos, obtengamos la funcionalidad deseada en el módulo correspondiente. Pero podemos actuar de otra manera y escribir nosotros mismos el código que necesitamos. Para ampliar las capacidades tanto de los módulos adicionales de Drupal como del propio Drupal, utilizaremos hooks y plugins en nuestros propios módulos.

La idea principal es que no necesitamos mantener el código de Drupal ni el de los módulos adicionales, y con esto ahorraríamos significativamente en el trabajo del programador. Para poder actualizar fácilmente el código de los módulos y de Drupal, no se deben realizar cambios en el núcleo de Drupal ni en los módulos contribuidos. De lo contrario, todos tus cambios se perderán la próxima vez que se actualice el módulo o el núcleo de Drupal.

Para la interconexión entre los módulos y el núcleo de Drupal, así como entre los propios módulos, Drupal tiene un sistema de hooks. Un hook es un callback de una función, es decir, cuando la ejecución del código alcanza el hook, se añade el código de nuestra función, la cual agregamos en nuestro módulo. De esta manera, podemos procesar datos del usuario, menús, taxonomías, nodos de varios tipos de contenido en cualquier momento: al modificar, agregar, eliminar, o simplemente cargar y mostrar. En Drupal 8 hay bastantes hooks, aunque ya menos que en Drupal 7, ya que muchos hooks fueron implementados a través de componentes externos de Symfony:

https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x

Si miramos la versión 7, hay que desplazarse bastante hacia abajo:

https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x

Pero esto no significa que Drupal 8 sea menos potente, simplemente todo lo que en Drupal 7 se implementaba con hooks, en Drupal 8 ahora debe agregarse con el plugin correspondiente.

Si observas atentamente la lista de hooks en Drupal 8, verás que muchos terminan con _alter, lo cual significa que ese hook está diseñado para modificar los valores de variables, por ejemplo:

hook_form_alter() - permite modificar el array de un formulario durante su procesamiento en Drupal. Más adelante analizaremos cómo se generan los formularios a partir de arrays en Drupal. Para aplicar este hook en un módulo, como otros hooks, simplemente escribimos una función:

function mymodule_form_alter() {
  // modificar el array del formulario
}

He simplificado el ejemplo, sin escribir los argumentos de la función ni los namespaces. Por ahora solo debemos comprender cómo funcionan los hooks. Mymodule es nuestro módulo; escribimos el nombre de nuestro módulo en lugar de la palabra hook y la función se detecta automáticamente y modifica los arrays del formulario. ¿Cómo funciona esto? En el método prepareForm se llama otro método alter():

$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);

Esto significa que cada módulo en Drupal que implemente hook_form_alter() inserta su propio código en ese lugar. Así, si queremos agregar código en alguna parte de Drupal, lo primero que debemos hacer es usar un hook; luego, si no es posible, un plugin; y solo si realmente no hay otra opción, modificamos o parcheamos el módulo (lamentablemente, a veces hay que hacerlo). Por ahora no nos hemos encontrado con tareas que requieran modificar plugins, así que aprendamos a escribir nuestros propios módulos.