- 0

Drupal 8: "Triggers" para ejecutar una "Action"

Drupal 8: "Triggers" para ejecutar una "Action"

Los "Action" son una forma simple pero efectiva de ejecución de flows. Son el equivalente a las "reaction" de Rules. El problema es que carecen de un "trigger", algo o alguien que lo ejecute cuando determinada situación se de. En este ejemplo les voy a mostrar como hacer esta ultima parte.

El Action

Como este es un ejemplo real y que actualmente estamos usando en este blog, paso a comentarles nuestro action. Quería que cuando alguien haga un comentario nos llegue un email avisándonos. Rules! dirán muchos, pro rules al 1/12/2016 está en alpha (!) :(

Seguro que hay alternativas a Rules, pero si no es rules preferí hacerme una implementación propia y de poco código que después pueda eliminar y usar Rules cuando sea estable. 

Bueno me voy por las ramas. La cuestión es que Drupal tiene Actions:

Drupal Actions on settings

 

Y tiene muchas predefinidas y por otro lado deja que configures nuevas e incluso puedes definir nuevas action por código (otro día lo hacemos):

Drupal creating an action

En la imagen anterior pueden ver ese listado que tiene por defecto de acciones mas una acción nueva que he creado mediante el desplegable del fondo. Es simple crear acciones predefinidas. Simplemente rellenas los parámetros que te pide. En mi caso puse el correo de destino y el mensaje que se envía.

Como ven mi acción "Send email on comment" se puede configurar y al hacerlo puedo ver en la URL que el machine name es send_email_on_comment. Vamos a guardar ese dato para crear el trigger.

 

Trigger

Bueno ya tenemos un action pero este por si solo no hace nada. Hace falta algo que lo lance. Resulta que a SABER POR QUE han quitado el modulo "Trigger" del core que estuvo presente hasta la versión 7 de Drupal. Este era el que se encargaba de poner un Action a la escucha de que algo pasara. Como por ejemplo que mi action se lance cuando alguien haga un comentario en el blog.

Pero no pasa nada. Somos coders, podemos solucionarlo. Creamos un hook_ENTITY_TYPE_insert() que me parece un buen lugar para escuchar y lanzar finalmente el action:

// Incluir este use al principio del archivo.
use Drupal\system\Entity\Action;

/**
 * Implements hook_comment_insert().
 */
function MI_MODULO_comment_insert(EntityInterface $comment) {
  Action::load('send_email_on_comment')->execute([$comment]);
}

.... Action::load('send_email_on_comment')->execute([$comment]) demasiado fácil verdad? Es lo que tiene Drupal 8.

 

Saludos!