Files
wordpress-theme-aksrt/inc/classes/admin/schema/class-aksrt-admin-schema-forum.php
T
kate522andClaude Fable 5 a230e6a34b Schema 收口第二轮:补齐 PHP 依赖契约并继续收敛文案
继续 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>
2026-07-06 19:41:28 +08:00

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;
}
}