⚡ 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
| Hook | Cuando se llama | Puede cancelar |
|---|---|---|
| actionEmailSendBefore | Antes de enviar cualquier email | Si (return false) |
| actionGetExtraMailTemplateVars | Al preparar las variables del template | No |
| actionListMailThemes | Al listar temas de email disponibles | No |
| actionBuildMailLayoutVariables | Al construir el layout del email | No |
| actionGetMailLayoutTransformations | Al transformar el HTML del email | No |
| actionEmailSendAfter | Despues de enviar el email | No |
#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.