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

如何在Moodle中通过before_footer钩子实现课程重学提醒通知

Moodle自定义课程重学通知实现方案

步骤1:获取用户需重学的课程数据

在你的函数中添加数据库查询逻辑,筛选出当前登录用户名下启用了重学功能且尚未过期的课程:

function local_custom_message_before_footer() {
    global $DB, $USER;

    // 跳过未登录或访客用户
    if (!isloggedin() || isguestuser()) {
        return;
    }

    // 查询启用重学的课程及用户的完成记录
    $sql = "
        SELECT c.id, c.fullname, cc.timecompleted, crc.recompletiontime
        FROM {course} c
        JOIN {course_completion_criteria} crc ON crc.course = c.id AND crc.criteriatype = :recompletion_type AND crc.enable = 1
        JOIN {course_completion} cc ON cc.course = c.id AND cc.userid = :user_id AND cc.timecompleted IS NOT NULL
    ";
    $params = [
        'recompletion_type' => COMPLETION_CRITERIA_TYPE_RECOMPLETION,
        'user_id' => $USER->id
    ];
    $target_courses = $DB->get_records_sql($sql, $params);

步骤2:计算剩余天数并生成通知

遍历查询结果,计算重学截止时间与当前时间的差值,生成带强调内容的通知:

foreach ($target_courses as $course) {
        // 计算重学截止时间:上次完成时间 + 重学间隔(recompletiontime单位为秒)
        $deadline = $course->timecompleted + $course->recompletiontime;
        $current_time = time();

        // 跳过已过期的课程(可根据需求移除该判断)
        if ($current_time > $deadline) {
            continue;
        }

        // 计算剩余天数
        $remaining_days = ceil(($deadline - $current_time) / DAYSECS);

        // 拼接带强调的通知文本
        $message = "您需要在*{$remaining_days}*天内重学*{$course->fullname}*课程";
        \core\notification::info($message);
    }
}

步骤3:绑定函数到Moodle钩子

在本地插件的db/events.php文件中注册函数,确保它在页面底部渲染前触发:

$observers = [
    [
        'eventname' => '\core\event\before_footer',
        'callback' => 'local_custom_message_before_footer',
    ],
];

注意事项

  • 确保本地插件符合Moodle的目录结构规范
  • 可根据需求将通知类型从info改为warning,提升提醒强度
  • 测试时需验证不同用户权限下的通知显示逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:05:13