首先,通过打印 ```php echo $lang['usergroups_member']; echo '<br />'; echo $lang['usergroups_special']; echo '<br />'; echo $lang['usergroups_specialadmin']; echo '<br />'; echo $lang['usergroups_system']; ``` 我们可以获取到4种类型的名称。分别对应的是:会员用户组、自定义用户组、自定义管理组、系统用户组。 而在表 pre_common_usergroup 中,仅提供了三种类型。也就是说,自定义用户组、自定义管理组,同时都使用的是字段 type 的 special 这个值。区分它们的关系是用到的是字段 radminid。 如果 radminid=0,表示为自定义用户组。radminid>0,表示为自定义管理组。 逻辑通了。查询如下: table/table_config.php ```php class table_config extends discuz_table { public function Admin_Groups(){ return DB::fetch_all("SELECT * FROM ".DB::table('common_usergroup')." WHERE groupid NOT IN (5, 6, 7, 8, 9)"); } } ``` ```php $Admin_Groups = C::t('#yulun_test#config')->Admin_Groups(); $groups = []; foreach($Admin_Groups as $key=>$group){ $group['type'] = $group['type'] == 'special' && $group['radminid'] ? 'specialadmin' : $group['type']; $groups[] = $group; } function array_group_by($arr, $key){ $grouped = []; foreach ($arr as $value) { $grouped[$value[$key]][] = $value; } if (func_num_args() > 2) { $args = func_get_args(); foreach ($grouped as $key => $value) { $parms = array_merge([$value], array_slice($args, 2, func_num_args())); $grouped[$key] = call_user_func_array('array_group_by', $parms); } } return $grouped; } $groups = array_group_by($groups, 'type'); ``` **插件使用** ```php $Admin_Setting_Groups = ''; foreach($groups as $key=>$optgroup){ $Admin_Setting_Groups .= '<optgroup label="'.$lang['usergroups_'.$key].'">'; foreach($optgroup as $option){ $Admin_Setting_Groups .= '<option value="'.$option['groupid'].'">'.$option['grouptitle'].'</option>'; } $Admin_Setting_Groups .= '</optgroup>'; } ``` ```php showsetting(标题, '', '', '<select name="Groups[]" multiple="multiple" size="10">'.$Admin_Setting_Groups.'</select>', '', '', ''); ``` **模板使用** ```html <select name="groupid[]" multiple="multiple" size="10"> <!--{loop $groups $catname $cats}--> <optgroup label="{$catname}"> <!--{loop $cats $group}--> <option value="{$group['groupid']}">{$group['grouptitle']}</option> <!--{/loop}--> </optgroup> <!--{/loop}--> </select> ```