Recurso reutilizable de alertas para proyectos PHP con frontend Bootstrap.
Objetivo: copiar la carpeta alertas a cualquier proyecto y tener alertas funcionando sin reconstruir el sistema.
Nuevo: ahora incluye un panel profesional con 7 pestañas (config-panel.php) para personalizar:
- Posición (9 opciones)
- Tamaños (ancho, padding, fuente, redondeado)
- Colores (fondo, borde, texto, icono por tipo)
- Duración (cierre automático por tipo)
- Entrada - Dirección y velocidad de animación (NUEVO)
- Acciones (guardar, restaurar, descargar)
- Previsualización (demo en vivo)
Desde el archivo index.php, verás un botón destacado "Panel de configuración" o accede directamente a:
http://localhost/alertas/config-panel.php
La configuración se guarda en el archivo auto-generado alertas-config.php y persiste entre sesiones. Puedes:
- Usar "Guardar configuración" para aplicar cambios inmediatamente
- Usar "Descargar configuración" para obtener
alertas-config.phpeditable - Usar "Restaurar valores por defecto" desde alerta de confirmación
El archivo es un retorno PHP puro, completamente editable.
php/AlertRepository.php: recolecta alertas desde query string y sesión.templates/alerts.php: renderiza contenedor e inyecta assets.assets/alerts.js: motor de toasts y API globalAlertSystem.assets/alerts.css: estilos de alertas.examples/layout_footer_example.php: integración mínima.alertas-config.php: archivo auto-generado con configuración persistente (editable).config-panel.php: panel profesional con 7 pestañas.assets/js/config-panel.js: lógica del panel (estilos dinámicos, tab switching).index.php: página de ejemplos con acceso al panel.
- Cargar el repositorio y construir alertas desde request:
<?php
session_start();
require_once __DIR__ . '/../alertas/php/AlertRepository.php';
$alertRepository = new AlertRepository();
$alerts = $alertRepository->collect($_GET, $_SESSION);- Incluir la plantilla en tu layout principal:
<?php
$scriptName = str_replace('\\', '/', (string) ($_SERVER['SCRIPT_NAME'] ?? ''));
$basePath = rtrim(dirname($scriptName), '/');
$basePath = $basePath === '.' ? '' : $basePath;
$alertsCssPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.css';
$alertsJsPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.js';
include __DIR__ . '/../alertas/templates/alerts.php';- Mostrar alertas desde JavaScript cuando lo necesites:
AlertSystem.notify('Guardado correctamente', 'success', 'Listo');
AlertSystem.notify('No se pudo guardar', 'danger', 'Error');Copia la carpeta alertas dentro de tu proyecto. Ejemplo:
/mi-proyecto
/alertas
/public
/app
En el archivo PHP que procesa la petición:
- inicia sesión,
- carga
AlertRepository, - recolecta alertas (
query string+flash), - y deja
$alertsdisponible para el layout.
<?php
declare(strict_types=1);
session_start();
require_once __DIR__ . '/../alertas/php/AlertRepository.php';
$alertRepository = new AlertRepository();
$alerts = $alertRepository->collect($_GET, $_SESSION);Incluye templates/alerts.php cerca de </body> para que el contenedor y scripts se carguen al final.
<?php
// Variables esperadas por templates/alerts.php:
// - $alerts
// - $alertsCssPath
// - $alertsJsPath
$scriptName = str_replace('\\', '/', (string) ($_SERVER['SCRIPT_NAME'] ?? ''));
$basePath = rtrim(dirname($scriptName), '/');
$basePath = $basePath === '.' ? '' : $basePath;
$alertsCssPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.css';
$alertsJsPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.js';
include __DIR__ . '/../alertas/templates/alerts.php';Nota: si esas rutas no coinciden con tu estructura final, la plantilla tiene fallback automático por URL para intentar resolverlas.
Formato simple (mensaje, tipo, titulo):
AlertSystem.notify('Cambios guardados', 'success', 'Listo');
AlertSystem.notify('Error en la solicitud', 'danger', 'Oops');Formato objeto (mas opciones):
AlertSystem.show({
type: 'success',
title: 'Actualizado',
message: 'Perfil actualizado correctamente',
duration: 3000,
dismissible: true
});Las animaciones configuradas se aplican automáticamente.
Usa push() antes de redirigir. En la nueva carga, collect() las muestra y las limpia de sesión.
$alertRepository->push($_SESSION, [
'type' => 'success',
'title' => 'Perfil',
'message' => 'Cambios guardados correctamente'
]);
header('Location: /perfil');
exit;- Automático: ajusta según posición (recomendado)
- Desde arriba: para arrays en top
- Desde abajo: para arrays en bottom
- Desde izquierda: para arrays a la izq
- Desde derecha: para arrays a la der
- Desde el centro: efecto pop-in con rebote sutil
- Lento: 450ms (premium feel)
- Normal: 300ms (recomendado)
- Rápido: 200ms (discreto)
Alertas discretas (abajo-derecha, desde abajo, rápido):
Posición: Abajo-derecha
Entrada: Desde abajo
Velocidad: Rápido
Alertas con rebote (centro, desde centro):
Posición: Centro
Entrada: Desde el centro
Velocidad: Normal
<?php
declare(strict_types=1);
session_start();
require_once __DIR__ . '/../alertas/php/AlertRepository.php';
$alertRepository = new AlertRepository();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$ok = true; // tu validación o guardado real
if ($ok) {
$alertRepository->push($_SESSION, [
'type' => 'success',
'title' => 'Operación',
'message' => 'Datos guardados correctamente.'
]);
} else {
$alertRepository->push($_SESSION, [
'type' => 'danger',
'title' => 'Operación',
'message' => 'No fue posible guardar los datos.'
]);
}
header('Location: ' . $_SERVER['REQUEST_URI']);
exit;
}
$alerts = $alertRepository->collect($_GET, $_SESSION);
require __DIR__ . '/layout.php';<!-- contenido de la página -->
<?php
$scriptName = str_replace('\\', '/', (string) ($_SERVER['SCRIPT_NAME'] ?? ''));
$basePath = rtrim(dirname($scriptName), '/');
$basePath = $basePath === '.' ? '' : $basePath;
$alertsCssPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.css';
$alertsJsPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.js';
include __DIR__ . '/../alertas/templates/alerts.php';
?>
</body>
</html>- Copia la carpeta
alertascompleta dentro de tu proyecto. - Inicia sesión con
session_start();en el entrypoint. - Carga
AlertRepository.php, recolecta alertas y pásalas a la plantilla. - Incluye
templates/alerts.phpal final del layout (antes de</body>). - Dispara alertas con
AlertSystem.notify()oAlertSystem.show(). - (Opcional) Personaliza en
config-panel.phpo editaalertas-config.php.
Si las rutas de assets fallan, la plantilla intenta resolver fallback automáticamente.
- Verifica que
$alerts = $alertRepository->collect($_GET, $_SESSION);se esté ejecutando. - Verifica que incluyes
templates/alerts.phpen la misma petición donde renderizas HTML. - Verifica que
session_start();se ejecuta antes decollect()ypush().
- Revisa
$alertsCssPathy$alertsJsPath. - Si moviste rutas, usa la versión dinámica con
$basePath. - La plantilla tiene fallback por URL y por error de script para recuperación automática.
- Confirma que llamas
push()antes deheader('Location: ...'). - Asegura
exit;inmediatamente después delheader(). - Comprueba que la sesión no se reinicia entre requests.
$alertRepository->push($_SESSION, [
'type' => 'success',
'title' => 'Perfil',
'message' => 'Cambios guardados'
]);
header('Location: /perfil');
exit;successdangerwarninginfo
- Conserva la carpeta
alertassin cambios para facilitar upgrades. - Centraliza la inclusión de
templates/alerts.phpen un único layout. - Usa
push()para eventos de backend (guardar, eliminar, autenticar). - Usa
AlertSystem.notify()oAlertSystem.show()para eventos frontend. - Personaliza animaciones en
config-panel.phpsegún UX deseado. - Edita
alertas-config.phpdirectamente si necesitas programación avanzada.
- Este repositorio usa versionado semántico:
MAJOR.MINOR.PATCH. - Historial de cambios: ver
CHANGELOG.md. - Versión estable inicial recomendada:
v1.0.0.
Regla práctica:
PATCH: correcciones internas sin romper integración.MINOR: mejoras compatibles (nuevas opciones o utilidades).MAJOR: cambios que requieren ajustar integración existente.
Sí es posible usar este sistema sin Bootstrap, con una salvedad importante:
assets/alerts.cssno depende de Bootstrap para el layout principal de las alertas.assets/alerts.jssí usa clases de iconosbi bi-*(Bootstrap Icons).
No necesitas Bootstrap CSS completo. Basta con cargar Bootstrap Icons en tu <head>:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">Con eso, las alertas se verán correctamente con iconos.
Si no quieres Bootstrap Icons, tienes dos alternativas:
- Editar
assets/alerts.jspara no renderizar el<i class="bi ...">. - Reemplazar iconos por texto/emoji (
✓,⚠,ℹ) o por SVG inline.
- Copia carpeta
alertas. - Inicia sesión (
session_start();). - Recolecta alertas con
collect($_GET, $_SESSION). - Incluye
templates/alerts.phpantes de</body>. - Carga Bootstrap Icons (opción A) o adapta iconos (opción B).
<?php
session_start();
require_once __DIR__ . '/../alertas/php/AlertRepository.php';
$alertRepository = new AlertRepository();
$alerts = $alertRepository->collect($_GET, $_SESSION);
$scriptName = str_replace('\\', '/', (string) ($_SERVER['SCRIPT_NAME'] ?? ''));
$basePath = rtrim(dirname($scriptName), '/');
$basePath = $basePath === '.' ? '' : $basePath;
$alertsCssPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.css';
$alertsJsPath = ($basePath !== '' ? $basePath : '') . '/assets/alerts.js';
?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
</head>
<body>
<h1>Mi proyecto sin Bootstrap</h1>
<?php include __DIR__ . '/../alertas/templates/alerts.php'; ?>
</body>
</html>- Portable: sí (copiar carpeta + incluir plantilla).
- Persistencia: archivo
alertas-config.phpauto-generado y editable. - Configuracion: panel profesional con 7 pestañas + edición en archivo.
- Animaciones: 5 direcciones + 3 velocidades + automático.
- Dependencia frontend opcional: Bootstrap Icons.
- Fallback: activo (ruta URL + error de carga del script).
Este repositorio incluye el workflow /.github/workflows/deploy-ftp.yml para desplegar automáticamente por FTP cuando haces push a main o master.
En tu repositorio de GitHub, ve a:
Settings->Secrets and variables->Actions->New repository secret
Crea estos secretos:
FTP_SERVER: host FTP (ejemplo:ftp.tudominio.clo IP del servidor).FTP_USERNAME: usuario FTP.FTP_PASSWORD: contraseña FTP.FTP_SERVER_DIR: carpeta remota de despliegue (ejemplo:/public_html/o/public_html/alertas/).
Opcionales:
FTP_PROTOCOL:ftpoftps(si no existe, usaftp).FTP_PORT: puerto FTP (si no existe, usa21).
- Automático: cada
pushamainomaster. - Manual: pestaña
Actions-> workflowDeploy FTP->Run workflow.
- No guardes credenciales FTP en archivos del proyecto.
- Si expones una contraseña por error, cámbiala inmediatamente en tu hosting y actualiza el secreto en GitHub.
- Ajusta
FTP_SERVER_DIRhasta quehttps://tu-dominio/cargue los archivos correctos.