From ef9409cee6394145c5273cbb60e313d13c9e65fe Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 16 Sep 2026 22:40:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(payment):=20=E6=B7=BB=E5=8A=A0=E5=8D=A1?= =?UTF-8?q?=E5=AF=86=E9=A1=B5=E4=BE=9D=E8=B5=96=E5=AD=97=E6=AE=B5=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E7=8A=B6=E6=80=81=E6=8C=89=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 渲染期按表单默认值预判依赖可见性(deps_visible/default_form_value),不满足项直接输出 display:none,消除导入提醒首帧全部显示的问题 - 行内 JS 在 DOMContentLoaded 兜底执行一次依赖求值,交互前后状态与服务端一致 --- src/Admin/Native/PayChargeCards.php | 76 ++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/src/Admin/Native/PayChargeCards.php b/src/Admin/Native/PayChargeCards.php index 1fb3c59e..3667b5ae 100644 --- a/src/Admin/Native/PayChargeCards.php +++ b/src/Admin/Native/PayChargeCards.php @@ -839,7 +839,8 @@ class PayChargeCards { */ private function field_row(string $title, string $html, array $deps = [], string $desc = ''): void { $dep_attr = $deps ? ' data-dep="' . esc_attr((string) wp_json_encode($deps)) . '"' : ''; - echo '' . esc_html($title) . '' . $html; // phpcs:ignore WordPress.Security.EscapeOutput -- 内部构造,已转义。 + $hidden = ($deps && !$this->deps_visible($deps)) ? ' style="display:none;"' : ''; + echo '' . esc_html($title) . '' . $html; // phpcs:ignore WordPress.Security.EscapeOutput -- 内部构造,已转义。 if ($desc !== '') { echo '

' . wp_kses_post($desc) . '

'; } @@ -850,7 +851,72 @@ class PayChargeCards { * @param array $deps */ private function submessage_row(array $deps, string $content): void { - echo '
' . $content . '
'; // phpcs:ignore WordPress.Security.EscapeOutput -- 文案已转义。 + $hidden = $this->deps_visible($deps) ? '' : ' style="display:none;"'; + echo '
' . $content . '
'; // phpcs:ignore WordPress.Security.EscapeOutput -- 文案已转义。 + } + + /** + * 服务端按表单默认值预判依赖可见性(求值规则与行内 JS 一致)。 + * 参考主题 CSF 的 dependency 在 DOM ready 后才隐藏不满足项,首帧会闪现全部字段; + * 此处在渲染期直接置 display:none,修正「导入提醒初始全部显示」的问题。 + * + * @param array $deps + */ + private function deps_visible(array $deps): bool { + foreach ($deps as $dep) { + $v = (string) $this->default_form_value((string) ($dep['key'] ?? '')); + $val = (string) ($dep['val'] ?? ''); + switch ((string) ($dep['op'] ?? '')) { + case '==': + if ($v !== $val) { + return false; + } + break; + case '!=': + if ($v === $val) { + return false; + } + break; + case 'any': + if (!in_array($v, explode(',', $val), true)) { + return false; + } + break; + case 'checked': + if ($v === '') { + return false; + } + break; + case 'unchecked': + if ($v !== '') { + return false; + } + break; + } + } + return true; + } + + /** + * 表单字段的初始默认值(须与 field_row/button_set/spinner 渲染的默认值保持同步)。 + * 未列出的键按空字符串处理,与行内 JS formVal 找不到元素时返回 '' 的行为一致。 + */ + private function default_form_value(string $key): string { + switch ($key) { + case 'add_type': + return 'auto'; + case 'type': + return 'balance'; + case 'auto_top_s': + case 'only_pass_s': + return ''; + case 'vip_exchange[time]': + return ''; + case 'vip_exchange[unit]': + return 'month'; + default: + return ''; + } } /** @@ -980,6 +1046,12 @@ class PayChargeCards { document.addEventListener('change', function (e) { if (e.target.closest('.aksrt-cardpass-form')) evalDeps(); }); + // 初始按默认值求值一次:服务端已预隐藏,这里兜底校正。 + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', evalDeps); + } else { + evalDeps(); + } document.addEventListener('click', function (e) { var el = e.target.closest('[data-clipboard-text]'); if (!el) return;