Servicio / Callback
Cuando una extensión no necesita ningún tipo de interfaz o no genera ningún código HTML para un sitio web, puedes escribir una extensión de tipo servicio/callback. La idea es simple, cuando se produce un determinado evento, tu código es ejecutado por Navigate CMS para realizar una acción concreta; se puede enviar un e-mail, obtener estadísticas, modificar algún aspecto del contenido...
Tomaremos la extensión Akismet antispam para ilustrar un ejemplo. Lo que esta extensión hace es comprobar cada nuevo comentario introducido en un sitio web, enviándolo al servicio web Akismet para determinar si se trata de "spam" o no (un comentario real o uno no deseado).
Para hacer que Navigate CMS ejecute nuestra función en un determinado evento necesitamos declarar unos aspectos en la definición de la extensión:
"bindings": [
{
"module": "comments",
"event": "after_insert",
"function": "nvweb_akismet_antispam_plugin_check_spam"
}
]
Lo que estamos indicando aquí es que tras la creación de un nuevo comentario se llame a la función nvweb_akismet_antispam_plugin_check_spam. Como nota al margen, si tu extensión sólo enlaza eventos generados por un sitio web, puedes declarar el enlace mediante programación en el evento before_parse del sitio web (en este caso, no es necesario que lo declaremos en la definición). Un ejemplo:
function nvweb_akismet_antispam_event($event, $html)
{
global $events;
$html = '';
if($event == 'before_parse')
{
$events->bind(
'comment',
'after_insert',
'akismet_antispam',
'nvweb_akismet_antispam_plugin_check_spam'
);
}
return $html;
}
Esta función debe ser incluida en el archivo PHP principal de la extensión (extension_name.php). Para comprender mejor este mecanismo, por favor revisa el ejemplo de la extensión Raty en el Widget para sitios web.
Cuando Navigate CMS detecta el evento se llama a la función declarada y envía sólo un parámetro, que en realidad es una matriz asociativa de objetos.
function nvweb_akismet_antispam_plugin_check_spam($params)
{
$extension = new Extension();
$extension->load('akismet_antispam');
$comment = $params['comment'];
$akismet = new Akismet(NVWEB_ABSOLUTE, $extension->settings['akismet_api_key']);
$akismet->setCommentAuthor($comment->name);
$akismet->setCommentAuthorEmail($comment->email);
$akismet->setCommentContent($comment->message);
$is_spam = $akismet->isCommentSpam();
if($save && $is_spam)
{
$comment->status = 3;
$comment->save();
}
return $is_spam;
}
En nuestro ejemplo, $params tiene un solo elemento: "comment", que es el objeto comentario. Nuestra función carga el objeto de extensión Akismet para recuperar la configuración de la página web actual. A continuación, crea una instancia de la clase Akismet para enviar la solicitud de detección. Si la respuesta de Akismet es "spam" entonces cambia el estado del comentario a 3 (spam) y actualiza el objeto.
Para obtener una lista completa de eventos disponibles a los que enlazarse, consulta la sección Eventos de este manual.
0 Comentarios