Ante todo para poder hacer en envio de correos en sí deberíamos tener un servidor de correos instalado o algún módulo como SMTP.
Ahora vamos construir un módulo que envie un correo siempre que se cree un nodo de tipo evento (event). El nombre de este módulo será email_on_event_create.
Para ello debemos crear nuestro clasico archivo email_on_event_create.info (este proceso será el común que siempre se hace, por lo que no entraremos en detalle).
Ahora crearemos nuestro archivo email_on_event_create.module y dentro de él debemos poner un hook_entity_insert() en el que detectaremos cada vez que se crea un nodo del tipo evento .
<?php /** * Implements hook_entity_insert(). */ function email_on_event_create_node_insert($node) { if ($node->getType() == 'event') { } }
Luego debemos usar el servicio plugin.manager.mail en el que pondremos los datos que enviaremos utilizando la template que más adelante definiremos en el hook_mail().
<?php /** * Implements hook_entity_insert(). */ function email_on_event_create_node_insert($node) { if ($node->getType() == 'event') { \Drupal::service('plugin.manager.mail')->mail( ); } }
Ahora pondremos los datos que requiere este servicio.
<?php /** * Implements hook_entity_insert(). */ function email_on_event_create_node_insert($node) { if ($node->getType() == 'event') { $to = user@example.com \Drupal::service('plugin.manager.mail')->mail( 'email_on_event_create', //Es el nombre del módulo. 'email_on_event_create', //Es el nombre del template que se usará en el correo, Drupal buscará dicho template en el hook_mail() ya que ahí lo definiremos más adelante. $to, //Es el email a donde se enviarán los correos. 'en', //Es el langcode ['node' => $node, 'subject' => $subject, 'message' => $message] //aquí ponemos el subject y el message (body) del correo ); } }
Luego vamos a usar el hook _mail() en donde definiremos el template email_on_event_create (que podría tener cualquier otro nombre) que usamos hace un momento en el servicio plugin.manager.mail.
Además en este hook, recibiremos el subject y el message que definimos hace un momento en el servicio creado, estos valores vendrán en la variable $params.
/** * Implements hook_mail(). */ function email_on_event_create_mail($key, &$message, $params) { switch ($key) { case 'email_on_event_create': $message['subject'] = $params['subject']; $message['body'][] = $params['message']; break; } }
Hasta aquí, haciendo esto Drupal usará un template simple sin que tengamos que crear nada más, pero ahora vamos a crear un template personalizado para nuestro correo en los siguientes pasos.
Creando un template custom para enviar el correo
Para nuestro ejemplo en el template que vamos a crear, vamos a pasarle sólo el message y lo haremos a través de una función custom llamada send_email_add_template_to_body().
function send_email_add_template_to_body($message) { /** @var \Drupal\Core\Render\RendererInterface $renderer */ $renderer = \Drupal::service('renderer'); $template = [ '#theme' => 'id_template_email', '#message' => $message ]; return $renderer->render($template); }
* En esta función vemos que estamos usando el servicio renderer al cual luego le pasamos una estructura renderizable para convertirla en un string que se enviará en el cuerpo del correo.
* La estructura renderizable que le estamos pasando al servicio renderer es la del id del template (id_template_email) y el mensaje ($message).
Ahora vamos a usar el hook_theme() para decirle cual es el nombre del template que vamos a crear y las variables que vamos a usar.
/** * Implements hook_theme(). */ function email_on_event_create_theme() { return [ 'id_template_email' => [ 'template' => 'custom_template_send_email', 'variables' => [ 'message' => NULL ], ] ]; }
* En esta estructura le estamos pasando el mismo id_template_email que pusimos en el array renderizable del paso anterior.
* Además estamos definiendo el nombre de nuestro archivo template que crearemos luego, para nuestro caso nuestro template será custom_template_send_email.
* Además estamos inicializando la variable message que necesitamos como null y debe tener el mismo nombre que pasamos en la función send_email_add_template_to_body(). Aquí tengamos en cuenta que incluso podría pasarle más variables y de diferentes tipos como por ejemplo arrays.
Luego vamos a alterar nuestro hook_mail para que en el body del correo se envie el template que estamos definiendo, esto lo haremos pasando la función custom send_email_add_template_to_body() al body.
/** * Implements hook_mail(). */ function email_on_event_create_mail($key, &$message, $params) { switch ($key) { case 'email_on_event_create': $message['subject'] = $params['subject']; $message['body'][] = send_email_add_template_to_body($params['message']); break; } }
Y finalmente procederemos a crear el archivo custom_template_send_email.html.twig del template en la ruta:
email_on_event_create/templates/custom_template_send_email.html.twig
En dicho archivo procederemos a crear nuestra estructura twig y HTML deseada.
Me pareció interesante el artículo
Añadir nuevo comentario