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

如何在Moodle课程中通过JavaScript获取用户组信息并保障代码持久化?

在Moodle中通过JavaScript获取用户组信息并兼容版本升级

一、获取用户组信息并传递给JavaScript

要让JS拿到用户的课程分组,核心是用Moodle的PHP API获取数据,再安全传递到前端:

  1. 获取基础数据:利用Moodle全局变量$COURSE->id(当前课程ID)和$USER->id(当前用户ID)。
  2. 调用分组API:使用groups_get_user_groups($courseid, $userid)获取用户在当前课程的所有分组ID,再通过groups_get_group($groupid)拿到分组名称等详细信息。
  3. 传递数据到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:24