File: /var/www/html/elearningbasa.sumar.com.py/local/quiz_autostart-bk/lib.php
<?php
defined('MOODLE_INTERNAL') || die();
function local_quiz_autostart_log(string $msg): void {
global $CFG, $USER;
$uid = isset($USER->id) ? $USER->id : 0;
$prefix = date('c') . ' [local_quiz_autostart] u:' . $uid . ' ';
@file_put_contents($CFG->dataroot . '/local_quiz_autostart.log', $prefix . $msg . PHP_EOL, FILE_APPEND);
}
function local_quiz_autostart_before_http_headers() {
global $DB, $USER, $SCRIPT;
if (CLI_SCRIPT || (defined('AJAX_SCRIPT') && AJAX_SCRIPT)) {
return;
}
if (empty($SCRIPT) || $SCRIPT !== '/mod/quiz/view.php') {
return;
}
$cmid = optional_param('id', 0, PARAM_INT);
if (!$cmid) {
$cmid = optional_param('cmid', 0, PARAM_INT);
}
if (!$cmid) {
local_quiz_autostart_log('Skip: missing cmid param');
return;
}
try {
$cm = get_coursemodule_from_id('quiz', $cmid, 0, false, MUST_EXIST);
} catch (moodle_exception $e) {
local_quiz_autostart_log('Skip: get_coursemodule_from_id failed cmid=' . $cmid . ' msg=' . $e->getMessage());
return;
}
require_login($cm->course, false, $cm);
$context = \context_module::instance($cm->id);
$quiz = $DB->get_record('quiz', ['id' => $cm->instance], '*', MUST_EXIST);
$allowed = [219, 220, 221, 222, 223, 224, 225, 226];
$match = in_array((int)$quiz->id, $allowed, true) || in_array((int)$cm->id, $allowed, true);
if (!$match) {
local_quiz_autostart_log('Skip: quiz not allowed cmid=' . $cm->id . ' quizid=' . $quiz->id);
return;
}
$url = (string)qualified_me();
if (strpos($url, '/mod/quiz/startattempt.php') !== false || strpos($url, '/mod/quiz/attempt.php') !== false) {
local_quiz_autostart_log('Skip: already at startattempt/attempt url=' . $url);
return;
}
$canattempt = has_capability('mod/quiz:attempt', $context, $USER);
$isteacherish = has_any_capability([
'mod/quiz:preview',
'mod/quiz:manage',
'moodle/course:manageactivities',
'moodle/course:update',
], $context, $USER);
local_quiz_autostart_log('Check: cmid=' . $cm->id . ' quizid=' . $quiz->id . ' canattempt=' . ($canattempt ? '1' : '0') . ' teacherish=' . ($isteacherish ? '1' : '0') . ' url=' . $url);
if (!$canattempt || $isteacherish) {
return;
}
// Redirigir con sesskey y forcestart
$redirecturl = new \moodle_url('/mod/quiz/startattempt.php', [
'cmid' => $cm->id,
'sesskey' => sesskey(),
'forcestart' => 1
]);
local_quiz_autostart_log('Redirecting to ' . $redirecturl->out(false));
redirect($redirecturl);
}
if ($script === '/mod/quiz/review.php' && $cm && $cm->modname === 'quiz') {
$quizid = $cm->instance;
// Solo en tus cuestionarios y para estudiantes
if (in_array($quizid, $quizids, true) && !is_siteadmin() && !$teacherish) {
require_login($course, false, $cm);
$quizobj = quiz::create($cm->instance, $USER->id);
// Si ya no puede intentar más (ej: solo 1 intento permitido)
if (!$quizobj->is_preview_user() && !$quizobj->is_ongoing_attempt()) {
$url = new moodle_url('/course/view.php', ['id' => $course->id]);
redirect($url);
}
}
}
function local_quiz_autostart_before_http_headers() {
global $PAGE;
if (strpos($PAGE->url->out_as_local_url(), '/mod/quiz/review.php') !== false ||
strpos($PAGE->url->out_as_local_url(), '/mod/quiz/summary.php') !== false) {
$PAGE->requires->js_call_amd('local_quiz_autostart/overridefinish', 'init');
}
}