El panel de administración separa completamente la lógica PHP de la presentación HTML. Los fragmentos de interfaz que se repiten en varios módulos —la paginación de tablas, el modal de confirmación de borrado, los filtros de búsqueda y la barra de navegación— se implementan como archivos de plantilla independientes que los controladores y las vistas incluyen medianteDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/jpbarbatic/webapp/llms.txt
Use this file to discover all available pages before exploring further.
require o include. Esta arquitectura evita duplicar marcado HTML y garantiza que cualquier ajuste visual o de comportamiento se propague a todos los módulos desde un único punto.
Paginación — html/paginacion.html.php
El componente de paginación renderiza una barra de navegación por páginas usando las clases pagination de Bootstrap 5. Solo se muestra cuando el número total de páginas es mayor que uno.
Código fuente completo:
| Variable | Tipo | Descripción |
|---|---|---|
$total | int | Número total de registros que devolvería la consulta sin LIMIT. Normalmente proviene de extract($res) tras una llamada a db_select(). |
$p | int | Número de página actual. Proviene de extract(paginacion()). |
$items_pagina | int | Registros por página (valor fijo 10). Proviene de extract(paginacion()). |
$vista | string | Ruta relativa del módulo actual (p. ej. 'productos/listado'). La función strstr($vista, '/', true) extrae el segmento antes de la primera barra para construir la URL base del módulo (productos/). |
- Calcula
$num_paginasconceil($total / $items_pagina). - Si
$num_paginas <= 1no renderiza nada. - El botón « queda deshabilitado (
disabled) cuando$p == 1. - El botón » queda deshabilitado cuando
$p == $num_paginas. - El número de página activa recibe la clase
active. - Cada enlace construye la URL como
{modulo}/?p={N}, preservando la navegación dentro del módulo actual.
Filtros de productos — html/productos/filtro.html.php
La barra de filtros es un formulario colapsable (Bootstrap Collapse) que permite buscar productos por nombre o identificador numérico y opcionalmente filtrar por categoría. Se incluye dentro de html/productos/listado.html.php.
Código fuente completo:
| Campo | Nombre HTTP | Descripción |
|---|---|---|
| Texto libre | filtro[nombre] | Búsqueda por nombre de producto. El controlador del listado también soporta la sintaxis id:N para buscar directamente por identificador numérico. |
| Selector de categoría | filtro[categoria] | Desplegable con todas las categorías disponibles, generado con html_opciones(). Seleccionar --Elige una categoría-- (valor vacío) elimina el filtro de categoría. |
- El formulario usa
methodimplícitoGET(action=""), por lo que los filtros se envían como parámetros de la URL, lo que permite compartir o marcar como favorita una búsqueda concreta. - El panel colapsable se expande automáticamente si existe algún parámetro
filtroen$_GET(isset($_GET['filtro'])), de modo que al volver a la página con un filtro activo el usuario vea los controles desplegados. - Requiere que la variable
$categorias(array de filas de la tablacategorias) esté disponible en el ámbito de inclusión; el controlador de listado de productos la carga antes de incluir la vista.
Modal de confirmación de borrado — html/confirmacion.borrado.html.php
El modal de borrado es un diálogo Bootstrap 5 con fondo rojo que solicita confirmación explícita antes de eliminar un registro. Se incluye dentro de cada plantilla de listado que soporte borrado, y el script que lo inicializa se incluye en la plantilla de listado correspondiente.
Código fuente completo del modal:
| Elemento | ID / Atributo | Propósito |
|---|---|---|
| Contenedor del modal | id="deleteModal" | Target de los botones de eliminación en la tabla (data-bs-target="#deleteModal"). |
| Formulario | id="deleteForm" | Envía POST a {modulo}/borrar.php. La URL del módulo se construye con strstr($vista, '/', true). |
| Campo oculto de ID | id="modalRecordId", name="id" | Se rellena vía JavaScript con el ID del registro a borrar justo antes de que el modal se muestre. |
| Token CSRF | name="csrf_token" | Protege contra ataques CSRF. Toma su valor de $_SESSION['csrf_token']. |
| Botón de confirmación | id="btnConfirmDelete" | El script lo deshabilita tras el primer clic para evitar envíos dobles. |
| Spinner de carga | id="btnSpinner" | Oculto por defecto (clase d-none). El script lo muestra al enviar el formulario. |
data-id transporta el identificador numérico del registro. Bootstrap lo pasa como event.relatedTarget al evento show.bs.modal, donde el JavaScript lo lee y lo escribe en #modalRecordId.
Script de inicialización del modal (patrón compartido entre módulos):
Cada módulo que usa el modal incluye su propio archivo listado.script.php con el siguiente bloque JavaScript. El patrón es idéntico en categorias, productos y usuarios:
Clic en «Eliminar»
El usuario hace clic en el botón de la tabla. Bootstrap dispara el evento
show.bs.modal antes de mostrar el diálogo.Inyección del ID
El listener de
show.bs.modal lee event.relatedTarget.getAttribute('data-id') y asigna ese valor al campo oculto #modalRecordId.Confirmación
El usuario lee el mensaje de advertencia y hace clic en «Sí, eliminar». El botón se deshabilita y aparece el spinner para indicar que la operación está en curso.
Scripts compartidos — html/comun.script.php
El archivo html/comun.script.php es incluido por html/plantilla.html.php en todas las páginas del panel, justo antes de cargar el script específico del módulo activo. En la versión actual del proyecto el archivo está vacío, reservado para futuros scripts de utilidad transversal (p. ej. inicialización global de tooltips Bootstrap, interceptores de formularios o helpers de notificación).
La plantilla lo incluye de forma incondicional:
comun.script.php pueda definir funciones o variables globales accesibles desde los scripts de módulo que se cargan a continuación.
Barra de navegación — html/nav.html.php
La barra de navegación es una <nav> Bootstrap fija en la parte superior (fixed-top bg-dark). Se incluye automáticamente en todas las páginas a través de html/plantilla.html.php.
Código fuente completo:
| Identificador | Tipo | Descripción |
|---|---|---|
NOMBRE_WEB | Constante | Nombre de la aplicación definido en config.php. Se muestra como la marca de la navbar. |
$vista | Variable | Ruta relativa del módulo activo (p. ej. 'productos/listado'). Se compara con str_starts_with() para añadir la clase active al enlace del módulo que está en uso. |
| Enlace | URL | Condición de visibilidad |
|---|---|---|
| Dashboard | # | Siempre visible. |
| Usuarios | usuarios/ | Solo si es_visible('usuarios') devuelve un resultado no vacío (el rol tiene al menos un permiso con prefijo usuarios.). |
| Roles | roles/ | Siempre visible. |
| Productos | productos/ | Siempre visible. |
| Categorías | categorias/ | Siempre visible. |
| Salir | logout.php | Siempre visible. |
Solo el enlace Usuarios está protegido por
es_visible() en el nivel de la barra de navegación. Los demás módulos son visibles para cualquier usuario autenticado en la interfaz, aunque el acceso real a sus controladores sigue estando protegido por el guard de backend.php mediante la variable $permiso.