### Explicación del Código para Principiantes

Aquí tienes una guía sencilla para entender los archivos de tu proyecto. Está pensada para alguien sin conocimientos previos de programación.

---

### `index.php` - La página principal

Este archivo es la página principal que ven los usuarios. Su contenido cambia dependiendo de si el usuario ha iniciado sesión o no.

**Conceptos clave:**

*   **`<?php ... ?>`**: Estas etiquetas le dicen al servidor que lo que está dentro es código PHP y debe ser ejecutado. El resto es HTML normal.
*   **`session_start();`**: Esta es una de las primeras cosas que se hacen. Inicia o reanuda una "sesión", que es como una pequeña caja de memoria en el servidor para guardar información sobre un visitante específico mientras navega por el sitio. Por ejemplo, aquí guardamos si ha iniciado sesión.
*   **`$_SESSION`**: Es una variable especial (un "array asociativo") donde se guardan los datos de la sesión. Piensa en ella como un casillero con etiquetas. Por ejemplo, `$_SESSION['login']` guarda el nombre de usuario.
*   **`if (condición) { ... } else { ... }`**: Esto es un "condicional". Permite que el código tome decisiones.
    *   `if`: "Si la condición es verdadera, haz esto...".
    *   `else`: "...de lo contrario, haz esto otro".
*   **`isset($_SESSION['login'])`**: `isset()` es una función que comprueba si una variable "existe" y no es nula. Aquí, estamos preguntando: "¿Hay algo guardado en la sesión con la etiqueta 'login'?".
*   **`&&`**: Significa "Y". La condición completa `isset($_SESSION['login']) && $_SESSION['login'] != ''` se lee como: "Si la variable de sesión 'login' existe Y no está vacía...".
*   **`$btnlog = '...';`**: Esto es una "variable". Las variables son contenedores para guardar información. Aquí, `$btnlog` guarda el código HTML que se mostrará: un mensaje de bienvenida si el usuario ha iniciado sesión, o un botón para iniciar sesión si no lo ha hecho.
*   **`echo $btnlog;`**: `echo` es la instrucción para "imprimir" o "mostrar" algo en la pantalla. En este caso, muestra el contenido de la variable `$btnlog`.
*   **HTML con Bootstrap**: El resto del archivo es HTML estándar que estructura la página. Usa "Bootstrap", que es un conjunto de herramientas y estilos predefinidos para que la página se vea bien y sea adaptable a móviles (`col-md-2`, `navbar`, etc.) sin tener que escribir todo el CSS desde cero.

---

### `login.php` - El formulario de inicio de sesión

Este archivo se encarga de procesar el intento de inicio de sesión de un usuario.

**Conceptos clave:**

*   **`extract($_POST);`**: `$_POST` es otra variable especial que contiene todos los datos enviados desde un formulario HTML usando el método "post". `extract()` es una función que toma los datos de `$_POST` y crea variables normales con el mismo nombre. Por ejemplo, si el formulario envía `usuario` y `pass`, esta línea crea las variables `$usuario` y `$pass`.
*   **`$msj = '...';`**: Una variable para guardar mensajes de error o estado para el usuario (por ejemplo, "Datos incorrectos").
*   **`if($usuario=='javier' && $pass=='123')`**: Otro condicional. Compara (`==`) lo que el usuario escribió en el formulario con los valores correctos.
*   **`$_SESSION['login'] = 'Javier';`**: Si los datos son correctos, guardamos el nombre 'Javier' en la sesión. Ahora, cuando el usuario vaya a `index.php`, el `isset($_SESSION['login'])` será verdadero.
*   **`header('Location: index.php');`**: Esta función redirige al usuario a otra página. Si el login es correcto, lo enviamos de vuelta a la página principal.
*   **Formulario HTML**: La parte HTML del archivo crea el formulario con campos para el usuario y la contraseña. El atributo `action="login.php"` le dice al formulario que debe enviar los datos a este mismo archivo para ser procesados.

---

### `logout.php` - Cerrar la sesión

Un archivo muy simple para destruir la sesión del usuario.

**Conceptos clave:**

*   **`$_SESSION = array();`**: Esta línea vacía la variable `$_SESSION`, eliminando todos los datos guardados (como el nombre de usuario). Es como vaciar el casillero.
*   **`header('Location: index.php');`**: Después de cerrar la sesión, redirigimos al usuario a la página principal, donde ahora se le mostrará el botón para iniciar sesión de nuevo.

---

### `CFrontal.php` - El Controlador Frontal

Este es un concepto un poco más avanzado llamado "Controlador Frontal". Es un único punto de entrada para muchas acciones. En lugar de tener muchos archivos `.php` a los que el usuario accede directamente, todo pasa por aquí, y este archivo decide qué hacer.

**Conceptos clave:**

*   **`$getPost = array_merge($_GET, $_POST, $_FILES);`**: `array_merge()` une varios arrays en uno solo. Aquí, combinamos los datos que llegan por la URL (`$_GET`), por formulario (`$_POST`) y los archivos subidos (`$_FILES`) en una sola variable `$getPost` para manejarlos más fácilmente.
*   **`if(file_exists('controladores/C'.$getPost['controlador'].'.php'))`**: `file_exists()` comprueba si un archivo existe en el servidor. Aquí, construimos dinámicamente el nombre de un archivo de controlador (ej. `controladores/CUsuarios.php`) y verificamos si existe antes de intentar usarlo.
*   **`require_once 'controladores/'.$controlador;`**: Si el archivo existe, `require_once` lo incluye en el código. Es como copiar y pegar el contenido de ese archivo aquí. Se usa `_once` para asegurarse de que no se incluya varias veces por error.
*   **`$objCont = new $controlador();`**: Esto es "Programación Orientada a Objetos" (POO). Creamos una "instancia" (un objeto) de la clase del controlador. Por ejemplo, `new CUsuarios()`.
*   **`if(method_exists($objCont, $metodo))`**: `method_exists()` comprueba si un objeto tiene un método (una función) con un nombre específico.
*   **`$objCont->$metodo($getPost);`**: Si el método existe, lo llamamos y le pasamos los datos. Por ejemplo, `$objCont->getVistaUsuariosPrincipal($getPost);`.

En resumen, `CFrontal.php` recibe una petición que dice "quiero que el controlador `Usuarios` ejecute el método `getVistaUsuariosPrincipal`", y se encarga de verificar que todo exista y de ejecutarlo.

---

### `Controlador.php` - El Controlador Base

**Conceptos clave:**

*   **`class Controlador { ... }`**: Una "clase" es una plantilla para crear objetos. Esta es una clase base muy simple.
*   **`function __construct() { ... }`**: El "constructor" es un método especial que se ejecuta automáticamente cuando se crea un nuevo objeto de esta clase (`new Controlador()`).

---

### `CUsuarios.php` - Un Controlador Específico

**Conceptos clave:**

*   **`class CUsuarios extends Controlador`**: `extends` significa que la clase `CUsuarios` "hereda" todo lo que tiene la clase `Controlador`. Es una forma de compartir código y estructura.
*   **`public function getVistaUsuariosPrincipal($datos=array())`**: Esto es un "método" (una función dentro de una clase). Es `public`, lo que significa que se puede llamar desde fuera de la clase (como lo hace `CFrontal.php`). Recibe un parámetro `$datos`.

Espero que esta guía te sea de gran ayuda para entender los fundamentos de tu proyecto. ¡Mucho ánimo!

---

### ¿Cómo funciona el sistema de Iniciar Sesión (Login)? Una analogía

Imagina que tu sitio web es un club privado.

1.  **La Recepción (`session_start()`):**
    *   Cada vez que un visitante llega a una página con `session_start()`, es como si se acercara a la recepción del club.
    *   El recepcionista (PHP) mira si ya le ha dado una "tarjeta de visitante" (un ID de sesión).
    *   Si es la primera vez que viene en mucho tiempo, le da una tarjeta nueva, única y vacía.
    *   Si ya tenía una tarjeta de una visita anterior a otra página, el recepcionista la reconoce y la recupera.
    *   **Importante:** `session_start()` debe estar en TODAS las páginas donde quieras saber si el usuario está identificado o no. Es el primer paso para "recordar" al usuario.

2.  **El Inicio de Sesión (`login.php`):**
    *   El visitante va a la página de `login.php` y te da su nombre de usuario y contraseña.
    *   Tú (el código) compruebas si son correctos: `if($usuario=='javier' && $pass=='123')`.
    *   Si son correctos, coges su "tarjeta de visitante" y escribes en ella: "Nombre: Javier". Esto es lo que hace `$_SESSION['login'] = 'Javier';`.
    *   `$_SESSION` es como un casillero personal que tiene cada visitante en el club. Con `$_SESSION['login'] = 'Javier'`, estás guardando el valor 'Javier' en un apartado llamado 'login' dentro de su casillero.
    *   Ahora, este visitante tiene una tarjeta que lo identifica como 'Javier'.

3.  **Navegar por el Club (`index.php`):**
    *   El visitante, ya identificado, va a la página principal (`index.php`).
    *   Lo primero que hace la página es `session_start()`, el recepcionista vuelve a mirar su tarjeta.
    *   Luego, el código pregunta: `if (isset($_SESSION['login']))`. Esto es como decir: "Mira en el casillero de este visitante, ¿hay algo guardado en el apartado 'login'?".
    *   Como en el paso anterior guardamos 'Javier', la respuesta es SÍ.
    *   Por lo tanto, el `if` se cumple y la página le muestra el mensaje de bienvenida: `$_SESSION['login'] . '<br><a href="logout.php">...'`.

4.  **Cerrar Sesión (`logout.php`):**
    *   El visitante hace clic en el enlace de "Cerrar Sesión" y llega a `logout.php`.
    *   El código ejecuta `$_SESSION = array();`. Esto es como si el recepcionista cogiera el casillero del visitante y lo vaciara por completo. Borra toda la información que había guardada, incluyendo el nombre de usuario.
    *   Ahora, la "tarjeta de visitante" sigue existiendo, pero está vacía de nuevo.
    *   Cuando se le redirige a `index.php`, el `if (isset($_SESSION['login']))` dará como resultado NO, porque el apartado 'login' del casillero ya no existe. Por lo tanto, se le mostrará el botón para iniciar sesión otra vez.

En resumen:
*   **`session_start()`**: Prepara el sistema para recordar al usuario.
*   **`$_SESSION['clave'] = 'valor'`**: Guarda información en la "memoria" del usuario.
*   **`isset($_SESSION['clave'])`**: Comprueba si hay información guardada.
*   **`$_SESSION = array()` o `session_destroy()`**: Borra la información para cerrar la sesión.


