如何在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
相关产品推荐
相关产品推荐

