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
相关产品推荐
相关产品推荐

