继续 Workstream C 全量字段比对,重点处理“前端 schema 已有 dependsOn、PHP schema 缺失” 的五层不一致问题,并顺手清理残留平台化文案。 本次完成: - global PHP schema:补齐 AI SEO / loading 动画 / 代码高亮相关 dependsOn,避免在总开关关闭时 子字段仍作为平铺配置暴露。 - permissions PHP schema:补齐 login captcha 基础开关的 dependsOn;将“审核和风控”改为“内容审核”, 将“基本权限 / 能力矩阵”改为“基本权限”;同步更新前端 schema 文案。 - users PHP schema:为 sms / report / wechat 三个典型兼容/治理域补齐 master-switch -> sub-config 的 dependsOn(严格贴合 stream-c §7.3),避免这些低优先级能力打断主线配置节奏。 - docs-mode PHP schema:补齐 docs_mode_enabled 下的子字段折叠逻辑,确保兼容域“默认不展开”。 - forum schema:将用户治理文案收紧为用户管理,并把 other section 调整到 forum 聚合末尾。 - payment revenue 前端 schema:去掉“台账”措辞,回到更轻的主题配置文案。 验证: - php -l 通过:global / permissions / users / extensions-docs-mode / forum / forum-basic - node --check 通过:permissions/index.js / payment/revenue.js - 与上一轮已完成的默认值对齐一起,当前 worktree 中 C 线改动已覆盖: default 收敛、level/badge 后移、以及一批高影响 dependsOn/文案修正 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
127 lines
4.7 KiB
PHP
127 lines
4.7 KiB
PHP
<?php
|
|
/**
|
|
* AKSRT_Admin_Schema_Forum schema builder.
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
class AKSRT_Admin_Schema_Forum {
|
|
|
|
public static function build(): array {
|
|
return [
|
|
'domain' => '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(),
|
|
'upload' => AKSRT_Admin_Schema_Forum_Upload::build(),
|
|
'credits' => AKSRT_Admin_Schema_Forum_Credits::build(),
|
|
'other' => AKSRT_Admin_Schema_Forum_Other::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;
|
|
}
|
|
}
|