如何在Moodle本地插件中实现带自动补全的多用户选择设置?
解决Moodle本地插件带自动补全的多用户选择问题
Moodle核心确实没有现成的admin_setting_configmulti_select_autocomplete组件,不过可以通过两种实用方式实现需求:
方式一:文本框配合Moodle自动补全JS组件
无需自定义设置类,直接利用核心core_form/autocomplete AMD模块实现多选自动补全:
- 定义设置项:在插件的
settings.php中添加文本类型设置,用于存储用户ID的逗号分隔字符串:
$settings->add(new admin_setting_configtext( 'local_yourplugin/allowed_users', get_string('allowed_users', 'local_yourplugin'), get_string('allowed_users_desc', 'local_yourplugin'), '', // 默认值为空 PARAM_TEXT ));
- 初始化自动补全JS:在同一文件中添加AMD调用,将文本框转换为带自动补全的多选控件:
// 加载自动补全资源并初始化 $PAGE->requires->js_call_amd('core_form/autocomplete', 'init', [ '#id_local_yourplugin_allowed_users', // 文本框DOM ID,由Moodle自动生成 [ 'multiple' => true, // 开启多选模式 'ajax' => [ 'url' => $CFG->wwwroot . '/user/ajax.php', // 核心用户搜索API端点 'data' => function(term) { return [ 'search' => term, 'perpage' => 15, // 单次返回结果数量 'excludeid' => 0, 'includeseniorusers' => true, 'moodlewsrestformat' => 'json' ]; }, 'processResults' => function(data) { $options = []; foreach ($data as $user) { $options[] = [ 'value' => $user->id, 'label' => fullname($user) . ' (' . $user->username . ')' ]; } return ['results' => $options]; } ], 'placeholder' => get_string('search_users', 'local_yourplugin'), 'minimumInputLength' => 2 // 输入至少2个字符触发搜索 ] ]);
方式二:自定义admin_setting类
如果希望保留下拉选择的形式,同时加入自动补全功能,可以自定义继承类:
- 创建自定义设置类:在插件
classes/setting目录下新建configmulti_select_autocomplete.php:
<?php defined('MOODLE_INTERNAL') || die(); class admin_setting_configmulti_select_autocomplete extends admin_setting_configmulti_select { public function output_html($data, $query = '') { $html = parent::output_html($data, $query); // 初始化自动补全组件 global $PAGE; $PAGE->requires->js_call_amd('core_form/autocomplete', 'init', [ '#' . $this->get_id(), [ 'multiple' => true, 'ajax' => [ 'url' => $CFG->wwwroot . '/user/ajax.php', 'data' => function(term) { return [ 'search' => term, 'perpage' => 10, 'moodlewsrestformat' => 'json' ]; }, 'processResults' => function(data) { $options = []; foreach ($data as $user) { $options[] = [ 'value' => $user->id, 'label' => fullname($user) . ' (' . $user->username . ')' ]; } return ['results' => $options]; } ] ] ]); return $html; } }
- 在设置中使用自定义类:
// 加载自定义类文件 require_once($CFG->dirroot . '/local/yourplugin/classes/setting/configmulti_select_autocomplete.php'); // 预加载少量用户(自动补全会动态覆盖,也可留空) $users = get_users(['limit' => 50]); $useroptions = []; foreach ($users as $user) { $useroptions[$user->id] = fullname($user) . ' (' . $user->username . ')'; } $settings->add(new admin_setting_configmulti_select_autocomplete( 'local_yourplugin/allowed_users', get_string('allowed_users', 'local_yourplugin'), get_string('allowed_users_desc', 'local_yourplugin'), [], // 默认选中的用户ID数组 $useroptions ));
注意事项
- 读取设置时,需用
explode(',', get_config('local_yourplugin', 'allowed_users'))将存储的字符串转为ID数组。 - 确保操作用户拥有
moodle/user:viewdetails权限,否则无法调用用户搜索API。 - 可修改AJAX参数添加过滤条件,比如
'onlyactive' => true仅搜索活跃用户。
内容的提问来源于stack exchange,提问作者Rohit -
相关产品推荐
相关产品推荐

