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

如何在Moodle本地插件中实现带自动补全的多用户选择设置?

解决Moodle本地插件带自动补全的多用户选择问题

Moodle核心确实没有现成的admin_setting_configmulti_select_autocomplete组件,不过可以通过两种实用方式实现需求:

方式一:文本框配合Moodle自动补全JS组件

无需自定义设置类,直接利用核心core_form/autocomplete AMD模块实现多选自动补全:

  1. 定义设置项:在插件的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
));
  1. 初始化自动补全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类

如果希望保留下拉选择的形式,同时加入自动补全功能,可以自定义继承类:

  1. 创建自定义设置类:在插件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;
    }
}
  1. 在设置中使用自定义类:
// 加载自定义类文件
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 -

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:55:35