fix(admin): replicate reference front-submit settings page 1:1

- Rewrite post_list/submit schema (PHP + JS) with the reference theme's
  field set, order, defaults and dependencies; topics fields excluded
- Map PostDisplay::get_submit_settings() and the FrontSubmit runtime to
  the new keys without legacy fallback
- Guest submission follows the capability matrix; category required on
  submit; pay limits read from the cash/points fieldset
- Drop dead front_submit_* settings, template branches and JS config
- Add submit settings reference contract test
This commit is contained in:
2026-09-24 12:29:19 +08:00
parent ed71314986
commit 264f2c51b2
14 changed files with 354 additions and 292 deletions
+21 -43
View File
@@ -297,65 +297,43 @@ class PostDisplay {
public static function get_submit_settings(): array {
$settings = Settings::get_all();
$money_setting = static function ($value, string $default): string {
if (!is_string($value)) {
return $default;
}
try {
return \AKSRT\Ledger\AssetAmount::balance($value)->decimal();
} catch (\InvalidArgumentException $e) {
return $default;
}
};
$title_min = max(1, min(100, (int) ($settings['post_article_title_strlen_limit_min'] ?? 5)));
$title_max = max(5, min(200, (int) ($settings['post_article_title_strlen_limit_max'] ?? 30)));
$title_limit = is_array($settings['post_article_title_strlen_limit'] ?? null)
? $settings['post_article_title_strlen_limit']
: [];
$title_min = max(1, min(100, (int) ($title_limit['min'] ?? 5)));
$title_max = max(5, min(200, (int) ($title_limit['max'] ?? 30)));
if ($title_max < $title_min) {
$title_max = $title_min;
}
$review_mode = sanitize_key((string) ($settings['front_submit_review_mode'] ?? 'pending'));
if (!in_array($review_mode, ['pending', 'publish', 'draft'], true)) {
$review_mode = 'pending';
}
$editor_mode = sanitize_key((string) ($settings['front_submit_editor_mode'] ?? 'rich'));
if (!in_array($editor_mode, ['rich', 'markdown', 'plain'], true)) {
$editor_mode = 'rich';
}
// 付费金额限制:现金/积分各自独立,0 表示不限制。
$pay_price_limit = is_array($settings['post_article_pay_price_limit'] ?? null)
? $settings['post_article_pay_price_limit']
: [];
$cash_limit = is_array($pay_price_limit['price'] ?? null) ? $pay_price_limit['price'] : [];
$points_limit = is_array($pay_price_limit['points'] ?? null) ? $pay_price_limit['points'] : [];
return [
'enabled' => !isset($settings['front_submit_enabled']) || !empty($settings['front_submit_enabled']),
'enabled' => !isset($settings['post_article_s']) || !empty($settings['post_article_s']),
'btn_text' => sanitize_text_field((string) ($settings['post_article_btn_txte'] ?? '')) ?: __('发布文章', 'aksrt'),
'title_min' => $title_min,
'title_max' => $title_max,
'title_placeholder' => sanitize_text_field((string) ($settings['post_t_placeholder'] ?? '')) ?: __('请输入标题', 'aksrt'),
'content_placeholder' => sanitize_textarea_field((string) ($settings['post_c_placeholder'] ?? '')) ?: __('请输入内容', 'aksrt'),
'allowed_cat_ids' => is_array($settings['post_article_cat'] ?? null) ? array_values(array_filter(array_map('intval', $settings['post_article_cat']))) : [],
'default_user_id' => max(0, (int) ($settings['post_article_user'] ?? 0)),
'guest_enabled' => !empty($settings['front_submit_guest_enabled']),
'allow_title' => !isset($settings['front_submit_title']) || !empty($settings['front_submit_title']),
'allow_content' => !isset($settings['front_submit_content']) || !empty($settings['front_submit_content']),
'allow_excerpt' => !isset($settings['front_submit_excerpt']) || !empty($settings['front_submit_excerpt']),
'allow_cover' => !isset($settings['front_submit_cover']) || !empty($settings['front_submit_cover']),
'allow_category' => !isset($settings['front_submit_category']) || !empty($settings['front_submit_category']),
'allow_tags' => !isset($settings['front_submit_tags']) || !empty($settings['front_submit_tags']),
'tags_s' => !isset($settings['front_submit_tags']) || !empty($settings['front_submit_tags']),
'cover_required' => !empty($settings['front_submit_cover_required']),
'max_images' => max(0, min(50, (int) ($settings['front_submit_max_images'] ?? 5))),
'review_mode' => $review_mode,
'editor_mode' => $editor_mode,
'draft_save' => !isset($settings['front_submit_draft_save']) || !empty($settings['front_submit_draft_save']),
'leave_warning' => !isset($settings['front_submit_leave_warning']) || !empty($settings['front_submit_leave_warning']),
'default_user_id' => max(0, (int) ($settings['post_article_user'] ?? 1)),
'allow_tags' => !isset($settings['post_article_tag']) || !empty($settings['post_article_tag']),
'custom_filter_s' => !isset($settings['post_article_custom_filter_s']) || !empty($settings['post_article_custom_filter_s']),
'pay_free_s' => !isset($settings['post_article_pay_free_s']) || !empty($settings['post_article_pay_free_s']),
'pay_price_min' => $money_setting($settings['post_article_pay_price_min'] ?? '0.00', '0.00'),
'pay_price_max' => $money_setting($settings['post_article_pay_price_max'] ?? '100.00', '100.00'),
'pay_price_min' => max(0, (int) ($cash_limit['min'] ?? 0)),
'pay_price_max' => max(0, (int) ($cash_limit['max'] ?? 0)),
'pay_points_min' => max(0, (int) ($points_limit['min'] ?? 0)),
'pay_points_max' => max(0, (int) ($points_limit['max'] ?? 0)),
'pay_vip_price_s' => !isset($settings['post_article_pay_vip_price_s']) || !empty($settings['post_article_pay_vip_price_s']),
'pay_vip_1_enabled' => !empty($settings['pay_user_vip_1_s']),
'pay_vip_2_enabled' => !empty($settings['pay_user_vip_2_s']),
'pay_vip_1_discount' => max(0, min(100, (int) ($settings['post_article_pay_vip_1_discount'] ?? 80))),
'pay_vip_2_discount' => max(0, min(100, (int) ($settings['post_article_pay_vip_2_discount'] ?? 50))),
'custom_filter_s' => !isset($settings['post_article_custom_filter_s']) || !empty($settings['post_article_custom_filter_s']),
'pay_vip_1_discount' => max(0, min(100, (int) ($settings['post_article_pay_vip_1_discount'] ?? 100))),
'pay_vip_2_discount' => max(0, min(100, (int) ($settings['post_article_pay_vip_2_discount'] ?? 100))),
];
}