feat(widgets): plate moderator apply modal + JS submit
Replace bare apply link with modal form posting to forum moderator REST; empty/admin states and modal CSS.
This commit is contained in:
@@ -22,6 +22,70 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build apply entry HTML (modal form).
|
||||
*/
|
||||
public static function render_apply_html(int $plate_id, bool $show_apply = true): string {
|
||||
if (!$show_apply || $plate_id <= 0) {
|
||||
return '';
|
||||
}
|
||||
$forum = class_exists('\AKSRT\Forum\Forum') ? \AKSRT\Forum\Forum::get_instance() : null;
|
||||
$cuid = get_current_user_id();
|
||||
$show_always = true;
|
||||
if (function_exists('aksrt_get_setting')) {
|
||||
$show_always = (bool) aksrt_get_setting('bbs_show_apply_moderator', true);
|
||||
}
|
||||
$can_apply = $cuid > 0 && $forum && method_exists($forum, 'forum_user_can')
|
||||
? $forum->forum_user_can($cuid, 'moderator_apply')
|
||||
: ($cuid > 0);
|
||||
if (!$show_always && !$can_apply) {
|
||||
return '';
|
||||
}
|
||||
$is_mod = false;
|
||||
if ($cuid > 0 && $forum && method_exists($forum, 'is_board_moderator')) {
|
||||
$is_mod = $forum->is_board_moderator($cuid, $plate_id);
|
||||
}
|
||||
if ($is_mod || ($cuid > 0 && user_can($cuid, 'manage_options'))) {
|
||||
return '';
|
||||
}
|
||||
if ($cuid <= 0) {
|
||||
$login = function_exists('aksrt_get_login_url') ? aksrt_get_login_url(get_permalink($plate_id)) : wp_login_url(get_permalink($plate_id));
|
||||
return '<a class="but hollow c-blue p2-10 em09" href="' . esc_url($login) . '">' . esc_html__('登录后申请版主', 'aksrt') . '</a>';
|
||||
}
|
||||
$pending = false;
|
||||
if ($forum && method_exists($forum, 'get_board_moderator_applications')) {
|
||||
foreach ((array) $forum->get_board_moderator_applications($plate_id) as $app) {
|
||||
if ((int) ($app['user_id'] ?? 0) === $cuid && (string) ($app['status'] ?? '') === 'pending') {
|
||||
$pending = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($pending) {
|
||||
return '<span class="badg c-yellow hollow em09">' . esc_html__('申请审核中', 'aksrt') . '</span>';
|
||||
}
|
||||
$uid = 'aksrt-mod-apply-' . $plate_id . '-' . wp_rand(1000, 9999);
|
||||
$desc = function_exists('aksrt_get_setting') ? (string) aksrt_get_setting('bbs_apply_moderator_desc', '') : '';
|
||||
if ($desc === '') {
|
||||
$desc = __('欢迎有热情的用户申请成为版主,协助管理社区秩序。', 'aksrt');
|
||||
}
|
||||
obs_start();
|
||||
echo '<button type="button" class="but hollow c-blue p2-10 em09" data-aksrt-mod-apply-open="' . esc_attr((string) $uid) . '">' . esc_html__('申请版主', 'aksrt') . '</button>';
|
||||
echo '<div class="aksrt-mod-apply-modal" id="' . esc_attr((string) $uid) . '" hidden>';
|
||||
echo '<div class="aksrt-mod-apply-modal__backdrop" data-aksrt-mod-apply-close></div>';
|
||||
echo '<div class="aksrt-mod-apply-modal__dialog zib-widget" role="dialog" aria-modal="true">';
|
||||
echo '<div class="flex jsb ac mb10"><div class="title-theme">' . esc_html__('申请版主', 'aksrt') . '</div>';
|
||||
echo '<button type="button" class="but hollow p2-10 em09" data-aksrt-mod-apply-close aria-label="' . esc_attr__('关闭', 'aksrt') . '">×</button></div>';
|
||||
echo '<div class="muted-2-color em09 mb10">' . esc_html($desc) . '</div>';
|
||||
echo '<form class="js-aksrt-moderator-apply-form" data-board-id="' . esc_attr((string) $plate_id) . '">';
|
||||
echo '<label class="mb6 block">' . esc_html__('申请理由', 'aksrt') . '</label>';
|
||||
echo '<textarea name="reason" rows="4" class="mb10" required placeholder="' . esc_attr__('请简要说明你的社区经验、擅长领域或管理计划。', 'aksrt') . '"></textarea>';
|
||||
echo '<div class="js-aksrt-action-feedback mb10" aria-live="polite"></div>';
|
||||
echo '<button type="submit" class="but c-blue padding-lg btn-block">' . esc_html__('提交版主申请', 'aksrt') . '</button>';
|
||||
echo '</form></div></div>';
|
||||
return (string) ob_get_clean();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{html:string}
|
||||
*/
|
||||
@@ -62,10 +126,6 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
}
|
||||
$people[] = ['id' => $mid, 'role' => 'moderator'];
|
||||
}
|
||||
if (!$people) {
|
||||
return ['html' => ''];
|
||||
}
|
||||
|
||||
$title_text = (string) ($instance['title_text'] ?? __('版主', 'aksrt'));
|
||||
$show_avatar = !isset($instance['show_avatar']) || !empty($instance['show_avatar']);
|
||||
$style = sanitize_key((string) ($instance['style'] ?? 'list'));
|
||||
@@ -73,31 +133,30 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
$style = 'list';
|
||||
}
|
||||
|
||||
$show_apply = !isset($instance['apply_btn']) || !empty($instance['apply_btn']);
|
||||
$apply_html = '';
|
||||
if ($show_apply && is_user_logged_in()) {
|
||||
$forum = class_exists('\AKSRT\Forum\Forum') ? \AKSRT\Forum\Forum::get_instance() : null;
|
||||
$cuid = get_current_user_id();
|
||||
$can_apply = $forum && method_exists($forum, 'forum_user_can')
|
||||
? $forum->forum_user_can($cuid, 'moderator_apply')
|
||||
: true;
|
||||
$is_mod = $forum && method_exists($forum, 'is_board_moderator')
|
||||
? $forum->is_board_moderator($cuid, $id)
|
||||
: in_array($cuid, array_merge([$author_id], $mods, $super), true);
|
||||
if ($can_apply && !$is_mod) {
|
||||
$apply_url = add_query_arg(['aksrt_apply_moderator' => 1, 'plate' => $id], get_permalink($id));
|
||||
$apply_html = '<a class="but hollow c-blue p2-10 em09" href="' . esc_url($apply_url) . '">' . esc_html__('申请版主', 'aksrt') . '</a>';
|
||||
$show_apply = !isset($instance['apply_btn']) || !empty($instance['apply_btn']);
|
||||
$apply_html = self::render_apply_html($id, $show_apply);
|
||||
|
||||
if (!$people && $apply_html === '') {
|
||||
if (current_user_can('manage_options')) {
|
||||
return [
|
||||
'html' => function_exists('aksrt_get_widget_null')
|
||||
? aksrt_get_widget_null(__('当前版块暂无版主', 'aksrt'))
|
||||
: '<p class="widget-empty">' . esc_html__('当前版块暂无版主', 'aksrt') . '</p>',
|
||||
];
|
||||
}
|
||||
return ['html' => ''];
|
||||
}
|
||||
ob_start();
|
||||
echo '<div class="zib-widget moderator-box aksrt-plate-mods style-' . esc_attr($style) . ' ajax-item">';
|
||||
|
||||
obs_start();
|
||||
echo '<div class="zib-widget moderator-box aksrt-plate-mods style-' . esc_attr($style) . ' ajax-item" data-aksrt-plate-mods="1">';
|
||||
if ($title_text !== '' || $apply_html !== '') {
|
||||
echo '<div class="mb10 flex jsb ac aksrt-plate-mods__head">';
|
||||
echo $title_text !== '' ? '<div class="title-theme">' . esc_html($title_text) . '</div>' : '<div></div>';
|
||||
echo $apply_html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||
echo '</div>';
|
||||
}
|
||||
echo '<div class="aksrt-plate-mods__list">';
|
||||
if ($people) {
|
||||
echo '<div class="aksrt-plate-mods__list">';
|
||||
foreach ($people as $row) {
|
||||
$uid = (int) $row['id'];
|
||||
if (function_exists('aksrt_render_moderator_row')) {
|
||||
@@ -121,14 +180,18 @@ class WidgetForumPlateModerator extends \WP_Widget {
|
||||
}
|
||||
echo '<a class="aksrt-plate-mods__item role-' . esc_attr($row['role']) . '" href="' . esc_url($home) . '">';
|
||||
if ($show_avatar) {
|
||||
echo '<img src="' . esc_url($avatar) . '" alt="" class="aksrt-plate-mods__avatar" loading="lazy" width="40" height="40" />';
|
||||
echo '<img class="aksrt-plate-mods__avatar aksrt-lazy lazyload" data-src="' . esc_url($avatar) . '" src="' . esc_url(get_template_directory_uri() . '/assets/img/placeholder.svg') . '" alt="" loading="lazy" width="40" height="40" />';
|
||||
}
|
||||
echo '<span class="aksrt-plate-mods__name">' . esc_html($user->display_name) . '</span>';
|
||||
echo '<span class="aksrt-plate-mods__role">' . esc_html($role_label) . '</span>';
|
||||
echo '</a>';
|
||||
}
|
||||
echo '</div></div>';
|
||||
return ['html' => (string) ob_get_clean()];
|
||||
echo '</div>';
|
||||
} else {
|
||||
echo '<div class="muted-2-color em09 mb10">' . esc_html__('暂无版主,欢迎申请加入管理。', 'aksrt') . '</div>';
|
||||
}
|
||||
echo '</div>';
|
||||
return ['html' => (string) ob_get_clean()];
|
||||
}
|
||||
|
||||
public function widget($args, $instance): void {
|
||||
|
||||
Reference in New Issue
Block a user