如何在Moodle课程中通过JavaScript获取用户组信息并保障代码持久化?
在Moodle中通过JavaScript获取用户组信息并兼容版本升级
一、获取用户组信息并传递给JavaScript
要让JS拿到用户的课程分组,核心是用Moodle的PHP API获取数据,再安全传递到前端:
- 获取基础数据:利用Moodle全局变量
$COURSE->id(当前课程ID)和$USER->id(当前用户ID)。 - 调用分组API:使用
groups_get_user_groups($courseid, $userid)获取用户在当前课程的所有分组ID,再通过groups_get_group($groupid)拿到分组名称等详细信息。 - 传递数据到JS:用Moodle官方推荐的
$PAGE->requires->data_for_js()方法,将数据注入到前端,避免全局变量污染。
示例PHP代码:
global $COURSE, $USER, $PAGE; // 仅在课程页面执行 if ($PAGE->context->contextlevel !== CONTEXT_COURSE) { return; } $courseid = $COURSE->id; $userid = $USER->id; $userGroupIds = groups_get_user_groups($courseid, $userid); $userGroups = []; if (!empty($userGroupIds)) { foreach ($userGroupIds[0] as $groupId) { // 取第一个分组集合(Moodle用户可属于多组) $group = groups_get_group($groupId); $userGroups[] = [ 'id' => $groupId, 'name' => $group->name ]; } } // 传递数据到前端JS $PAGE->requires->data_for_js('currentUserGroups', $userGroups, true);
前端JS调用示例:
// 获取用户分组数据 const userGroups = M.cfg.currentUserGroups; // 示例:根据分组显示对应内容 if (userGroups.some(group => group.name === '中国')) { document.getElementById('china-map').style.display = 'block'; } else if (userGroups.some(group => group.name === '美国')) { document.getElementById('usa-map').style.display = 'block'; }
二、代码放置:避免Moodle升级丢失
绝对不要修改Moodle核心文件(升级会被覆盖),推荐两种安全方案:
方案1:创建本地插件(推荐,全局生效)
做一个极简的本地插件(比如local_usergroups),只需3个文件:
local/usergroups/version.php:插件版本配置local/usergroups/hooks.php:绑定Moodle的before_footer钩子,在页面加载时注入代码local/usergroups/lang/en/local_usergroups.php:语言文件(可选,用于插件名称)
hooks.php核心代码参考上面的PHP示例,这样插件会被Moodle识别,升级时不会被删除,所有课程自动生效。
方案2:课程HTML块(单课程临时方案)
如果仅单个课程需要,可在课程中添加HTML块,切换到源代码模式插入PHP代码(需先在站点设置开启「允许HTML块执行PHP」,注意安全风险)。这种方式无需插件,但每个课程都要单独配置。
三、是否需要创建插件?
- 多课程使用:必须创建本地插件,一次配置全局生效,完全兼容版本升级。
- 单课程临时使用:HTML块加PHP代码即可,但灵活性和可维护性不如插件。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

