HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
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');
    }
}