diff --git a/src/Admin/Native/UsersMenusTickets.php b/src/Admin/Native/UsersMenusTickets.php
index 0dacd0d2..db5213ff 100644
--- a/src/Admin/Native/UsersMenusTickets.php
+++ b/src/Admin/Native/UsersMenusTickets.php
@@ -183,8 +183,32 @@ trait UsersMenusTickets {
echo '
"' . esc_html($s) . '" ' . esc_html__('的搜索结果', 'aksrt') . '
';
}
+ $process_id = isset($_GET['id']) ? (string) wp_unslash($_GET['id']) : '';
+
if ($process_action === 'process') {
- echo '' . esc_html__('查看全部', 'aksrt') . '';
+ // 独立处理视图:只渲染目标工单的处理表单(参考主题同构)。
+ // 列表与分页不得出现在“确认提交”下方——此前表单被当作
+ // 追加进列表表格,属于无效 HTML 嵌套,浏览器重排后工单列表
+ // 全部堆到表单下方。
+ $processing = null;
+ foreach (array_merge($tickets, $rows) as $row) {
+ if ($process_id === (string) $row['kind'] . '-' . (string) $row['id']) {
+ $processing = $row;
+ break;
+ }
+ }
+
+ echo '' . esc_html__('查看全部', 'aksrt') . '';
+
+ if ($processing === null) {
+ echo '' . esc_html__('工单不存在或已被删除', 'aksrt') . '
';
+ return;
+ }
+
+ echo '';
+ $this->render_ticket_process_form($processing, $action_url);
+ echo '
';
+ return;
}
echo '';
@@ -217,13 +241,8 @@ trait UsersMenusTickets {
echo '
| ' . esc_html__('暂无申请记录', 'aksrt') . ' |
';
}
- $process_id = isset($_GET['id']) ? (string) wp_unslash($_GET['id']) : '';
-
foreach ($tickets as $row) {
$this->render_ticket_row($row, $page_url);
- if ($process_action === 'process' && $process_id === (string) $row['kind'] . '-' . (string) $row['id']) {
- $this->render_ticket_process_form($row, $action_url);
- }
}
echo '';
diff --git a/tests/widget-system/report-ban-contract.test.cjs b/tests/widget-system/report-ban-contract.test.cjs
index ca937f43..a0efed96 100644
--- a/tests/widget-system/report-ban-contract.test.cjs
+++ b/tests/widget-system/report-ban-contract.test.cjs
@@ -179,6 +179,10 @@ test('native ban page mirrors the reference theme layout', () => {
assert.match(tickets, /name="action" value="' \. esc_attr\(\$kind === 'report' \? 'aksrt_users_update_report' : 'aksrt_users_process_appeal'\)/)
assert.match(usersMenus, /admin_post_aksrt_users_update_report/)
assert.match(usersMenus, /admin_post_aksrt_users_process_appeal/)
+ // 独立处理视图:action=process 时只渲染目标工单的处理表单(提前 return),
+ // 列表循环不得再注入表单——无效 嵌套曾把工单列表挤到“确认提交”下方。
+ assert.match(tickets, /if \(\$process_action === 'process'\) \{[\s\S]*?render_ticket_process_form\(\$processing, \$action_url\)[\s\S]*?return;/)
+ assert.doesNotMatch(tickets, /foreach \(\$tickets as \$row\) \{\s*\$this->render_ticket_row[\s\S]{0,400}?render_ticket_process_form/)
// 分页对齐参考主题 zibpay_admin_pagenavi(每页 20 条)
assert.match(tickets, /TICKETS_PER_PAGE = 20/)