194 lines
7.2 KiB
PHP
194 lines
7.2 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../config/app.php';
|
|
// Si NO está logueado, mandar al login (pero permitir estar en login.php)
|
|
if (!is_logged_in() && (basename($_SERVER['SCRIPT_NAME'] ?? '') !== 'login.php')) {
|
|
header('Location: ' . asset('views/login.php'));
|
|
exit;
|
|
}
|
|
|
|
/* === LOGOUT === */
|
|
if (isset($_GET['cerrar_sesion'])) {
|
|
// Vaciar variables de sesión
|
|
$_SESSION = [];
|
|
|
|
// Borrar la cookie de sesión (con los mismos parámetros con que fue creada)
|
|
if (ini_get('session.use_cookies')) {
|
|
$p = session_get_cookie_params();
|
|
|
|
// Borro con los params actuales…
|
|
setcookie(session_name(), '', time() - 42000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
|
|
|
|
// …y también fuerzo el path del proyecto por si difiere
|
|
setcookie(
|
|
session_name(),
|
|
'',
|
|
time() - 42000,
|
|
'/academy',
|
|
'',
|
|
(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'),
|
|
true
|
|
);
|
|
}
|
|
|
|
// Destruir sesión
|
|
session_destroy();
|
|
|
|
// Redirigir al login
|
|
$loginUrl = function_exists('asset') ? asset('views/login.php') : '/academy/views/login.php';
|
|
header('Location: ' . $loginUrl);
|
|
exit;
|
|
}
|
|
|
|
require_once __DIR__ . '/../controllers/login.controller.php';
|
|
require_once __DIR__ . '/../models/login.model.php';
|
|
|
|
// Usuario y menús
|
|
$user = $_SESSION['usuario'] ?? null;
|
|
$menuUsuario = $user ? LoginModel::mdlObtenerMenuUsuario($user) : [];
|
|
?>
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="es">
|
|
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title><?= htmlspecialchars($page_title ?? '#VeladeroDigital_') ?></title>
|
|
|
|
<!-- Syncfusion material theme -->
|
|
<link rel="stylesheet" href="<?= asset('lib/syncfusion-31.1.17/material.css') ?>" type="text/css" />
|
|
<!-- Bootstrap -->
|
|
<link rel="stylesheet" href="<?= asset('lib/bootstrap-5.3.8/css/bootstrap.min.css') ?>">
|
|
<!-- AOS y estilos -->
|
|
<link rel="stylesheet" href="<?= asset('lib/aos@2.3.1/aos.css') ?>">
|
|
<link rel="stylesheet" href="<?= asset('css/styles.css') ?>">
|
|
<!-- Bootstrap Icons -->
|
|
<link rel="stylesheet" href="<?= asset('assets/bootstrap-icons-1.13.1/bootstrap-icons.css') ?>">
|
|
|
|
<link rel="icon" href="<?= asset('assets/user.png') ?>">
|
|
|
|
<style>
|
|
/* Compensa navbar fija */
|
|
body {
|
|
padding-top: 56px;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body class="login-bg">
|
|
<header class="fixed-top">
|
|
<nav class="navbar navbar-expand-lg navbar-dark bg-dark" data-bs-theme="dark">
|
|
<div class="container">
|
|
<a class="navbar-brand fw-semibold" href="/academy/index.php">#VeladeroDigital_</a>
|
|
|
|
<?php if ($user): ?>
|
|
<!-- Toggler responsive -->
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#menuSuperior"
|
|
aria-controls="menuSuperior" aria-expanded="false" aria-label="Mostrar menú">
|
|
<span class="navbar-toggler-icon"></span>
|
|
</button>
|
|
|
|
<div class="collapse navbar-collapse" id="menuSuperior">
|
|
|
|
<!-- Menú principal (izquierda) -->
|
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
|
|
|
<?php foreach ($menuUsuario as $menu): ?>
|
|
<?php
|
|
$subMenuUsuario = LoginModel::mdlObtenerSubMenuUsuario((int)$menu->modulo_id, $user);
|
|
$tieneHijos = !empty($subMenuUsuario);
|
|
|
|
// href para navegación normal (si hay vista)
|
|
$hrefPadre = !empty($menu->vista) ? asset('views/' . ltrim($menu->vista, '/')) : '#';
|
|
// data-vista para AJAX (CargarContenido)
|
|
$dataVistaPadre = !empty($menu->vista) ? 'vistas/' . htmlspecialchars($menu->vista) : '';
|
|
?>
|
|
|
|
<?php if ($tieneHijos): ?>
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle"
|
|
href="#"
|
|
id="menu<?= (int)$menu->modulo_id ?>"
|
|
role="button"
|
|
data-bs-toggle="dropdown"
|
|
aria-expanded="false">
|
|
<i class="<?= htmlspecialchars($menu->icon_menu) ?> me-1"></i>
|
|
<?= htmlspecialchars($menu->modulo) ?>
|
|
</a>
|
|
|
|
<ul class="dropdown-menu" aria-labelledby="menu<?= (int)$menu->modulo_id ?>">
|
|
<?php foreach ($subMenuUsuario as $sub): ?>
|
|
<?php
|
|
$hrefHijo = asset('views/' . ltrim($sub->vista, '/'));
|
|
$dataVistaHijo = 'vistas/' . htmlspecialchars($sub->vista);
|
|
?>
|
|
<li>
|
|
<a class="dropdown-item nav-ajax"
|
|
href="<?= $hrefHijo ?>"
|
|
data-vista="<?= $dataVistaHijo ?>">
|
|
<i class="<?= htmlspecialchars($sub->icon_menu) ?> me-2"></i>
|
|
<?= htmlspecialchars($sub->modulo) ?>
|
|
</a>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
</li>
|
|
|
|
<?php else: ?>
|
|
<li class="nav-item">
|
|
<a class="nav-link nav-ajax"
|
|
href="<?= $hrefPadre ?>"
|
|
<?= $dataVistaPadre ? 'data-vista="' . $dataVistaPadre . '"' : '' ?>>
|
|
<i class="<?= htmlspecialchars($menu->icon_menu) ?> me-1"></i>
|
|
<?= htmlspecialchars($menu->modulo) ?>
|
|
</a>
|
|
</li>
|
|
<?php endif; ?>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
|
|
<!-- Dropdown de usuario (derecha) -->
|
|
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
|
|
<li class="nav-item dropdown">
|
|
<a class="nav-link dropdown-toggle d-flex align-items-center"
|
|
href="#"
|
|
id="userMenu"
|
|
role="button"
|
|
data-bs-toggle="dropdown"
|
|
aria-expanded="false">
|
|
<i class="bi bi-person-circle me-2"></i>
|
|
<span><?= htmlspecialchars($_SESSION['nombre'] ?? $user) ?></span>
|
|
</a>
|
|
|
|
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
|
|
<li>
|
|
<a class="dropdown-item" href="/academy/views/perfil.php">
|
|
<i class="bi bi-person-lines-fill me-2"></i> Perfil
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<hr class="dropdown-divider">
|
|
</li>
|
|
<li>
|
|
<a class="dropdown-item" href="?cerrar_sesion=1">
|
|
<i class="bi bi-box-arrow-right me-2"></i> Desconectar
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
</div>
|
|
<?php else: ?>
|
|
<!-- Sin usuario: botón Iniciar sesión -->
|
|
<?php if (($_SERVER['SCRIPT_NAME'] ?? '') !== '/academy/views/login.php'): ?>
|
|
<a class="btn btn-outline-light btn-sm ms-auto" href="/academy/views/login.php">
|
|
<i class="bi bi-box-arrow-in-right me-1"></i> Iniciar sesión
|
|
</a>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
|
|
<main>
|