<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // Controladores/MaterialControlador.php require_once 'Modelos/MaterialModelo.php'; class MaterialControlador { private $modelo; private $db; public function __construct($db) { $this->db = $db; $this->modelo = new MaterialModelo($db); if (!esta_autenticado() || !in_array(usuario_actual()['rol'], ['admin', 'instructor'])) { header("Location: index.php"); exit; } } public function index() { $busqueda = $_GET['s'] ?? ''; // Configuración Paginación $por_pagina = 10; $pagina_actual = isset($_GET['p']) ? (int)$_GET['p'] : 1; if ($pagina_actual < 1) $pagina_actual = 1; $offset = ($pagina_actual - 1) * $por_pagina; // Obtener datos paginados $total_registros = $this->modelo->contarTodos($busqueda); $total_paginas = ceil($total_registros / $por_pagina); $materiales = $this->modelo->listarPaginados($busqueda, $por_pagina, $offset); require_once 'Vistas/plantilla/encabezado.php'; require_once 'Vistas/instructor/materiales.php'; require_once 'Vistas/plantilla/pie.php'; } public function subirArchivo() { if ($_SERVER['REQUEST_METHOD'] === 'POST') { $curso_id = $_POST['course_id'] ?? null; $titulo = $_POST['titulo'] ?? ''; $namePro = $_POST['instructor_name'] ?? ''; $tipo = $_POST['tipo_input'] ?? 'file'; $contenido_firma = $_POST['firma_data'] ?? ''; // Validaciones básicas if (empty($curso_id) || empty($titulo) || empty($namePro) || empty($contenido_firma)) { $_SESSION['error'] = "Todos los campos son obligatorios, incluyendo la firma."; header("Location: index.php?r=instructor/materiales"); exit; } $exito = false; if ($tipo === 'file') { // Subir archivo al servidor físicamente if (isset($_FILES['archivo']) && $_FILES['archivo']['error'] === UPLOAD_ERR_OK) { $nombreOriginal = $_FILES['archivo']['name']; $extension = pathinfo($nombreOriginal, PATHINFO_EXTENSION); $nombreUnico = uniqid() . '_' . time() . '.' . $extension; // Crear carpeta si no existe $carpetaDestino = 'uploads/materiales/'; if (!is_dir($carpetaDestino)) { mkdir($carpetaDestino, 0777, true); } $rutaCompleta = $carpetaDestino . $nombreUnico; error_log("[v0] Ruta completa del archivo: " . $rutaCompleta); error_log("[v0] Archivo existe después de mover: " . (file_exists($rutaCompleta) ? 'SI' : 'NO')); if (move_uploaded_file($_FILES['archivo']['tmp_name'], $rutaCompleta)) { error_log("[v0] Guardando en BD - curso_id: $curso_id, titulo: $titulo, tipo: $tipo, ruta: $rutaCompleta"); // Guardar la ruta del archivo en la base de datos $exito = $this->modelo->subir( $curso_id, $titulo, $tipo, $namePro, $contenido_firma, $rutaCompleta // Pasar la ruta del archivo ); error_log("[v0] Resultado de guardado en BD: " . ($exito ? 'EXITO' : 'FALLO')); } else { $_SESSION['error'] = "Error al subir el archivo al servidor."; header("Location: index.php?r=instructor/materiales"); exit; } } else { $error_msg = "Debe seleccionar un archivo válido."; if (isset($_FILES['archivo']['error'])) { switch ($_FILES['archivo']['error']) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: $error_msg = "El archivo supera el tamaño máximo permitido."; break; case UPLOAD_ERR_NO_FILE: $error_msg = "No se seleccionó ningún archivo."; break; } } $_SESSION['error'] = $error_msg; header("Location: index.php?r=instructor/materiales"); exit; } } elseif ($tipo === 'url') { $url = $_POST['url_externa'] ?? ''; if (empty($url) || !filter_var($url, FILTER_VALIDATE_URL)) { $_SESSION['error'] = "Debe ingresar una URL válida."; header("Location: index.php?r=instructor/materiales"); exit; } $exito = $this->modelo->subir( $curso_id, $titulo, $tipo, $namePro, $contenido_firma, $url // Para tipo URL, guardar en la columna url ); } else { $_SESSION['error'] = "Tipo de material no válido."; header("Location: index.php?r=instructor/materiales"); exit; } if ($exito) { $_SESSION['mensaje'] = "Material guardado correctamente."; } else { $_SESSION['error'] = "Error al guardar en la base de datos. Verifica los logs del servidor."; } } header("Location: index.php?r=instructor/materiales"); exit; } public function guardar() { // Método alternativo si lo necesitas if ($_SERVER['REQUEST_METHOD'] === 'POST') { $_SESSION['mensaje'] = "Material guardado correctamente."; } header("Location: index.php?r=instructor/materiales"); exit; } public function borrar() { if (isset($_GET['id'])) { $id = intval($_GET['id']); $material = $this->modelo->obtenerPorId($id); if ($material && $material['type'] === 'file' && !empty($material['file_path'])) { // Eliminar archivo físico del servidor if (file_exists($material['file_path'])) { unlink($material['file_path']); } } $exito = $this->modelo->eliminar($id); if ($exito) { $_SESSION['mensaje'] = "Material eliminado correctamente."; } else { $_SESSION['error'] = "Error al eliminar el material."; } } header("Location: index.php?r=instructor/materiales"); exit; } }