副标题允许为空:清空后前台不再回退显示默认文案

根因:setting() 把「空串」当成「从未配置」,于是后台删掉副标题后前台照样
显示默认的「个人网站导航」——删不掉。

改动:
- config.php: setting() 改为「只有键不存在才回退 default」;空串是一等公民。
  site_name() 改为唯一显式「空则回退 APP_NAME」的设置(页面不能没名字)。
- index.php: 副标题按空串读取(默认值取 ),hero 与 <title> 两处都判空;
  空时不输出 <p>、不拼「·」分隔符。
- admin/index.php: 输入框回显不传默认文案(清空后不回弹),加 placeholder 与说明。
This commit is contained in:
2026-09-28 23:38:13 +08:00
parent 92eb9d90be
commit 5f38df80b7
3 changed files with 32 additions and 7 deletions
+4 -1
View File
@@ -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): ?>
+18 -4
View File
@@ -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;
}
+10 -2
View File
@@ -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', '个人网站导航')) ?></title>
<title><?= e(site_name()) ?><?= $subtitle !== '' ? ' · ' . e($subtitle) : '' ?></title>
<meta name="description" content="<?= e(site_name()) ?> —— 个人网站导航">
<meta name="theme-color" content="<?= e($primary) ?>">
<!-- 站点图标(favicon / apple-touch / PWA manifest):有自定义就用自定义,
@@ -104,7 +110,9 @@ function site_tile(array $s): void
<header class="hero" data-site-icon="<?= e(site_icon_mode()) ?>">
<img class="logo" src="<?= e(site_icon_url('logo', 512) ?: asset('assets/img/logo.svg')) ?>" alt="<?= e(site_name()) ?>">
<h1><?= e(site_name()) ?></h1>
<p><?= e(setting('subtitle', '个人网站导航')) ?></p>
<?php if ($subtitle !== ''): ?>
<p><?= e($subtitle) ?></p>
<?php endif; ?>
</header>
<!-- 顶部搜索 -->