如何在Moodle中学员完成教程后运行指定代码
实现Moodle教程完成时触发代码执行的方案
方案1:利用Moodle事件监听器(推荐)
Moodle内置事件触发系统,学员完成教程(如课程/活动标记完成)时会触发对应事件,可通过自定义插件监听并执行代码。
创建本地自定义插件
- 在Moodle服务器的
local/目录下新建插件目录,例如local/completiontrigger - 核心文件结构:
version.php:必填的插件版本配置文件db/events.php:注册要监听的事件classes/event_observer.php:编写事件处理逻辑
- 在Moodle服务器的
注册事件监听器
在db/events.php中添加监听规则,比如监听课程完成事件\core\event\course_completed:$observers = [ [ 'eventname' => '\core\event\course_completed', 'callback' => '\local_completiontrigger\event_observer::handle_completion', 'internal' => false, ], ];编写事件处理代码
在classes/event_observer.php中实现处理函数,写入你要运行的逻辑:namespace local_completiontrigger; class event_observer { public static function handle_completion(\core\event\base $event) { // 获取完成教程的学员与课程信息 $user_id = $event->userid; $course_id = $event->courseid; // 这里放入你要执行的代码 // 示例:记录完成日志 error_log("学员ID {$user_id} 已完成课程ID {$course_id} 的教程"); } }安装启用插件
- 将插件目录上传至Moodle的
local/目录 - 登录Moodle后台,进入「站点管理 → 插件 → 插件安装」,系统会自动检测并完成安装
- 将插件目录上传至Moodle的
方案2:Web服务联动(适合外部系统执行代码)
如果代码需要在外部系统运行,可通过Moodle Web服务触发:
启用Web服务
- 进入Moodle后台「站点管理 → 高级功能」,开启「Web services」
- 在「站点管理 → 插件 → Web服务 → 协议」中启用
REST协议 - 创建Web服务专用用户,分配查看课程完成状态的权限
设置触发逻辑
- 开启课程/活动的完成跟踪功能,配置完成条件
- 编写外部定时脚本,调用Moodle的Web服务API(如
core_completion_get_course_completion_status)定期检查学员完成状态,检测到完成时执行目标代码
方案3:自定义定时脚本(快速临时需求)
若无需长期维护,可编写自定义脚本配合数据库查询实现:
编写PHP脚本
在Moodle的admin/目录下新建脚本(如run_on_completion.php),需引入Moodle初始化文件:require_once(__DIR__ . '/../config.php'); // 查询最近1小时内完成教程的学员 $sql = "SELECT u.id AS userid, c.id AS courseid FROM {course_completions} cc JOIN {user} u ON cc.userid = u.id JOIN {course} c ON cc.course = c.id WHERE cc.timecompleted > UNIX_TIMESTAMP() - 3600"; $results = $DB->get_records_sql($sql); foreach ($results as $item) { // 执行你的代码逻辑 error_log("学员 {$item->userid} 完成了课程 {$item->courseid}"); }配置定时任务
通过服务器cron定期执行脚本,比如每小时运行一次:0 * * * * php /path/to/moodle/admin/run_on_completion.php
注意事项
- 开发插件需遵循Moodle编码规范,确保版本兼容性
- 所有操作需严格控制权限,避免安全风险
- 先在测试环境验证逻辑,再部署至生产环境
内容的提问来源于stack exchange,提问作者Serkan Gün
相关产品推荐
相关产品推荐

