<?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;
}
}