'forum', 'title' => '社区&论坛', 'sections' => [ 'basic' => AKSRT_Admin_Schema_Forum_Basic::build(), 'names' => AKSRT_Admin_Schema_Forum_Names::build(), 'homepage' => AKSRT_Admin_Schema_Forum_Homepage::build(), 'board_page' => AKSRT_Admin_Schema_Forum_Board_Page::build(), 'post_page' => AKSRT_Admin_Schema_Forum_Post_Page::build(), 'reply' => AKSRT_Admin_Schema_Forum_Reply::build(), 'permissions' => AKSRT_Admin_Schema_Forum_Permissions::build(), 'other' => AKSRT_Admin_Schema_Forum_Other::build(), 'upload' => AKSRT_Admin_Schema_Forum_Upload::build(), 'credits' => AKSRT_Admin_Schema_Forum_Credits::build(), ], ]; } // ================================================================ // §8.1 Capability matrix schema builder // ================================================================ /** * Build groups for the capabilities section from cap_definitions(). * * Each capability becomes a group with role columns as fields. * Grouped by prefix: user_, new_post_, comment_. */ private static function build_cap_matrix_groups(): array { if (!class_exists('AKSRT_Settings')) { return []; } $defs = AKSRT_Settings::cap_definitions(); $cols = AKSRT_Settings::cap_role_columns(); $col_labels = [ 'all' => __('所有人', 'aksrt'), 'logged' => __('已登录', 'aksrt'), 'level' => __('等级≥', 'aksrt'), 'vip' => __('VIP≥', 'aksrt'), 'auth' => __('已认证', 'aksrt'), 'moderator' => __('版主', 'aksrt'), 'plate_author' => __('超级版主', 'aksrt'), 'cat_moderator' => __('分区版主', 'aksrt'), ]; // Group caps by prefix $buckets = [ 'user' => ['title' => __('用户治理', 'aksrt'), 'caps' => []], 'post' => ['title' => __('投稿权限', 'aksrt'), 'caps' => []], 'comment' => ['title' => __('评论权限', 'aksrt'), 'caps' => []], ]; foreach ($defs as $cap_id => $def) { if (str_starts_with($cap_id, 'comment_')) { $buckets['comment']['caps'][$cap_id] = $def; } elseif (str_starts_with($cap_id, 'new_post_')) { $buckets['post']['caps'][$cap_id] = $def; } else { $buckets['user']['caps'][$cap_id] = $def; } } $groups = []; foreach ($buckets as $bucket_key => $bucket) { if (empty($bucket['caps'])) continue; $fields = []; foreach ($bucket['caps'] as $cap_id => $def) { $excludes = $def['exclude_roles'] ?? []; $only_roles = $def['roles'] ?? null; $defaults = $def['default'] ?? []; // Each cap gets one field per role column foreach ($cols as $col) { if (in_array($col, $excludes, true)) continue; if ($only_roles !== null && !in_array($col, $only_roles, true) && !in_array($col, ['all', 'logged', 'level', 'vip', 'auth'], true)) { continue; } $field_key = 'user_caps.' . $cap_id . '.' . $col; $is_spinner = in_array($col, ['level', 'vip'], true); $field = [ 'key' => $field_key, 'label' => $def['label'] . ' — ' . ($col_labels[$col] ?? $col), 'type' => $is_spinner ? 'number' : 'switch', 'default' => $defaults[$col] ?? ($is_spinner ? -1 : false), 'cap_id' => $cap_id, 'cap_col' => $col, ]; if ($is_spinner) { $field['min'] = -1; $field['max'] = $col === 'level' ? 10 : 2; $field['help'] = __('-1 = 不限', 'aksrt'); } $fields[] = $field; } } $groups[] = [ 'key' => 'cap_' . $bucket_key, 'title' => $bucket['title'], 'fields' => $fields, ]; } return $groups; } }