Los hooks son el corazón del sistema de extensibilidad de Perfex CRM. Permiten modificar el comportamiento del sistema y añadir funcionalidades sin tocar una sola línea del código core. Esta guía te enseñará todo lo que necesitas saber.
¿Qué son los Hooks?
Un hook es un punto de extensión en el código donde puedes "enganchar" tu propia función. Perfex CRM utiliza dos tipos de hooks:
- Actions (do_action): Ejecutan código en un momento específico. No devuelven nada.
- Filters (apply_filters): Modifican un valor y lo devuelven transformado.
Concepto Clave
Los hooks siguen el patrón Observer. El core "dispara" eventos y los módulos pueden suscribirse a esos eventos sin que el core sepa de su existencia.
Actions: Ejecutar Código en Momentos Clave
Los actions te permiten ejecutar código cuando ocurre algo específico. Por ejemplo, cuando se crea una factura, cuando un cliente inicia sesión, o cuando se envía un presupuesto.
Sintaxis Básica
// En tu módulo (archivo hooks.php o init.php)
hooks()->add_action('after_invoice_added', 'mi_funcion_personalizada');
function mi_funcion_personalizada($invoice_id) {
// Tu código aquí
// Se ejecuta cada vez que se crea una factura
$CI = &get_instance();
$CI->load->model('invoices_model');
$invoice = $CI->invoices_model->get($invoice_id);
// Ejemplo: Enviar notificación a Slack
enviar_a_slack("Nueva factura #{$invoice->number} creada");
}
Actions Más Utilizados
| Hook | Cuándo se dispara | Parámetros |
|---|---|---|
after_invoice_added |
Después de crear una factura | $invoice_id |
after_client_added |
Después de crear un cliente | $client_id |
before_invoice_deleted |
Antes de eliminar una factura | $invoice_id |
after_estimate_converted_to_invoice |
Tras convertir presupuesto | $invoice_id, $estimate_id |
app_admin_head |
En el <head> del admin | - |
app_admin_footer |
Antes de </body> en admin | - |
Filters: Modificar Datos
Los filters reciben un valor, lo transforman y lo devuelven. Son ideales para modificar contenido antes de mostrarlo o datos antes de guardarlos.
Sintaxis Básica
// Modificar el asunto de emails de factura
hooks()->add_filter('invoice_email_subject', 'personalizar_asunto_factura');
function personalizar_asunto_factura($subject, $invoice) {
// Añadir prefijo al asunto
return "[URGENTE] " . $subject;
}
Filters Más Utilizados
| Hook | Qué modifica | Parámetros |
|---|---|---|
invoice_data_merge_fields |
Campos merge de facturas | $merge_fields, $invoice |
before_client_added |
Datos del cliente antes de guardar | $data |
invoice_pdf_filename |
Nombre del PDF de factura | $filename, $invoice |
get_dashboard_widgets |
Widgets del dashboard | $widgets |
Ejemplo Práctico: Notificación por WhatsApp
Veamos un ejemplo completo de cómo usar hooks para enviar una notificación por WhatsApp cuando se crea una factura:
<?php
// modules/mi_modulo/hooks.php
hooks()->add_action('after_invoice_added', 'enviar_whatsapp_factura');
function enviar_whatsapp_factura($invoice_id) {
$CI = &get_instance();
$CI->load->model('invoices_model');
$CI->load->model('clients_model');
$invoice = $CI->invoices_model->get($invoice_id);
$client = $CI->clients_model->get($invoice->clientid);
// Obtener teléfono del cliente
$phone = $client->phonenumber;
if (empty($phone)) {
return; // Sin teléfono, no enviamos
}
// Formatear mensaje
$message = "Hola {$client->company},\n";
$message .= "Se ha generado la factura #{$invoice->number}\n";
$message .= "Importe: " . format_money($invoice->total, $invoice->currency_name);
// Enviar vía API de WhatsApp (ejemplo con Twilio)
enviar_whatsapp($phone, $message);
}
function enviar_whatsapp($phone, $message) {
// Implementación de API WhatsApp
// ...
}
Importante
Siempre usa $CI = &get_instance() para acceder a los modelos y librerías de CodeIgniter dentro de funciones de hooks.
Prioridades en Hooks
Puedes controlar el orden de ejecución usando el tercer parámetro:
// Se ejecuta primero (prioridad 5)
hooks()->add_action('after_invoice_added', 'funcion_prioritaria', 5);
// Se ejecuta después (prioridad 20, por defecto es 10)
hooks()->add_action('after_invoice_added', 'funcion_secundaria', 20);
Buenas Prácticas
- Nunca modifiques el core: Siempre usa hooks para extender funcionalidad.
- Prefija tus funciones: Usa el nombre de tu módulo como prefijo (ej:
mimodulo_after_invoice). - Documenta tus hooks: Si creas hooks personalizados, documéntalos.
- Maneja errores: Usa try-catch para evitar que errores en tu hook rompan el sistema.
- Optimiza el rendimiento: Evita consultas pesadas en hooks que se ejecutan frecuentemente.
Crear tus Propios Hooks
Puedes crear hooks personalizados en tu módulo para que otros módulos puedan extenderlo:
// En tu controlador o modelo
$data = hooks()->apply_filters('mi_modulo_before_save', $data);
// Disparar un action
hooks()->do_action('mi_modulo_after_process', $result);
Conclusión
El sistema de hooks de Perfex CRM es increíblemente potente. Te permite:
- Extender funcionalidades sin modificar el core
- Mantener compatibilidad con actualizaciones
- Crear módulos que interactúen entre sí
- Personalizar cada aspecto del CRM
Si tienes preguntas sobre hooks específicos o necesitas ayuda implementando alguna funcionalidad, no dudes en contactarnos.