⚡ Hooks de email — modificar y controlar el envio

Actualizado: 2024-12-01

PrestaShop proporciona varios hooks para interceptar, modificar y enriquecer el sistema de envio de emails. Permiten cancelar envios, cambiar destinatarios, agregar variables a las plantillas y registrar temas de email personalizados.

#Hooks de email disponibles

HookCuando se llamaPuede cancelar
actionEmailSendBeforeAntes de enviar cualquier emailSi (return false)
actionGetExtraMailTemplateVarsAl preparar las variables del templateNo
actionListMailThemesAl listar temas de email disponiblesNo
actionBuildMailLayoutVariablesAl construir el layout del emailNo
actionGetMailLayoutTransformationsAl transformar el HTML del emailNo
actionEmailSendAfterDespues de enviar el emailNo

#actionEmailSendBefore — interceptar el envio

Interceptar y modificar emails antes de enviarlos
php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionEmailSendBefore');
}

/**
 * Llamado antes de cada envio de email.
 * Si el hook devuelve false, el email NO se envia.
 *
 * @param array $params {
 *   @var string   $idLang
 *   @var string   $template    Nombre del template (sin extension)
 *   @var string   $subject
 *   @var array    $templateVars
 *   @var string   $to          Email del destinatario
 *   @var string   $toName      Nombre del destinatario
 *   @var string   $from        Email del remitente
 *   @var string   $fromName
 *   @var string   $replyTo
 *   @var bool     $die
 *   @var string   $templatePath
 *   @var array    $fileAttachment
 *   @var bool     $mode_smtp
 *   @var string   $templateHtml
 *   @var string   $templateTxt
 *   @var int      $idShop
 * }
 */
public function hookActionEmailSendBefore(array &$params): bool
{
    // ── Ejemplo 1: Redirigir todos los emails en staging ──
    if (!_PS_MODE_DEV_ && defined('STAGING_ENV') && STAGING_ENV) {
        $params['to']     = 'dev@miempresa.com';
        $params['toName'] = 'DEV Team';
    }

    // ── Ejemplo 2: Cancelar emails de prueba (template 'test') ──
    if ($params['template'] === 'test' && !_PS_MODE_DEV_) {
        return false; // Cancelar el envio
    }

    // ── Ejemplo 3: Log de todos los emails enviados ──
    PrestaShopLogger::addLog(
        sprintf('Email enviado: template=%s, to=%s', $params['template'], $params['to']),
        1, null, 'EmailLogger'
    );

    // ── Ejemplo 4: Anadir CC a emails de pedido ──
    if ($params['template'] === 'order_conf') {
        // No hay soporte nativo de CC en Mail::Send, pero podemos cambiar el template
        $params['templateVars']['{cc_notice}'] = 'Copia enviada a: admin@tienda.com';
    }

    return true; // true = continuar con el envio
}

#actionGetExtraMailTemplateVars — variables custom

Anadir variables custom a los templates de email
php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionGetExtraMailTemplateVars');
}

/**
 * Agrega variables extra a los templates de email.
 * Las variables se referencian en el template como {var_name}.
 */
public function hookActionGetExtraMailTemplateVars(array &$params): void
{
    $template = $params['template'] ?? '';

    // ── Agregar a todos los emails ──
    $params['extra_template_vars'] = array_merge(
        $params['extra_template_vars'] ?? [],
        [
            '{shop_phone}'   => Configuration::get('PS_SHOP_PHONE'),
            '{shop_address}' => Configuration::get('PS_SHOP_ADDR1'),
            '{current_year}' => date('Y'),
        ]
    );

    // ── Agregar solo al email de confirmacion de pedido ──
    if ($template === 'order_conf') {
        $idOrder = (int) ($params['template_vars']['{id_order}'] ?? 0);
        if ($idOrder) {
            $loyaltyPoints = $this->calculateLoyaltyPoints($idOrder);
            $params['extra_template_vars']['{loyalty_points}'] = $loyaltyPoints;
        }
    }
}

#actionListMailThemes — registrar temas de email

Registrar un tema de email personalizado
php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionListMailThemes');
}

/**
 * Registra un tema de email personalizado en el sistema de temas de PS.
 * Los temas aparecen en el BO en Diseno → Temas de email.
 */
public function hookActionListMailThemes(array &$params): void
{
    $params['themes'][] = new \PrestaShop\PrestaShop\Core\MailTemplate\Theme\Theme(
        'mytheme',         // Nombre del tema (carpeta)
        'Mi Tema de Email', // Nombre visible en el BO
        _PS_MODULE_DIR_ . $this->name . '/mails/themes/mytheme/' // Ruta
    );
}

#Bloquear emails en entorno de desarrollo

Interceptar todos los emails en desarrollo para no enviarlos
php
<?php

// ── Modulo de desarrollo: interceptar todos los emails ──
public function hookActionEmailSendBefore(array &$params): bool
{
    if (!_PS_MODE_DEV_) {
        return true; // En produccion, no interferir
    }

    // Guardar el email en un archivo en lugar de enviarlo
    $logDir  = _PS_MODULE_DIR_ . $this->name . '/logs/';
    $logFile = $logDir . 'emails_' . date('Y-m-d') . '.log';

    if (!is_dir($logDir)) {
        mkdir($logDir, 0755, true);
    }

    $logEntry = [
        'time'     => date('Y-m-d H:i:s'),
        'template' => $params['template'],
        'to'       => $params['to'],
        'subject'  => $params['subject'],
        'vars'     => $params['templateVars'] ?? [],
    ];

    file_put_contents(
        $logFile,
        json_encode($logEntry, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL . '---' . PHP_EOL,
        FILE_APPEND
    );

    // Devolver false para cancelar el envio
    return false;
}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.