NUNCA usar alert(), confirm() o prompt() nativos del navegador.
Todos los diálogos de confirmación, alertas y mensajes deben usar el componente modal personalizado ubicado en /admin/includes/modal.php.
- Experiencia de usuario consistente: Los modales nativos del navegador no pueden estilizarse y se ven diferentes en cada navegador
- Mejor diseño: Los modales personalizados mantienen el diseño y marca del sitio
- Más información: Permiten mostrar títulos, mensajes detallados, iconos personalizados
- Accesibilidad: Mejor control sobre accesibilidad y comportamiento
- Mobile-friendly: Los modales nativos pueden verse mal en dispositivos móviles
En cualquier página PHP del admin, incluir antes del cierre de </body>:
<!-- Modal Component -->
<?php include __DIR__ . '/includes/modal.php'; ?>showModal({
title: 'Título del Modal',
message: 'Mensaje principal',
details: 'Información adicional (opcional)',
icon: '⚠️',
confirmText: 'Confirmar',
cancelText: 'Cancelar',
confirmType: 'danger', // 'danger', 'warning', 'primary'
onConfirm: function() {
// Acción a realizar al confirmar
},
onCancel: function() {
// Acción a realizar al cancelar (opcional)
}
});function confirmDelete(itemId, itemName) {
showModal({
title: 'Eliminar Elemento',
message: `¿Estás seguro de que deseas eliminar "${itemName}"?`,
details: 'Esta acción no se puede deshacer.',
icon: '🗑️',
confirmText: 'Eliminar',
confirmType: 'danger',
onConfirm: function() {
window.location.href = `?action=delete&id=${itemId}`;
}
});
}function confirmAction(url, actionName) {
showModal({
title: `Confirmar ${actionName}`,
message: `¿Deseas continuar con esta acción?`,
icon: '❓',
confirmText: 'Continuar',
confirmType: 'primary',
onConfirm: function() {
window.location.href = url;
}
});
}function showAlert(message) {
showModal({
title: 'Atención',
message: message,
icon: 'ℹ️',
confirmText: 'Entendido',
confirmType: 'primary',
cancelText: 'Cerrar',
onConfirm: function() {}
});
}function confirmFormSubmit(formId, actionName) {
showModal({
title: `Confirmar ${actionName}`,
message: '¿Estás seguro de que deseas realizar esta acción?',
details: 'Revisa que todos los datos sean correctos antes de continuar.',
icon: '📝',
confirmText: 'Confirmar',
confirmType: 'primary',
onConfirm: function() {
document.getElementById(formId).submit();
}
});
}function confirmBulkAction() {
const selected = document.querySelectorAll('.checkbox:checked');
const count = selected.length;
if (count === 0) {
showModal({
title: 'Sin Elementos Seleccionados',
message: 'Debes seleccionar al menos un elemento.',
icon: '⚠️',
confirmText: 'Entendido',
confirmType: 'primary',
onConfirm: function() {}
});
return;
}
showModal({
title: 'Confirmar Acción Masiva',
message: `¿Aplicar esta acción a ${count} elemento${count > 1 ? 's' : ''}?`,
icon: '📦',
confirmText: 'Confirmar',
confirmType: 'warning',
onConfirm: function() {
document.getElementById('bulkForm').submit();
}
});
}| Parámetro | Tipo | Requerido | Descripción | Valor por defecto |
|---|---|---|---|---|
title |
string | No | Título del modal | "Confirmar Acción" |
message |
string | No | Mensaje principal | "¿Estás seguro?" |
details |
string | No | Información adicional en caja gris | null (no se muestra) |
icon |
string | No | Emoji o icono para el título | " |
confirmText |
string | No | Texto del botón confirmar | "Confirmar" |
cancelText |
string | No | Texto del botón cancelar | "Cancelar" |
confirmType |
string | No | Estilo del botón: 'primary', 'danger', 'warning' | 'primary' |
onConfirm |
function | Sí | Callback al confirmar | - |
onCancel |
function | No | Callback al cancelar | null |
Para acciones normales, positivas o de confirmación general:
confirmType: 'primary'Ejemplos: Guardar, Activar, Restaurar, Continuar
Para acciones que requieren atención pero no son destructivas:
confirmType: 'warning'Ejemplos: Desactivar, Cambiar estado, Acciones masivas
Para acciones destructivas o irreversibles:
confirmType: 'danger'Ejemplos: Eliminar, Archivar, Borrar permanentemente
confirmAndRedirect(url, {
title: 'Título',
message: 'Mensaje',
icon: '🔗',
confirmType: 'primary'
});confirmAndSubmit('formId', {
title: 'Título',
message: 'Mensaje',
icon: '📝',
confirmType: 'primary'
});⚠️ Advertencia general- 🗑️ Eliminar
- ✅ Confirmar/Activar
- ❌ Desactivar/Rechazar
- 📦 Archivar
- ↩️ Restaurar/Deshacer
- ℹ️ Información
- 📝 Editar/Formulario
- 🔍 Buscar/Ver
- 💾 Guardar
- 🔄 Recargar/Actualizar
- 🚀 Publicar/Enviar
- 🔐 Seguridad
El modal se puede cerrar de varias formas:
- Haciendo clic en el botón "Cancelar"
- Haciendo clic en la X de cerrar
- Haciendo clic fuera del modal (en el overlay)
- Presionando la tecla ESC
- El modal captura el foco automáticamente al abrirse
- El botón de confirmar recibe el foco inicial
- La tecla ESC cierra el modal
- El modal bloquea el scroll del body mientras está abierto
- El modal es responsive y se adapta a móviles
Consultar estos archivos para ver implementaciones reales:
/admin/productos-listado.php- Modales para activar, desactivar, archivar y acciones masivas/admin/productos-archivados.php- Modales para restaurar y eliminar permanentemente
onclick="return confirm('¿Estás seguro?')"onclick="confirmAction('url', 'nombre')"
// En el script:
function confirmAction(url, name) {
showModal({
title: 'Confirmar Acción',
message: `¿Estás seguro de que deseas ${name}?`,
confirmType: 'primary',
onConfirm: function() {
window.location.href = url;
}
});
}Última actualización: 2025-01-11
Archivo ubicado en: /admin/includes/modal.php