
En módulo Rules nos permite realizar acciones cuando se produzcan eventos determinados en nuestro sitio. Por ejemplo, enviar un correo a todos los usuarios del portal cuando se crea un contenido de tipo noticia.
Rules nos ofrece múltiples eventos o disparadores y varias acciones listas para ser usadas, pero hay ocasiones en las que las acciones que nos ofrece el módulo no se ajustan a lo que queremos realizar. En estos caso Rules nos ofrece la solución a través de su API: definirnos nuestra propia acción.
Para definir nuestras propias acciones custom y poder utilizarlas posteriormente en Rules, debemos usar la función hook_rules_action_info()
Por ejemplo, vamos a definir una acción para enviar un correo a todos los usuarios de un grupo 'Técnicos' cada vez que un 'Cliente' genere una incidencia en un supuesto sistema de mantenimiento:
function slx_custom_rules_action_info() {
return array(
'slx_custom_rules_action_mail_issues' => array(
'label' => t('Send a mail when an issue is created or modified'),
'group' => t('System'),
'parameter' => array(
'subject' => array(
'type' => 'text',
'label' => t('Subject'),
'description' => t("The mail's subject."),
'translatable' => TRUE,
),
'message' => array(
'type' => 'text',
'label' => t('Message'),
'description' => t("The mail's message body."),
'translatable' => TRUE,
),
'from' => array(
'type' => 'text',
'label' => t('From'),
'description' => t("The mail's from address. Leave it empty to use the site-wide configured address."),
'optional' => TRUE,
),
'language' => array(
'type' => 'token',
'label' => t('Language'),
'description' => t('If specified, the language used for getting the mail message and subject.'),
'options list' => 'entity_metadata_language_list',
'optional' => TRUE,
'default value' => LANGUAGE_NONE,
'default mode' => 'selector',
),
),
),
);
}
En el código anterior se define la acción 'slx_custom_rules_action_mail_issues' que va a recibir como parámetros las variables 'entity', subject, etc... Estas variables se pedirán a través de la interfaz de la regla. A tener en cuenta también: 'label' para identificar la acción posteriormente, 'group', que es el grupo donde se muestra la accióp y 'parameter', que contiene los parámetros de la acción que tendremos que configurar.
A continuación definimos la función que responde a esta acción, que será la encargada de enviar los correos:
function slx_custom_rules_action_mail_issues($subject, $message, $from = NULL, $langcode, $settings, RulesState $state, RulesPlugin $element) {
$emails = '';
//Email de los técnicos del centro de soporte
$emails .= _slx_custom_get_emails($centro_soporte);
$emails = trim($emails, ',');
$from = !empty($from) ? str_replace(array("\r", "\n"), '', $from) : NULL;
$params = array(
'subject' => $subject,
'message' => $message,
'langcode' => $langcode,
);
// Set a unique key for this mail.
$name = isset($element->root()->name) ? $element->root()->name : 'unnamed';
$key = 'rules_action_mail_' . $name . '_' . $element->elementId();
$languages = language_list();
$language = isset($languages[$langcode]) ? $languages[$langcode] : language_default();
$message = drupal_mail('rules', $key, $emails, $language, $params, $from);
if ($message['result']) {
watchdog('rules', 'Successfully sent email to %recipient', array('%recipient' => $emails));
}
}
En la función anterior se recuperan las direcciones de correo a las que enviar el aviso con la función _slx_custom_get_emails (no entraremos en detalle) y se utilizan más adelante para enviar los correos con la función drupal_mail
E voilá!. Ya tenemos definida nuestra acción personalizada. Vamos a utilizarla. Pero antes un detalle importante: es necesario limpiar la caché de Drupal para que la acción quede registrada.
Para usar la acción, nos vamos a nuestro_sitio/admin/config/workflow/rules/reaction/add y creamos una regla que responda al evento crear incidencia. A continuación agregamos una acción y buscamos la nuestra que estará agrupada por el grupo antes indicado. Una vez seleccionada, completamos con datos sus parámetros de entrada (asunto, cuerpo del correo, etc...) y ya está lista para ser usada.
El ejemplo es bastante sencillo, pero es suficiente para ver lo potente que puede ser el uso de esta herramienta para crear complejos sistemas de evento / acción en nuestro sitio.