File "MaterialControlador.php"

Full Path: C:/wamp64/www/Formaciones/Controladores/MaterialControlador.php
File size: 7.51 KB
MIME-type: text/x-php
Charset: utf-8

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