diff --git a/app/Support/BackUrl.php b/app/Support/BackUrl.php index 846aebe..b92997c 100644 --- a/app/Support/BackUrl.php +++ b/app/Support/BackUrl.php @@ -40,7 +40,6 @@ class BackUrl * 典型用途:列表页里的各种「统计卡/治理入口/快捷链接」需要: * - 保留当前筛选条件 * - 覆盖指定字段 - * - 强制清空 page * - 并且 back 只能保留通过 sanitizeForLinks 的安全值(否则移除) */ public static function currentPathWithQuery(array $overrides = [], string $safeBackForLinks = ''): string @@ -68,4 +67,46 @@ class BackUrl return $url; } + + /** + * 当前路径下的“快捷筛选”链接构造器: + * - 仅保留指定上下文键(例如 merchant_id/plan_id/keyword/lead_id 等) + * - 覆盖 overrides(null 表示移除) + * - 强制清空 page(避免落到空页) + * - back 仅保留安全值(由调用方传入 sanitizeForLinks 产物) + */ + public static function currentPathQuickFilter(array $contextKeys, array $overrides = [], string $safeBackForLinks = ''): string + { + $path = '/' . ltrim(request()->path(), '/'); + + $contextMap = []; + foreach ($contextKeys as $k) { + $contextMap[(string) $k] = 1; + } + + $q = array_intersect_key(request()->query(), $contextMap); + + if ($safeBackForLinks !== '') { + $q['back'] = $safeBackForLinks; + } else { + unset($q['back']); + } + + // 快捷筛选不应继承分页 + unset($q['page']); + + foreach ($overrides as $k => $v) { + if ($v === null) { + unset($q[$k]); + continue; + } + $q[$k] = $v; + } + + if (count($q) === 0) { + return $path; + } + + return $path . '?' . \Illuminate\Support\Arr::query($q); + } } diff --git a/resources/views/admin/plans/index.blade.php b/resources/views/admin/plans/index.blade.php index 92dd3c4..1a1bbae 100644 --- a/resources/views/admin/plans/index.blade.php +++ b/resources/views/admin/plans/index.blade.php @@ -51,31 +51,7 @@ @php // 快捷筛选:仅保留“上下文”字段(back/keyword),避免把其它筛选条件叠加导致空结果 $buildQuickFilterUrl = function (array $overrides) use ($safeBackForLinks) { - $path = '/' . ltrim(request()->path(), '/'); - - $contextKeys = [ - 'keyword' => 1, - ]; - - $q = array_intersect_key(request()->query(), $contextKeys); - - if ($safeBackForLinks !== '') { - $q['back'] = $safeBackForLinks; - } - - foreach ($overrides as $k => $v) { - if ($v === null) { - unset($q[$k]); - continue; - } - $q[$k] = $v; - } - - if (count($q) === 0) { - return $path; - } - - return $path . '?' . \Illuminate\Support\Arr::query($q); + return \App\Support\BackUrl::currentPathQuickFilter(['keyword'], $overrides, $safeBackForLinks); }; // “全部”:清空筛选,但保留安全 back(用于返回来源页) @@ -83,10 +59,6 @@ if ($safeBackForLinks !== '') { $allUrl .= '?' . \Illuminate\Support\Arr::query(['back' => $safeBackForLinks]); } - - if ($safeBackForLinks !== '') { - $allUrl .= '?' . \Illuminate\Support\Arr::query(['back' => $safeBackForLinks]); - } @endphp