Hooks en Drupal. ¿Qué son? ¿Cómo se utilizan?

Portada del podcast Drupalízate
Drupalízate es un podcast semanal creado por mí, donde hablo sobre desarrollo web basado en Drupal.
El contenido central es resolver las típicas dudas que pueda tener alguien que tiene o quiere tener una web en Drupal.
Aparte de resolver dudas de "clientes", también se habla de tips, recomendaciones y buenas prácticas para el Developer que recién empiezan en este mundo.
Audio y notas del episodio

Hoy te vengo a contar que son los Hooks, como y donde se usan, cuáles son las buenas prácticas, que has de tener en cuenta, y te digo cuáles son los que más uso yo en los proyectos de mis clientes.

Transcripción automática de este episodio de audio (puede contener errores)

Hola, bienvenido o bienvenida aquí otra semana más al podcast donde te voy contando cosas en Drupal. Esta semana quiero enfocarme a hablar sobre el tema de los hooks. Los hooks, o digamos ganchos, que sea la traducción, digamos son funciones de código que nos permiten meternos en medio de la ejecución de Drupal y alterar los datos que están pasando por ese hook. A fin y acabo son funciones de código normalmente para temas custom o para módulos custom o si tienes un módulo contribuido pues el módulo contribuido seguramente lo estás usando pero en el caso que nos considero hoy es cuando tenemos web hecha medida, normalmente tema custom o módulo custom como meter hooks para alterar los valores que nos convienen. Por ejemplo, ¿por qué querríamos hacer esto? Voy a comentar por ejemplo los más usados que se llen por ejemplo el form-alters, el hook form-alters. Esto permite alterar los valores de los formularios. ¿Por qué puede ser útil esto? Pues por ejemplo, yo he hecho varios proyectos de formularios de login o de registro o de edición de nodos queremos que haya campos que no sean editables, o sea por ejemplo marcar que el campo se muestre pero que el usuario no puede que se haga como desactivado el campo por ejemplo o por ejemplo que el placeholder del campo de texto cambiarlo o quitarlo o poner otro. Esto por ejemplo en formularios expuestos de las vistas si queremos poner un placeholder lo podemos hacer por configuración de views pero el placeholder del formulario de login o de registro no hay una configuración que te lo permita hacer, no al menos en el código por defecto. Se pueden instalar modos contribuidos pero al final son tres líneas de código en código custom que se pone además en tu tema y con eso estás por ejemplo modificando el placeholder de ese campo del formulario. Pues como digo, el form-alters es de los más usados sobre todo para alteración de formularios como sobre todo no es que se usa para eso. Después por ejemplo podemos tener los preprocess, el hook preprocess hook digamos que la palabra hook sería como el comodín, el primer hook sería en este caso el nombre del tema de tu tema actual donde estás poniendo ese código, después el nombre de la función que es preprocess en este caso y por último el último hook sería a qué queremos afectar, pues sería por ejemplo si el nombre del tema es Baltic, pues sería Baltic preprocess 9 o Baltic preprocess taxonomiter o lo que sea, el nombre de la entidad. Esto nos permite que el código sólo se ejecute en determinados tipos de entidades por ejemplo sólo los nodos para que no se ejecuten taxonomías o a la inversa o por ejemplo sólo queremos que se ejecute en paragraf al final Drupal es muy potente y nos permite diferenciar por entidades y por qué querríamos hacer uso de este hook, del preprocess esto nos permite alterar los valores antes de que le lleguen a la plantilla o sea en este caso plantilla Strict, en Drupal 8, 9 o 10 ¿Por qué querríamos hacer eso? Pues puede ser que tengamos por ejemplo un valor fijo que va a depender de si el tipo de contenido del nodo es uno u otro, digamos un label con la función T para traducir pero que al final es un texto digamos fijo esto en vez de meterlo por plantilla y meterle GIF en las plantillas se puede hacer aquí en el preprocess otra función sería, tenemos valores que vienen de campos de otros nodos relacionados con determinado campo pues se puede calcular en el preprocess y después se pasa a la plantilla ventaja es esto, que el preprocess después se guarda en caché internet de Drupal y después tenemos las cachés de la plantilla propia de Twig, o sea la caché de Twig con lo cual estamos mejorando el rendimiento si esto lo calculamos en el preprocess aparte que en el Twig depende de que cosas quieras coger no es tan fácil de obtener datos directamente desde Twig por eso yo recomiendo hacerlo en preprocess, una por facilidad, otra por legilibilidad de código y otra por rendimiento y después por ejemplo tenemos otros hooks que se pueden lanzar tenemos varios de ellos, el presafe de los nodos o de las taxonomías el update o el insert, al final hay cantidad de hooks que te puedes mirar la API interna de Drupal que está bien documentada pero por ejemplo el más usado es el presafe que esto nos permite, o sea el hook entity type presafe que nos permite básicamente editar los valores antes de que se guarden por ejemplo sería el primer hook, el primer token, sería el nombre del módulo por ejemplo si se llama módulo custom, pues sería módulo custom después el entity type sería en este caso node o taxonomiterm o lo que sea con lo cual sería módulo custom node y después presafe, módulo custom node presafe con esto solo afectaría, si se iba ejecutando dentro del módulo custom afectaría solo los nodos y solo en el momento de guardar, antes de guardar justamente en este caso también afectaría en el insert o en el update entonces en cualquier intento de guardar valores en el nodo esto puede ser útil por ejemplo al tenemos campos, digamos que por x casuística del proyecto se tienen que sobreescribir y pues antes de, justo en el presafe detectar que valores tienen y sobreescribirlos o puede ser que no queramos sobreescribir los valores del campo pero queremos cogerlos y hacer cosas con ellos, por ejemplo enviar un mail cada vez que se guarda un nodo por ejemplo enviar un mail al mediador y usando el título del nodo para avisarle de hey que este usuario editor acaba de modificar este nodo tenlo en cuenta para entrar a la web y revisar si se puede publicar por ejemplo que si, que se puede hacer esto con módulos contribuidos, en este caso en concreto seguramente si pero estoy poniendo el ejemplo de cosas hechas totalmente a medida, esto es hiperflexible al final es código que tu puedes poner y se va a ejecutar solo con los valores y en el momento de guardar el nodo como digo yo he usado por ejemplo esto para alertar a usuarios, generar por ejemplo PDFs que en el momento de hacer el presafe se cojan esos datos y se genera un documento PDF eso depende de la casuistica de cada proyecto pero esto al final para que veáis de que con los hooks es una forma muy simple de insertar código en determinados casos y hacer igualos que solo se ejecuta en esos casos y sin tener que modificar el código que ha hecho otra gente o sea no hace falta modificar el código contribuido de módulos o temas ni hace falta modificar el código del code interno de Drupal sino tu te creas tu propio módulo custom o tu tema custom y ahí pones el hook que a ti te interese con lo cual esto al hacer mantenimiento de webs te aseguras que cuando actualices cosas no pierdas tu código porque no lo has puesto en módulos contribuidos de otra gente lo tienes tu bien guardado, bien organizado dentro de tus módulos custom que como digo es la buena practica y nada que aquella esto comentar digamos para que están los hooks para que se usan y si en un caso estos son los mas, a menos así de bote pronto los que a mi me suenan mas de que he usado en la mayoría de casos como digo hay muchos mas para muchas mas opciones, muchas mas casualidades dependiendo del proyecto pero como digo el que uso mas es el form alter, el preprocess y el presafe con diferencia y nada que esto, que esto tambien es factible en 8, 9 y en 10 seguian existiendo en Drupal 7 se usaron mucho mas los hooks en Drupal 8, 9 ya se cambio y se siguen usando estos pero digamos que habian otros hooks que dejaron de existir y bueno se pasaron a eventos y en Drupal 10 subentiendo de que se ira tomando este camino pero como digo actualmente se siguen usando hooks y se van a poder seguir usando durante un tiempo osea que es la forma recomendada de trabajar con ello y nada más, hasta la semana que viene espero que haya sido util esto.

¿Tienes algún proyecto en mente?

Si quieres hacer algo en Drupal tal vez puedas contratarme.

Ya sea para consultoría, desarrollo o mantenimiento de sitios web Drupal.