Guía Completa

Sistema de Hooks en Perfex CRM: Guía Definitiva

Volver al Blog

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:

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

  1. Nunca modifiques el core: Siempre usa hooks para extender funcionalidad.
  2. Prefija tus funciones: Usa el nombre de tu módulo como prefijo (ej: mimodulo_after_invoice).
  3. Documenta tus hooks: Si creas hooks personalizados, documéntalos.
  4. Maneja errores: Usa try-catch para evitar que errores en tu hook rompan el sistema.
  5. 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:

Si tienes preguntas sobre hooks específicos o necesitas ayuda implementando alguna funcionalidad, no dudes en contactarnos.

JN

J. Negro

Desarrollador principal de SalesCloud. Más de 10 años de experiencia en PHP y desarrollo de módulos para Perfex CRM. Apasionado por el código limpio y las buenas prácticas.