Academia Deltamontero · Documentación
Desarrollolocal_deltamodules

Repasos y editor de preguntas

Pantalla corta de nuevo repaso, editor propio de preguntas (question_editor), aviso al empezar automático o escrito a mano y seguridad de los exámenes.

Los cuestionarios de la Academia ("Repaso: …" en los módulos y "Prueba Técnica — …" en el curso de selección) se crean y editan con pantallas propias en lugar de los formularios completos de Moodle, que siguen disponibles como respaldo.

Flujo de creación

"Añadir una actividad → Repaso o prueba"

En un módulo de la Academia, hook_callbacks::course_admin_route() desvía /course/modedit.php?add=quiz a newquiz.php?course=…&section=…, salvo que la dirección traiga full=1 (formulario completo de Moodle).

Pantalla corta: newquiz.php

Pide nombre, indicaciones opcionales, nota para aprobar, intentos y tiempo, con los valores de las reglas del módulo como iniciales. Exige mod/quiz:addinstance y moodle/course:manageactivities en el curso; si el curso no es de la Academia redirige al formulario completo. Crea el cuestionario con builder::create_quiz(), guarda la configuración con question_editor::save_settings() (aviso automático) y abre el editor.

Editor: questions.php?cmid=…

Exige mod/quiz:manage en el módulo. Arriba muestra la configuración del repaso o de la prueba; debajo, las preguntas con sus opciones y la correcta marcada.

Si el cuestionario se crea con el formulario completo de Moodle, standard::module_changed guarda $SESSION->deltanewquiz y la siguiente página del curso o del repaso redirige a su editor. Además, para quien no es super administrador, /mod/quiz/edit.php?cmid=… (botones "Preguntas" y "Agregar pregunta") y la vista de un cuestionario sin preguntas llevan también a questions.php.

question_editor

classes/question_editor.php implementa el editor. Opción múltiple con una respuesta correcta y verdadero/falso se escriben en la propia página; los demás tipos de pregunta se crean con el formulario de Moodle.

MétodoQué hace
load($cmid)Estructura del cuestionario (qbank_helper::get_question_structure): por pregunta, texto plano, opciones, si es editable aquí (solo multichoice y truefalse) y puntos. Devuelve también cuántos intentos reales (preview = 0) tiene.
save($cmid, $d, $questionid)Pregunta nueva o corrección. Al corregir se guarda una versión nueva con question_bank::get_qtype()->save_question(): los intentos nuevos usan la corregida y los ya rendidos conservan la que respondieron. Solo corrige preguntas que pertenecen a ese cuestionario. Con intentos rendidos no se pueden agregar preguntas. Cambiar los puntos de una pregunta solo se permite mientras nadie haya rendido.
remove($cmid, $slot)Quita una pregunta (solo si nadie ha rendido) y vuelve a paginar y recalcular la nota.
native_types()Tipos de pregunta instalados que se crean con el formulario de Moodle (emparejamiento, respuesta corta, numérica, ensayo, ordenar, arrastrar, Cloze…), con una descripción para los comunes.
native_add_url, native_edit_urlEnlaces a /question/bank/editquestion/question.php que vuelven al editor.
attach($cmid, $questionid)Al volver del formulario de Moodle con ?addquestion=id, agrega esa pregunta al cuestionario. Seguridad: solo si la pregunta está en la categoría del cuestionario, la creó el mismo usuario en la última hora, todavía no está en el cuestionario y nadie lo ha rendido.
is_test($cmid)Si el cuestionario es una prueba técnica de postulantes (local_candidate_enrollment\candidates::tests()).
settings($cmid)Valores actuales y opciones de nota, intentos, tiempo y aviso. En los módulos la nota va en %; en las pruebas técnicas, sobre 10 con las opciones de candidates::TEST_PASS, TEST_ATTEMPTS y TEST_TIMES. El valor actual siempre aparece entre las opciones aunque se haya puesto con el formulario de Moodle.
save_settings($cmid, $d)Guarda intentos, tiempo, nota para aprobar y aviso. Solo acepta valores de la lista. Si cambió la nota recalcula el completado de quien ya rindió.
refresh_notice($cmid)Rehace el aviso automático; en los módulos de la Academia llama a standard::apply_quiz() para aplicar también el resto de las reglas.

Las preguntas creadas aquí se guardan en una categoría del banco del curso con el nombre del cuestionario (la misma que usa la importación de preguntas).

questions.php admite estas acciones por POST con sesskey: settings (configuración), save (pregunta nueva o corregida, parámetros text, qtype, options[], correct, tf, points, questionid) y remove (slot).

Aviso al empezar

El aviso "Antes de empezar, lee esto" encabeza la descripción (intro) del cuestionario. Puede ser:

TipoMarca HTMLCómo se genera
Automáticodata-delta-exam-notice="1"academy::exam_notice() con los intentos, la nota para aprobar, la regla de volver a ver el video y el control de pantalla del módulo. Se reescribe cada vez que cambian esos valores (en el editor, al guardar el formulario o al cambiar una regla).
Escrito a manodata-delta-exam-notice="custom"Texto escrito en el editor (academy::custom_notice_html()). Nunca se reemplaza por el automático, aunque cambien las reglas. Vacío = automático.

academy::with_notice($intro, $auto) devuelve el intro con el aviso automático, salvo que exista uno escrito a mano. academy::strip_notice() reconoce cualquier aviso anterior por el texto "Antes de empezar, lee esto" para no duplicarlo.

En el formulario completo de Moodle el aviso no se muestra dentro de la Descripción: local_deltamodules_coursemodule_definition_after_data (lib.php) lo quita del editor y guarda el texto escrito a mano en un campo oculto deltacustomnotice; local_deltamodules_coursemodule_edit_post_actions lo vuelve a poner al guardar y llama a question_editor::refresh_notice(). El mismo callback muestra arriba del formulario las reglas del módulo que se aplicarán al guardar y, en un repaso nuevo, propone los intentos y el tiempo de las reglas del módulo.

Seguridad de los exámenes

MedidaDónde
Configuración común (una pregunta por página, navegación secuencial, respuestas mezcladas, sin ventana segura, sin mostrar la respuesta correcta)academy::exam_settings(), aplicada al crear y por configure-exam-security.php a los cuestionarios que no están en examsecured
Intentos reales: nadie previsualiza salvo el super administradorenforce-real-quiz-attempts.php (mod/quiz:preview en CAP_PREVENT para todos los roles)
Candado real hasta ver el video, también para gestoresRegla de acceso quizaccess_deltagate (página)
Control de cambio de pantalla con conteo en el servidorJavaScript en additionalhtmlhead + servicio local_deltamodules_exam_strike (Servicios web)
Sin chat de IA durante el intento y el resumenCSS en additionalhtmlhead
Sin herramientas de autor ni botón de nueva previsualización dentro del examenCSS en additionalhtmlhead
Volver a ver el video y recibir intentos nuevosstandard (Módulos y estándar)

El JavaScript del control de pantalla (ver Interfaz global) solo se activa en /mod/quiz/attempt.php: en computadora cuenta al instante el cambio de pestaña, de ventana o de programa y la conexión de una segunda pantalla (screen.isExtended); en celular cuenta cuando la página deja de verse más de 1 segundo. Al llegar al límite de la regla exam_leaves envía el intento automáticamente. Con el límite en 0 no se activa.

En esta página