Files
wordpress-theme-aksrt/inc/classes/admin/schema/class-aksrt-admin-schema-forum.php
T

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(),
'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;
}
}