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

如何创建Moodle插件,通过REST请求按自定义字段(如Skype)获取用户

如何实现Moodle按自定义字段(如Skype)拉取用户

当然可以通过插件实现这个需求。Moodle自带的core_user_get_user接口的筛选条件确实只支持核心预设的字段(如id、邮箱、用户名等),自定义字段不在默认允许的筛选列表里,所以直接传criteria[0][key]=skype不会生效。

下面提供两种可行的实现方案:

方案一:扩展核心接口的筛选范围

这种方式可以让你继续使用core_user_get_user接口,同时支持自定义字段筛选:

  • 创建一个local类型的插件(比如local_user_custom_criteria)
  • 在插件的lib.php中实现一个扩展函数,用来添加允许的自定义筛选字段:
    function local_user_custom_criteria_extend_allowed_criteria(&$allowedcriteria) {
        // 添加Skype字段到允许的筛选条件列表
        $allowedcriteria[] = 'skype';
        // 如果需要其他自定义字段,继续添加即可
    }
    
  • 通过Moodle的钩子机制,在核心的用户查询逻辑中引入这个扩展。找到核心代码中处理criteria参数的位置(通常在user/lib.php的core_user_get_users函数里),添加调用:
    // 在验证criteria字段前调用扩展函数
    if (function_exists('local_user_custom_criteria_extend_allowed_criteria')) {
        local_user_custom_criteria_extend_allowed_criteria($allowedcriteria);
    }
    
    注意:修改核心代码需要谨慎,建议通过插件的钩子(如before_user_search事件)来实现,避免直接修改核心文件导致升级问题。

方案二:创建自定义REST接口

这种方式更灵活,不需要修改核心代码,直接新增一个专门用于按自定义字段查询的接口:

  1. 创建local插件(比如local_user_by_custom_field)
  2. 在插件的db/services.php中注册新的REST服务:
    $functions = array(
        'local_user_by_custom_field_get_by_skype' => array(
            'classname' => 'local_user_by_custom_field_external',
            'methodname' => 'get_user_by_skype',
            'classpath' => 'local/user_by_custom_field/externallib.php',
            'description' => '根据Skype账号查询用户信息',
            'type' => 'read',
            'capabilities' => 'moodle/user:viewdetails',
            'ajax' => true,
        ),
    );
    
  3. 在插件的externallib.php中实现接口逻辑:
    require_once($CFG->libdir . "/externallib.php");
    
    class local_user_by_custom_field_external extends external_api {
    
        public static function get_user_by_skype_parameters() {
            return new external_function_parameters(
                array(
                    'skype' => new external_value(PARAM_TEXT, '要查询的Skype账号'),
                )
            );
        }
    
        public static function get_user_by_skype($skype) {
            global $DB;
    
            // 验证参数合法性
            $params = self::validate_parameters(self::get_user_by_skype_parameters(), array('skype' => $skype));
    
            // 检查用户权限
            self::validate_context(context_system::instance());
            require_capability('moodle/user:viewdetails', context_system::instance());
    
            // 查询匹配Skype字段的用户
            $user = $DB->get_record('user', array('skype' => $params['skype']), '*', IGNORE_MULTIPLE);
    
            if (!$user) {
                return null;
            }
    
            // 按照Moodle标准格式返回用户数据
            return core_user_external::get_user_from_user_object($user);
        }
    
        public static function get_user_by_skype_returns() {
            return core_user_external::user_details();
        }
    }
    
  4. 安装并启用插件后,就可以通过REST调用这个新接口,示例请求参数:
    wstoken=你的令牌&wsfunction=local_user_by_custom_field_get_by_skype&skype=目标Skype账号
    

如果是自定义用户字段(不是Moodle内置的skype字段,而是通过后台新增的用户自定义字段),需要调整查询逻辑,关联mdl_user_info_field和mdl_user_info_data表来获取匹配数据,核心查询逻辑示例:

// 先获取自定义字段的ID
$field = $DB->get_record('user_info_field', array('shortname' => '你的自定义字段短名'));
if (!$field) {
    return null;
}
// 查询匹配该字段值的用户ID
$userdata = $DB->get_record('user_info_data', array('fieldid' => $field->id, 'data' => $params['fieldvalue']));
if (!$userdata) {
    return null;
}
// 获取用户详情
$user = $DB->get_record('user', array('id' => $userdata->userid));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:20:33