You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle中用户完成测验后自动选课的enroll_user.php代码实现咨询

实现Moodle自动选课的enroll_user.php代码

这个文件用于处理前端确认弹窗后的自动选课请求,核心逻辑是验证用户身份、测验完成状态,调用Moodle内置选课API完成操作,最终返回JSON格式结果给前端。

<?php
// 初始化Moodle环境,需根据文件实际位置调整config.php的路径
require_once(__DIR__ . '/../../config.php');
require_once($CFG->dirroot . '/enrol/manual/lib.php');
require_once($CFG->dirroot . '/mod/quiz/locallib.php');

// 设置响应格式为JSON
header('Content-Type: application/json');

// 仅接受POST请求,防止GET请求滥用
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['success' => false, 'message' => '无效的请求方式']);
    die();
}

// 获取前端传递的必要参数
$userid = required_param('userid', PARAM_INT);
$targetcourseid = required_param('targetcourseid', PARAM_INT);
$quizid = required_param('quizid', PARAM_INT);

// 验证当前请求用户为登录用户,防止越权操作
if ($USER->id != $userid) {
    echo json_encode(['success' => false, 'message' => '无权执行此操作']);
    die();
}

// 验证用户是否已完成指定测验(需和course/view.php中的判断逻辑保持一致)
$quiz = $DB->get_record('quiz', ['id' => $quizid], '*', MUST_EXIST);
$attempts = quiz_get_user_attempts($quizid, $userid, 'all', true);
$quizcompleted = false;

foreach ($attempts as $attempt) {
    if ($attempt->state == quiz_attempt::FINISHED && $attempt->timefinish > 0) {
        $quizcompleted = true;
        break;
    }
}

if (!$quizcompleted) {
    echo json_encode(['success' => false, 'message' => '未完成指定测验,无法选课']);
    die();
}

// 检查目标课程是否存在
$targetcourse = $DB->get_record('course', ['id' => $targetcourseid], '*', IGNORE_MISSING);
if (!$targetcourse) {
    echo json_encode(['success' => false, 'message' => '目标课程不存在']);
    die();
}

// 检查用户是否已选该课程,避免重复操作
$enrolled = is_enrolled(context_course::instance($targetcourseid), $userid, '', true);
if ($enrolled) {
    echo json_encode(['success' => false, 'message' => '您已选此课程']);
    die();
}

// 执行自动选课:使用手动选课插件完成操作
$enrolplugin = enrol_get_plugin('manual');
$instances = $DB->get_records('enrol', ['courseid' => $targetcourseid, 'enrol' => 'manual', 'status' => ENROL_INSTANCE_ENABLED]);

if (empty($instances)) {
    echo json_encode(['success' => false, 'message' => '目标课程未启用手动选课方式']);
    die();
}

// 取第一个可用的手动选课实例
$instance = reset($instances);
try {
    $enrolplugin->enrol_user($instance, $userid, $instance->roleid);
    echo json_encode(['success' => true, 'message' => '选课成功']);
} catch (Exception $e) {
    echo json_encode(['success' => false, 'message' => '选课失败:' . $e->getMessage()]);
}
?>

关键注意事项:

  • 路径调整:require_once(__DIR__ . '/../../config.php')中的路径需根据enroll_user.php的实际存放位置修改,确保能正确加载Moodle全局配置。
  • 测验判断逻辑:示例中用quiz_get_user_attempts判断测验完成状态,必须和你之前在course/view.php中的逻辑完全一致,避免前后判断冲突。
  • 选课方式适配:如果目标课程使用的是自助选课(self)等其他方式,需替换为对应的插件调用代码,比如enrol_get_plugin('self')。
  • 前端配合:前端需通过AJAX POST请求调用该脚本,传递userid、targetcourseid、quizid三个参数,并根据返回的JSON结果提示用户操作状态。

内容的提问来源于stack exchange,提问作者Vishal Varshney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:00:17