如何创建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接口
这种方式更灵活,不需要修改核心代码,直接新增一个专门用于按自定义字段查询的接口:
- 创建local插件(比如
local_user_by_custom_field) - 在插件的
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, ), ); - 在插件的
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(); } } - 安装并启用插件后,就可以通过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
相关产品推荐
相关产品推荐

