From 5f38df80b728418130c01d4c8ce9d4a385fcbcbd Mon Sep 17 00:00:00 2001 From: laoyang Date: Mon, 28 Sep 2026 23:38:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=AF=E6=A0=87=E9=A2=98=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=EF=BC=9A=E6=B8=85=E7=A9=BA=E5=90=8E=E5=89=8D?= =?UTF-8?q?=E5=8F=B0=E4=B8=8D=E5=86=8D=E5=9B=9E=E9=80=80=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:setting() 把「空串」当成「从未配置」,于是后台删掉副标题后前台照样 显示默认的「个人网站导航」——删不掉。 改动: - config.php: setting() 改为「只有键不存在才回退 default」;空串是一等公民。 site_name() 改为唯一显式「空则回退 APP_NAME」的设置(页面不能没名字)。 - index.php: 副标题按空串读取(默认值取 ),hero 与 两处都判空; 空时不输出 <p>、不拼「·」分隔符。 - admin/index.php: 输入框回显不传默认文案(清空后不回弹),加 placeholder 与说明。 --- admin/index.php | 5 ++++- config.php | 22 ++++++++++++++++++---- index.php | 12 ++++++++++-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/admin/index.php b/admin/index.php index da39a09..b87578c 100644 --- a/admin/index.php +++ b/admin/index.php @@ -293,7 +293,10 @@ else: // settings ?> <?= csrf_field() ?> <input type="hidden" name="action" value="settings_save"> <label>站点名称<input type="text" name="site_name" value="<?= e(setting('site_name', '简航')) ?>"></label> - <label>副标题<input type="text" name="subtitle" value="<?= e(setting('subtitle', '个人网站导航')) ?>"></label> + <label>副标题<input type="text" name="subtitle" value="<?= e(setting('subtitle')) ?>" placeholder="留空则不显示"></label> + <p class="hint" style="grid-column:1/-1;margin:-6px 0 6px"> + 副标题显示在首页站点名称下方(也会出现在浏览器标题里)。<b>留空即隐藏</b>,不会退回默认文案。 + </p> <label>默认搜索引擎 <select name="default_engine"> <?php foreach ($engines as $en): ?> diff --git a/config.php b/config.php index 2771fd5..43e5804 100644 --- a/config.php +++ b/config.php @@ -65,10 +65,16 @@ function url(string $path = ''): string return app_base() . '/' . ltrim($path, '/'); } -/** 站点名(可在后台设置里覆盖) */ +/** 站点名(可在后台设置里覆盖) + * + * ⚠️ 这是**唯一**允许「空则回退默认」的设置:站点名留空会让 <title> / <h1> / alt + * 变成空白,页面连名字都没有。 + * 这里显式写出来,而不是指望 setting() 全局回退 —— 那正是「副标题删不掉」的病根。 + */ function site_name(): string { - return setting('site_name', APP_NAME); + $n = setting('site_name'); + return $n !== '' ? $n : APP_NAME; } /** @@ -102,9 +108,17 @@ function settings_reload(): void settings_cache(true); } -/** 读取设置项 */ +/** + * 读取设置项。 + * + * ⚠️ 空串是一等公民:**只有「这一行不存在」才回退 $default**。 + * 曾经这里写的是 `$cache[$key] !== ''`,把「用户主动清空」和「从未配置过」当成一回事, + * 于是后台删掉副标题后前台照样显示默认的「个人网站导航」——删不掉。 + * 需要「空则回退」的设置请在自己的读取点显式写明(如 site_name()), + * 不要把这个语义塞回函数里。 + */ function setting(string $key, string $default = ''): string { $cache = settings_cache(); - return array_key_exists($key, $cache) && $cache[$key] !== '' ? $cache[$key] : $default; + return array_key_exists($key, $cache) ? $cache[$key] : $default; } diff --git a/index.php b/index.php index 3ca9e81..ac1952d 100644 --- a/index.php +++ b/index.php @@ -48,6 +48,12 @@ if ($default === null) { $default = $engines[0] ?? null; } $primary = setting('primary_color', '#2F6BF7'); +// 副标题(后台「设置 → 副标题」)。 +// ⚠️ 允许为空:用户清空后就**不显示**副标题,不要回退成默认文案 —— +// 这正是 bug 的现场(原先空串被当成「未设置」,删了照样显示)。 +// 空串原样取出(默认值取 ''),渲染处再按需判断是否输出。 +$subtitle = setting('subtitle', ''); + function sites_of(int $gid): array { $st = db()->prepare("SELECT * FROM sites WHERE group_id=? AND is_visible=1 ORDER BY sort_order, id"); @@ -86,7 +92,7 @@ function site_tile(array $s): void <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> -<title><?= e(site_name()) ?> · <?= e(setting('subtitle', '个人网站导航')) ?> +<?= e(site_name()) ?><?= $subtitle !== '' ? ' · ' . e($subtitle) : '' ?>