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

Yii2中Select2组件同一员工属多办事处时重复显示如何解决?

解决方案

出现重复选项的原因是:Select2的分组(optgroup)特性允许不同分组下存在相同value的option,你的原始数据源中同一个员工ID出现在多个办事处分组下,因此会被重复渲染。
推荐优先通过后端处理数据源实现去重,方案如下:

方案1:保留分组展示,每个员工仅在第一个所属分组下显示

// 处理原始分组数据,去重员工
$groupedStaffs = Tasks::getAllStaffsGroupOffice();
$uniqueGroupedStaffs = [];
$existStaffIds = [];

foreach ($groupedStaffs as $officeName => $staffList) {
    foreach ($staffList as $staffId => $staffName) {
        // 已出现过的员工直接跳过
        if (isset($existStaffIds[$staffId])) {
            continue;
        }
        $uniqueGroupedStaffs[$officeName][$staffId] = $staffName;
        $existStaffIds[$staffId] = true;
    }
}

// 替换Select2配置中的data参数为处理后的数组
return $this->form->field($this->model, 'observers')
    ->widget(Select2::className(),
        [
            'data' => $uniqueGroupedStaffs, // 替换为处理后的去重数据
            'disabled' => !$this->can['changeObservers'],
            'options' => [
                'multiple' => true,
                'value' => ArrayHelper::map($this->model->observers, 'staff_id', 'staff_id'),
                'placeholder' => Yii::t('tasks_forms', 'FORM_PLACEHOLDER_CHOOSE'),
                'class' => 'hiddenInput'
            ],
            'pluginOptions' => [
                'allowClear' => true,
                'closeOnSelect'=> false,
            ],
            'pluginLoading' => false,
        ]);

方案2:展示员工所有所属办事处,取消分组展示

如果需要让用户直观看到员工所属的所有办事处,可以把所有员工去重后生成一维数组,名称拼接所属办事处信息:

$groupedStaffs = Tasks::getAllStaffsGroupOffice();
$staffInfo = [];

// 收集每个员工的所有所属办事处
foreach ($groupedStaffs as $office => $staffs) {
    foreach ($staffs as $staffId => $staffName) {
        if (!isset($staffInfo[$staffId])) {
            $staffInfo[$staffId] = [
                'name' => $staffName,
                'offices' => []
            ];
        }
        $staffInfo[$staffId]['offices'][] = $office;
    }
}

// 生成最终的一维数据源
$uniqueStaffList = [];
foreach ($staffInfo as $staffId => $info) {
    $uniqueStaffList[$staffId] = sprintf('%s(所属办事处:%s)', $info['name'], implode('、', $info['offices']));
}

之后把Select2的data参数替换为$uniqueStaffList即可。

注:不推荐通过前端JS去重,后端处理数据源更稳妥,可避免重复值提交导致的逻辑异常,也不需要额外适配Select2的前端配置。

内容的提问来源于stack exchange,提问作者Dima Sidorenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:03