diff --git a/controladores/ControladorPregunta.php b/controladores/ControladorPregunta.php index d5c8395..09779fa 100644 --- a/controladores/ControladorPregunta.php +++ b/controladores/ControladorPregunta.php @@ -3,6 +3,7 @@ session_start(); require_once '../clases/ClasePregunta.php'; +require_once '../clases/ClaseRespuesta.php'; switch ($_POST['orden']) { @@ -11,18 +12,118 @@ switch ($_POST['orden']) { $idCategoria = intval($_POST['idCategoria'] ?? 0); $nombrePregunta = trim($_POST['nombrePregunta'] ?? ''); - if ($idCategoria <= 0 || $nombrePregunta == '') { - echo json_encode(['error' => 'La categoría y el texto de la pregunta son obligatorios']); + $respuestaCorrecta = trim($_POST['respuestaCorrecta'] ?? ''); + $respuestaIncorrecta1 = trim($_POST['respuestaIncorrecta1'] ?? ''); + $respuestaIncorrecta2 = trim($_POST['respuestaIncorrecta2'] ?? ''); + $respuestaIncorrecta3 = trim($_POST['respuestaIncorrecta3'] ?? ''); + + // Comprobamos los datos + if ( + $idCategoria <= 0 || + $nombrePregunta === '' || + $respuestaCorrecta === '' || + $respuestaIncorrecta1 === '' || + $respuestaIncorrecta2 === '' || + $respuestaIncorrecta3 === '' + ) { + + echo json_encode([ + 'error' => 'La categoría, la pregunta y todas las respuestas son obligatorias.' + ]); + break; } - $pregunta = new Pregunta($idCategoria, $nombrePregunta); - $resultado = $pregunta->guardar(); - echo json_encode($resultado); + /* + * ========================================== + * 1. CREAMOS LA PREGUNTA + * ========================================== + */ + + $pregunta = new Pregunta( + $idCategoria, + $nombrePregunta + ); + + $resultadoPregunta = $pregunta->guardar(); + + + if (isset($resultadoPregunta['error'])) { + + echo json_encode($resultadoPregunta); + + break; + } + + + // Obtenemos el ID de la pregunta creada + $idPregunta = (int)$resultadoPregunta['exito_tecnico']; + + + /* + * ========================================== + * 2. CREAMOS LAS RESPUESTAS + * ========================================== + */ + + $respuestas = [ + [ + 'texto' => $respuestaCorrecta, + 'correcta' => 1 + ], + [ + 'texto' => $respuestaIncorrecta1, + 'correcta' => 0 + ], + [ + 'texto' => $respuestaIncorrecta2, + 'correcta' => 0 + ], + [ + 'texto' => $respuestaIncorrecta3, + 'correcta' => 0 + ] + ]; + + + foreach ($respuestas as $respuesta) { + + $objRespuesta = new Respuesta( + null, + $idPregunta, + $respuesta['texto'], + $respuesta['correcta'] + ); + + + $resultadoRespuesta = $objRespuesta->insertar(); + + + if (isset($resultadoRespuesta['error'])) { + + echo json_encode($resultadoRespuesta); + + break 2; + } + } + + + /* + * ========================================== + * 3. TODO CORRECTO + * ========================================== + */ + + echo json_encode([ + 'exito' => 'Pregunta creada correctamente.', + 'idPregunta' => $idPregunta + ]); + break; + case 'obtenerPreguntasPorCategoria': $idCategoria = intval($_POST['idCategoria'] ?? 0); @@ -49,5 +150,4 @@ switch ($_POST['orden']) { echo json_encode($listado); break; - } diff --git a/js/buscadorSala.js b/js/buscadorSala.js index 0ee97f7..400ea11 100644 --- a/js/buscadorSala.js +++ b/js/buscadorSala.js @@ -1,128 +1,104 @@ let usuarioYaEstaEnEquipo = false; $(document).ready(function () { -comprobarSalaUsuario(); + comprobarSalaUsuario(); }); function comprobarSalaUsuario() { + $("#cargandoSalas").remove(); -$("#cargandoSalas").remove(); - -$.ajax({ + $.ajax({ url: "controladores/ControladorEquipoxUsuario.php", type: "POST", dataType: "json", data: { - orden: "obtenerSalaUsuario" + orden: "obtenerSalaUsuario", }, success: function (respuesta) { + console.log("Sala del usuario:", respuesta); - console.log("Sala del usuario:", respuesta); - - if (respuesta.error) { - - console.error(respuesta.error); - - usuarioYaEstaEnEquipo = false; - - cargarSalas(); - - return; - } - - if (respuesta.asociado) { - - usuarioYaEstaEnEquipo = true; - - $("#contenedorCrearSala").hide(); - - cargarSalaUsuario(respuesta.idPartida); - - } else { - - usuarioYaEstaEnEquipo = false; - - cargarSalas(); - } - }, - - error: function (xhr, status, error) { - - console.error( - "Error al comprobar la sala del usuario:", - error - ); + if (respuesta.error) { + console.error(respuesta.error); usuarioYaEstaEnEquipo = false; cargarSalas(); - } -}); + return; + } -} + if (respuesta.asociado) { + usuarioYaEstaEnEquipo = true; -function cargarSalaUsuario(idPartida) { + $("#contenedorCrearSala").hide(); -$.ajax({ - url: "controladores/controladorPartida.php", - type: "POST", - dataType: "json", + cargarSalaUsuario(respuesta.idPartida); + } else { + usuarioYaEstaEnEquipo = false; - data: { - orden: "buscar", - idPartida: idPartida - }, - - success: function (partida) { - - if (partida.error) { - - console.error(partida.error); - - return; - } - - $("#contenedorSalas").empty(); - - cargarInformacionSala(partida); + cargarSalas(); + } }, error: function (xhr, status, error) { + console.error("Error al comprobar la sala del usuario:", error); - console.error( - "Error al obtener la sala del usuario:", - error - ); - } -}); - + usuarioYaEstaEnEquipo = false; + cargarSalas(); + }, + }); } -function cargarSalas() { - -$.ajax({ +function cargarSalaUsuario(idPartida) { + $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { - orden: "listar" + orden: "buscar", + idPartida: idPartida, + }, + + success: function (partida) { + if (partida.error) { + console.error(partida.error); + + return; + } + + $("#contenedorSalas").empty(); + + cargarInformacionSala(partida); + }, + + error: function (xhr, status, error) { + console.error("Error al obtener la sala del usuario:", error); + }, + }); +} + +function cargarSalas() { + $.ajax({ + url: "controladores/controladorPartida.php", + type: "POST", + dataType: "json", + + data: { + orden: "listar", }, success: function (partidas) { + const contenedor = $("#contenedorSalas"); - const contenedor = $("#contenedorSalas"); + contenedor.empty(); + contenedor.empty(); - contenedor.empty(); - contenedor.empty(); - - if (!Array.isArray(partidas) || partidas.length === 0) { - - contenedor.html(` + if (!Array.isArray(partidas) || partidas.length === 0) { + contenedor.html(`

No hay salas disponibles. @@ -130,518 +106,383 @@ $.ajax({

`); - return; - } + return; + } - partidas.forEach(function (partida) { - - cargarInformacionSala(partida); - - }); + partidas.forEach(function (partida) { + cargarInformacionSala(partida); + }); }, error: function (xhr, status, error) { - - console.error( - "Error al obtener las partidas:", - error - ); - } -}); - - + console.error("Error al obtener las partidas:", error); + }, + }); } function cargarInformacionSala(partida) { - -$.ajax({ + $.ajax({ url: "controladores/controladorPartida.php", type: "POST", dataType: "json", data: { - orden: "getEquipos", - idPartida: partida.idPartida + orden: "getEquipos", + idPartida: partida.idPartida, }, success: function (equipos) { + $.ajax({ + url: "controladores/controladorPartida.php", + type: "POST", + dataType: "json", - $.ajax({ - url: "controladores/controladorPartida.php", - type: "POST", - dataType: "json", + data: { + orden: "getJugadores", + idPartida: partida.idPartida, + }, - data: { - orden: "getJugadores", - idPartida: partida.idPartida - }, + success: function (jugadores) { + mostrarSala(partida, equipos, jugadores); + }, - success: function (jugadores) { - - mostrarSala( - partida, - equipos, - jugadores - ); - }, - - error: function (xhr, status, error) { - - console.error( - "Error al obtener jugadores:", - error - ); - } - }); + error: function (xhr, status, error) { + console.error("Error al obtener jugadores:", error); + }, + }); }, error: function (xhr, status, error) { - - console.error( - "Error al obtener equipos:", - error - ); - } -}); - - + console.error("Error al obtener equipos:", error); + }, + }); } function mostrarSala(partida, equipos, jugadores) { + const contenedor = $("#contenedorSalas"); - const contenedor = $("#contenedorSalas"); - let equiposHTML = ""; + let equiposHTML = ""; - equipos.forEach(function (equipo) { - - const jugadoresEquipo = jugadores.filter(function (jugador) { - return jugador.idEquipo == equipo.idEquipo; - }); + equipos.forEach(function (equipo) { + const jugadoresEquipo = jugadores.filter(function (jugador) { + return jugador.idEquipo == equipo.idEquipo; + }); let jugadoresHTML = ""; - if (jugadoresEquipo.length > 0) { - jugadoresEquipo.forEach(function (jugador) { - jugadoresHTML += ` -
- 👤 - ${escapeHTML(jugador.nombreUsuario)} -
- `; - }); - } else { - jugadoresHTML = ` -
Sin jugadores
- `; - } + if (jugadoresEquipo.length > 0) { + jugadoresEquipo.forEach(function (jugador) { + jugadoresHTML += ` +
- let botonUnirseHTML = ""; + + 👤 + - if (!usuarioYaEstaEnEquipo) { - botonUnirseHTML = ` - - `; - } + ${escapeHTML(jugador.nombreUsuario)} - equiposHTML += ` -
-
${escapeHTML(equipo.nombreEquipo)}
-
- ${jugadoresHTML}
- ${botonUnirseHTML} -
- `; - }); - - // Zona de acciones adicionales si el usuario YA está dentro de esta sala - let accionesSalaHTML = ""; - if (usuarioYaEstaEnEquipo) { - accionesSalaHTML = ` -
- - - 🎮 ¡Iniciar Partida! - + `; + }); + } else { + jugadoresHTML = ` +
+ Sin jugadores
`; } - const salaHTML = ` -
-
-
- ${escapeHTML(partida.nombrePartida)} -
-
-
- ${equiposHTML} -
- ${accionesSalaHTML} -
+ let botonUnirseHTML = ""; + + if (!usuarioYaEstaEnEquipo) { + botonUnirseHTML = ` + + `; + } + + equiposHTML += ` +
+ +
+ ${escapeHTML(equipo.nombreEquipo)} +
+ +
+ + ${jugadoresHTML} +
+ + ${botonUnirseHTML} +
`; + }); - contenedor.append(salaHTML); + const salaHTML = ` +
+ +
+ +
+ + ${escapeHTML(partida.nombrePartida)} + +
+ +
+ +
+ + ${equiposHTML} + +
+
+ +
+ +
+`; + + contenedor.append(salaHTML); } // ====================================================== // UNIRSE A UN EQUIPO // ====================================================== -$(document).on( -"click", -".btn-unirse-equipo", -function () { +$(document).on("click", ".btn-unirse-equipo", function () { + const boton = $(this); - const boton = $(this); + const idEquipo = boton.data("id-equipo"); - const idEquipo = boton.data("id-equipo"); + const idPartida = boton.data("id-partida"); - const idPartida = boton.data("id-partida"); + boton.prop("disabled", true); + boton.text("Uniéndose..."); - boton.prop("disabled", true); + $.ajax({ + url: "controladores/ControladorEquipoxUsuario.php", - boton.text("Uniéndose..."); + type: "POST", + dataType: "json", - $.ajax({ + data: { + orden: "registrarUsuarioEnEquipo", + idEquipo: idEquipo, + }, - url: "controladores/ControladorEquipoxUsuario.php", + success: function (respuesta) { + console.log("Respuesta al unirse:", respuesta); - type: "POST", + if (respuesta.error) { + alert(respuesta.error); - dataType: "json", + boton.prop("disabled", false); - data: { - orden: "registrarUsuarioEnEquipo", - idEquipo: idEquipo - }, + boton.text("Unirse"); + return; + } - success: function (respuesta) { + // ========================================== + // UNIÓN CORRECTA + // ========================================== - console.log( - "Respuesta al unirse:", - respuesta - ); + usuarioYaEstaEnEquipo = true; + // Ocultamos el botón "Crear sala" - if (respuesta.error) { + $("#contenedorCrearSala").hide(); - alert(respuesta.error); + // Eliminamos las salas actuales - boton.prop("disabled", false); + $("#contenedorSalas").empty(); - boton.text("Unirse"); + // Cargamos directamente la sala + // donde acaba de entrar el usuario - return; - } + cargarSalaUsuario(idPartida); + }, + error: function (xhr, status, error) { + console.error("Error al unirse al equipo:", error); - // ========================================== - // UNIÓN CORRECTA - // ========================================== + console.error("Respuesta del servidor:", xhr.responseText); - usuarioYaEstaEnEquipo = true; + alert("No se ha podido unir al equipo."); + boton.prop("disabled", false); - // Ocultamos el botón "Crear sala" - - $("#contenedorCrearSala").hide(); - - - // Eliminamos las salas actuales - - $("#contenedorSalas").empty(); - - - // Cargamos directamente la sala - // donde acaba de entrar el usuario - - cargarSalaUsuario(idPartida); - }, - - - error: function (xhr, status, error) { - - console.error( - "Error al unirse al equipo:", - error - ); - - console.error( - "Respuesta del servidor:", - xhr.responseText - ); - - - alert( - "No se ha podido unir al equipo." - ); - - - boton.prop("disabled", false); - - boton.text("Unirse"); - } - }); -} - - -); + boton.text("Unirse"); + }, + }); +}); // ====================================================== // ESCAPAR HTML // ====================================================== function escapeHTML(texto) { - -return $("
") + return $("
") .text(texto ?? "") .html(); - - } // ====================================================== // CREAR SALA // ====================================================== -$('#btnCrearSala').on('click', function () { - - const nombreSala = - $('#nombreSala').val().trim(); - - const nombreEquipo1 = - $('#nombreEquipo1').val().trim(); - - const nombreEquipo2 = - $('#nombreEquipo2').val().trim(); - - let valido = true; - - $('.mensaje-error-sala').remove(); - - $('.input-kahoot') - .removeClass('is-invalid'); - - if (nombreSala === '') { - - mostrarError( - '#nombreSala', - 'El nombre de la sala es obligatorio.' - ); - - valido = false; - - } else if (nombreSala.length < 3) { - - mostrarError( - '#nombreSala', - 'El nombre de la sala debe tener al menos 3 caracteres.' - ); - - valido = false; - } - - if (nombreEquipo1 === '') { - - mostrarError( - '#nombreEquipo1', - 'El nombre del equipo 1 es obligatorio.' - ); - - valido = false; - - } else if (nombreEquipo1.length < 2) { - - mostrarError( - '#nombreEquipo1', - 'El nombre del equipo debe tener al menos 2 caracteres.' - ); - - valido = false; - } - - if (nombreEquipo2 === '') { - - mostrarError( - '#nombreEquipo2', - 'El nombre del equipo 2 es obligatorio.' - ); - - valido = false; - - } else if (nombreEquipo2.length < 2) { - - mostrarError( - '#nombreEquipo2', - 'El nombre del equipo debe tener al menos 2 caracteres.' - ); - - valido = false; - } - - if ( - nombreEquipo1 !== '' && - nombreEquipo2 !== '' && - nombreEquipo1.toLowerCase() === - nombreEquipo2.toLowerCase() - ) { - - mostrarError( - '#nombreEquipo2', - 'Los dos equipos deben tener nombres diferentes.' - ); - - valido = false; - } - - if (!valido) { +$("#btnCrearSala").on("click", function () { + const nombreSala = $("#nombreSala").val().trim(); + + const nombreEquipo1 = $("#nombreEquipo1").val().trim(); + + const nombreEquipo2 = $("#nombreEquipo2").val().trim(); + + let valido = true; + + $(".mensaje-error-sala").remove(); + + $(".input-kahoot").removeClass("is-invalid"); + + if (nombreSala === "") { + mostrarError("#nombreSala", "El nombre de la sala es obligatorio."); + + valido = false; + } else if (nombreSala.length < 3) { + mostrarError( + "#nombreSala", + "El nombre de la sala debe tener al menos 3 caracteres.", + ); + + valido = false; + } + + if (nombreEquipo1 === "") { + mostrarError("#nombreEquipo1", "El nombre del equipo 1 es obligatorio."); + + valido = false; + } else if (nombreEquipo1.length < 2) { + mostrarError( + "#nombreEquipo1", + "El nombre del equipo debe tener al menos 2 caracteres.", + ); + + valido = false; + } + + if (nombreEquipo2 === "") { + mostrarError("#nombreEquipo2", "El nombre del equipo 2 es obligatorio."); + + valido = false; + } else if (nombreEquipo2.length < 2) { + mostrarError( + "#nombreEquipo2", + "El nombre del equipo debe tener al menos 2 caracteres.", + ); + + valido = false; + } + + if ( + nombreEquipo1 !== "" && + nombreEquipo2 !== "" && + nombreEquipo1.toLowerCase() === nombreEquipo2.toLowerCase() + ) { + mostrarError( + "#nombreEquipo2", + "Los dos equipos deben tener nombres diferentes.", + ); + + valido = false; + } + + if (!valido) { + return; + } + + // Deshabilitamos el botón mientras se crea la sala + const boton = $("#btnCrearSala"); + + boton.prop("disabled", true); + boton.text("Creando sala..."); + + $.ajax({ + url: "controladores/controladorPartida.php", // <-- cambia esto por la ruta de tu controlador + type: "POST", + dataType: "json", + data: { + orden: "crear", + nombrePartida: nombreSala, + nombreEquipo1: nombreEquipo1, + nombreEquipo2: nombreEquipo2, + }, + + success: function (respuesta) { + console.log("Respuesta del servidor:", respuesta); + + if (respuesta.error) { + alert(respuesta.error); + + boton.prop("disabled", false); + boton.text("Crear sala"); + return; - } + } - // Deshabilitamos el botón mientras se crea la sala - const boton = $('#btnCrearSala'); + if (respuesta.exito) { + $("#modalCrearSala").modal("hide"); + location.reload(); + } + }, - boton.prop('disabled', true); - boton.text('Creando sala...'); + error: function (xhr, status, error) { + console.error("Error al crear la sala:", error); + console.error("Respuesta:", xhr.responseText); - $.ajax({ - url: 'controladores/controladorPartida.php', // <-- cambia esto por la ruta de tu controlador - type: 'POST', - dataType: 'json', - data: { - orden: 'crear', - nombrePartida: nombreSala, - nombreEquipo1: nombreEquipo1, - nombreEquipo2: nombreEquipo2 - }, + alert("No se ha podido crear la sala."); - success: function (respuesta) { - - console.log('Respuesta del servidor:', respuesta); - - if (respuesta.error) { - - alert(respuesta.error); - - boton.prop('disabled', false); - boton.text('Crear sala'); - - return; - } - - if (respuesta.exito) { - - $('#modalCrearSala').modal('hide'); - location.reload(); - - } - }, - - error: function (xhr, status, error) { - - console.error('Error al crear la sala:', error); - console.error('Respuesta:', xhr.responseText); - - alert('No se ha podido crear la sala.'); - - boton.prop('disabled', false); - boton.text('Crear sala'); - } - }); + boton.prop("disabled", false); + boton.text("Crear sala"); + }, + }); }); - // ====================================================== // MOSTRAR ERROR // ====================================================== function mostrarError(selector, mensaje) { + const input = $(selector); -const input = $(selector); + input.addClass("is-invalid"); -input.addClass("is-invalid"); - - -input.after(` + input.after(`
${mensaje}
`); - - } // ====================================================== // QUITAR ERROR AL ESCRIBIR // ====================================================== -$(".input-kahoot").on( -"input", -function () { +$(".input-kahoot").on("input", function () { + $(this).removeClass("is-invalid"); - $(this).removeClass( - "is-invalid" - ); - - $(this) - .next(".mensaje-error-sala") - .remove(); -} - - -); - - -// ====================================================== -// ABANDONAR SALA -// ====================================================== -$(document).on("click", ".btn-abandonar-sala", function () { - if (!confirm("¿Estás seguro de que deseas salir de esta sala?")) { - return; - } - - const boton = $(this); - boton.prop("disabled", true).text("Saliendo..."); - - $.ajax({ - url: "controladores/ControladorEquipoxUsuario.php", - type: "POST", - dataType: "json", - data: { - orden: "salirDeSala" // Asegúrate de procesar esta 'orden' en tu PHP - }, - success: function (respuesta) { - if (respuesta.error) { - alert(respuesta.error); - boton.prop("disabled", false).text("Abandonar sala"); - return; - } - - // Restablecemos el estado y recargamos la lista completa de salas - usuarioYaEstaEnEquipo = false; - $("#contenedorCrearSala").show(); - cargarSalas(); - }, - error: function (xhr, status, error) { - console.error("Error al salir de la sala:", error); - alert("No se pudo salir de la sala."); - boton.prop("disabled", false).text("Abandonar sala"); - } - }); -}); \ No newline at end of file + $(this).next(".mensaje-error-sala").remove(); +}); diff --git a/js/perfil.js b/js/perfil.js index 64f9353..db22e14 100644 --- a/js/perfil.js +++ b/js/perfil.js @@ -56,7 +56,6 @@ function borrarNombre() { document.getElementById("nuevoNombre").value = ""; } - // ========================= // CAMBIAR FOTO // ========================= @@ -106,3 +105,149 @@ $("#inputFoto").change(function () { } }); }); + +// ========================= +// RECOGER CATEGORIAS +// ==== + +$("#modalCrearPregunta").on("show.bs.modal", function () { + const selectCategoria = $("#idCategoria"); + + // Limpiamos las categorías anteriores + selectCategoria.empty(); + + // Opción inicial + selectCategoria.append(''); + + $.ajax({ + url: "controladores/controladorCategoria.php", + type: "POST", + dataType: "json", + + data: { + orden: "listarCategorias", + }, + + success: function (respuesta) { + console.log("Categorías:", respuesta); + + if (respuesta.error) { + alert(respuesta.error); + return; + } + + $.each(respuesta, function (index, categoria) { + selectCategoria.append( + $("
+ + +
+ + + + + +
+ + @@ -404,7 +432,8 @@