表单不再预填示例数据,示例只留 placeholder (#3)
用户反馈:输入框里预填的「示例值」点进去得先删干净才能填自己的,不合理。 必须分清两类,否则会误删真实配置: - A 类 真实配置(从数据库读出来的)→ 保留 - B 类 出厂示例(代码/配置文件里写死的)→ 清空,示例移 placeholder 本次处理的 B 类: 1. 安装页「网站名称」 原先回显 config.example.php 里的出厂名「轻反馈」,用户以为要保留。 现在首次进入为空,仅在表单校验失败重来时回填用户刚才填的内容。 2. 安装页「管理员用户名」 原先预填 admin,现在为空,placeholder 提示「例如 admin」。 3. 后台「对象键前缀」 原先显示 fb(来自 config 默认值),现在为空,placeholder「留空即用 fb」。 4. 后台「关闭通知邮件标题」 原先显示模板「关于你反馈的问题《%s》」,现在为空,placeholder 给出模板。 ## 新增 fb_form_val() config.example.php 里给的出厂默认值和「用户填过的值」在 fb_cfg() 里合并后 分不出来 —— 表单永远显示得出内容。这个函数按「数据库里有没有这条设置」判定: 设过就回显(哪怕值恰好等于默认),没设过就当未自定义、显示空。 ## 顺带修复一个真 bug close_mail_subject 原先留空会存成空字符串,fb_cfg() 返回空串后 sprintf() 得到空邮件标题 —— 用户清空模板就发不出有主题的邮件。 改成留空即删除该设置,回落到默认模板。 ## 验证 #3 专项 20/20(含:真实配置保存后必须回显、清空后必须回落默认且不存空串); 回归全绿:全新安装 33/33、安装向导 60/60、老基线 25/25、约束检查 20/20。
This commit is contained in:
@@ -320,8 +320,14 @@ function fb_admin_save_settings() {
|
|||||||
$texts = ['oss.endpoint', 'oss.bucket', 'oss.instance_role', 'oss.domain', 'oss.prefix', 'moderation.close_mail_subject'];
|
$texts = ['oss.endpoint', 'oss.bucket', 'oss.instance_role', 'oss.domain', 'oss.prefix', 'moderation.close_mail_subject'];
|
||||||
foreach ($texts as $k) {
|
foreach ($texts as $k) {
|
||||||
$v = trim((string)$post($k, ''));
|
$v = trim((string)$post($k, ''));
|
||||||
// 对象键前缀留空会让对象键变成 "/2026/...",回落到出厂默认 'fb'
|
// 这两个留空都有"出厂默认"兜底,必须删键而不是存空串:
|
||||||
if ($k === 'oss.prefix' && $v === '') { fb_unset_setting($k); continue; }
|
// - oss.prefix 留空会让对象键变成 "/2026/...",默认是 'fb'
|
||||||
|
// - close_mail_subject 留空会让邮件标题变成空字符串,
|
||||||
|
// sprintf('') 出来的主题是空的,必须回落到默认模板
|
||||||
|
if (($k === 'oss.prefix' || $k === 'moderation.close_mail_subject') && $v === '') {
|
||||||
|
fb_unset_setting($k);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// RAM 角色留空 = 让程序自己去元数据服务探测,不写死一个空值
|
// RAM 角色留空 = 让程序自己去元数据服务探测,不写死一个空值
|
||||||
if ($k === 'oss.instance_role' && $v === '') {
|
if ($k === 'oss.instance_role' && $v === '') {
|
||||||
list($rOk, $rVal) = fb_oss_detect_instance_role();
|
list($rOk, $rVal) = fb_oss_detect_instance_role();
|
||||||
@@ -711,8 +717,8 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
|
|||||||
|
|
||||||
<h2 style="margin:8px 0 10px">站点信息</h2>
|
<h2 style="margin:8px 0 10px">站点信息</h2>
|
||||||
<label class="field"><span>站点标题</span>
|
<label class="field"><span>站点标题</span>
|
||||||
<input type="text" name="site_name" maxlength="80" placeholder="轻反馈"
|
<input type="text" name="site_name" maxlength="80" placeholder="例如:我的软件 · 问题反馈"
|
||||||
value="<?php echo e((string)fb_cfg('site_name', '')); ?>">
|
value="<?php echo e(fb_form_val(fb_cfg('site_name', ''), '轻反馈', 'site_name')); ?>">
|
||||||
<i class="hint">显示在浏览器标签、页面顶栏与页脚。用它说明「本系统为哪个软件提供反馈服务」,如「XX 软件 · 问题反馈」。</i></label>
|
<i class="hint">显示在浏览器标签、页面顶栏与页脚。用它说明「本系统为哪个软件提供反馈服务」,如「XX 软件 · 问题反馈」。</i></label>
|
||||||
<label class="field"><span>站点描述</span>
|
<label class="field"><span>站点描述</span>
|
||||||
<textarea name="site_desc" rows="3" maxlength="300"
|
<textarea name="site_desc" rows="3" maxlength="300"
|
||||||
@@ -889,7 +895,8 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
|
|||||||
<input type="password" name="oss_secret_key" autocomplete="new-password"
|
<input type="password" name="oss_secret_key" autocomplete="new-password"
|
||||||
placeholder="<?php echo (string)fb_cfg('oss.secret_key', '') !== '' ? '已设置,留空保持不变' : '未设置'; ?>"></label>
|
placeholder="<?php echo (string)fb_cfg('oss.secret_key', '') !== '' ? '已设置,留空保持不变' : '未设置'; ?>"></label>
|
||||||
<label class="field"><span>对象键前缀</span>
|
<label class="field"><span>对象键前缀</span>
|
||||||
<input type="text" name="oss_prefix" value="<?php echo e((string)fb_cfg('oss.prefix', 'fb')); ?>"></label>
|
<input type="text" name="oss_prefix" placeholder="留空即用 fb"
|
||||||
|
value="<?php echo e(fb_form_val(fb_cfg('oss.prefix', 'fb'), 'fb', 'oss.prefix')); ?>"></label>
|
||||||
<label class="field"><span>公网访问协议(走公网 Endpoint 时)</span>
|
<label class="field"><span>公网访问协议(走公网 Endpoint 时)</span>
|
||||||
<select name="oss_url_scheme">
|
<select name="oss_url_scheme">
|
||||||
<option value="https"<?php echo ((string)fb_cfg('oss.url_scheme', 'https')) === 'https' ? ' selected' : ''; ?>>https</option>
|
<option value="https"<?php echo ((string)fb_cfg('oss.url_scheme', 'https')) === 'https' ? ' selected' : ''; ?>>https</option>
|
||||||
@@ -905,8 +912,10 @@ fb_layout_head('管理后台', ['robots' => 'noindex,nofollow']);
|
|||||||
<h2 style="margin:24px 0 10px">审核</h2>
|
<h2 style="margin:24px 0 10px">审核</h2>
|
||||||
<label class="check"><input type="checkbox" name="moderation_enabled" value="1"<?php echo fb_moderation_on() ? ' checked' : ''; ?>> 先审后显(新提交的问题默认不公开,需你通过后才显示)</label>
|
<label class="check"><input type="checkbox" name="moderation_enabled" value="1"<?php echo fb_moderation_on() ? ' checked' : ''; ?>> 先审后显(新提交的问题默认不公开,需你通过后才显示)</label>
|
||||||
<label class="field"><span>关闭通知邮件标题</span>
|
<label class="field"><span>关闭通知邮件标题</span>
|
||||||
<input type="text" name="moderation_close_mail_subject" value="<?php echo e((string)fb_cfg('moderation.close_mail_subject', '关于你反馈的问题《%s》')); ?>">
|
<input type="text" name="moderation_close_mail_subject"
|
||||||
<i class="hint">%s 会替换成问题标题。</i></label>
|
placeholder="留空即用:关于你反馈的问题《%s》"
|
||||||
|
value="<?php echo e(fb_form_val(fb_cfg('moderation.close_mail_subject', '关于你反馈的问题《%s》'), '关于你反馈的问题《%s》', 'moderation.close_mail_subject')); ?>">
|
||||||
|
<i class="hint">%s 会替换成问题标题。留空则用默认模板。</i></label>
|
||||||
|
|
||||||
<div class="form-actions">
|
<div class="form-actions">
|
||||||
<button class="btn primary" type="submit" name="act" value="settings">保存设置</button>
|
<button class="btn primary" type="submit" name="act" value="settings">保存设置</button>
|
||||||
|
|||||||
+9
-3
@@ -432,8 +432,14 @@ function fb_install_self_delete() {
|
|||||||
<input type="hidden" name="set_password" value="1">
|
<input type="hidden" name="set_password" value="1">
|
||||||
|
|
||||||
<label class="field"><span>网站名称 <b class="req">*</b></span>
|
<label class="field"><span>网站名称 <b class="req">*</b></span>
|
||||||
|
<?php
|
||||||
|
// 首次进入必须空着:config.example.php 里有出厂名「轻反馈」,
|
||||||
|
// 直接回显会让用户以为那是要保留的数据,得先删一遍。
|
||||||
|
// 只有表单校验失败重来时,才回填用户刚填的内容。
|
||||||
|
$nameVal = isset($_POST['site_name']) ? (string)$_POST['site_name'] : '';
|
||||||
|
?>
|
||||||
<input type="text" name="site_name" maxlength="80" required autofocus
|
<input type="text" name="site_name" maxlength="80" required autofocus
|
||||||
value="<?php echo e(isset($_POST['site_name']) ? (string)$_POST['site_name'] : (string)fb_cfg('site_name', '')); ?>"
|
value="<?php echo e($nameVal); ?>"
|
||||||
placeholder="例如:我的软件 · 问题反馈">
|
placeholder="例如:我的软件 · 问题反馈">
|
||||||
<i class="hint">显示在浏览器标签、页面顶栏和页脚。</i></label>
|
<i class="hint">显示在浏览器标签、页面顶栏和页脚。</i></label>
|
||||||
|
|
||||||
@@ -445,8 +451,8 @@ function fb_install_self_delete() {
|
|||||||
|
|
||||||
<label class="field"><span>用户名 <b class="req">*</b></span>
|
<label class="field"><span>用户名 <b class="req">*</b></span>
|
||||||
<input type="text" name="admin_user" maxlength="32" required
|
<input type="text" name="admin_user" maxlength="32" required
|
||||||
value="<?php echo e(isset($_POST['admin_user']) ? (string)$_POST['admin_user'] : 'admin'); ?>"
|
value="<?php echo e(isset($_POST['admin_user']) ? (string)$_POST['admin_user'] : ''); ?>"
|
||||||
placeholder="admin" autocomplete="username">
|
placeholder="例如 admin" autocomplete="username">
|
||||||
<i class="hint">字母、数字、下划线、点、连字符,2~32 位。</i></label>
|
<i class="hint">字母、数字、下划线、点、连字符,2~32 位。</i></label>
|
||||||
|
|
||||||
<div class="grid2">
|
<div class="grid2">
|
||||||
|
|||||||
@@ -94,6 +94,33 @@ function fb_default_software() {
|
|||||||
return $list ? $list[0] : null;
|
return $list ? $list[0] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单回显用:如果当前值等于「出厂默认」,就返回空串。
|
||||||
|
*
|
||||||
|
* 为什么需要:config.example.php 里给 oss.prefix 写了 'fb'、
|
||||||
|
* close_mail_subject 写了模板,fb_cfg() 会把文件配置和数据库设置合并,
|
||||||
|
* 所以表单永远显示得出值 —— 用户点进去得先删掉这段"看起来是数据"的默认值。
|
||||||
|
*
|
||||||
|
* 用这个函数包一层:等于默认就显示空,用户看到的是干净的输入框;
|
||||||
|
* 真自己改过(值 ≠ 默认)才回显。
|
||||||
|
*
|
||||||
|
* @param string $cur 当前生效值
|
||||||
|
* @param string $default 出厂默认值
|
||||||
|
* @return string 要回显的值(等于默认则空)
|
||||||
|
*/
|
||||||
|
function fb_form_val($cur, $default, $settingKey = '') {
|
||||||
|
$cur = (string)$cur;
|
||||||
|
// 有键名时以「数据库里设过没有」为准 —— 比"值等于默认"可靠:
|
||||||
|
// 用户真把站点名写成「轻反馈」也是他自己设的,不该被当成未设置。
|
||||||
|
// 但文件配置里的出厂值不算「设过」,因为那不是用户的输入。
|
||||||
|
if ($settingKey !== '') {
|
||||||
|
$exists = fb_setting($settingKey, null) !== null;
|
||||||
|
if ($exists) { return $cur; }
|
||||||
|
return ($cur === (string)$default) ? '' : $cur;
|
||||||
|
}
|
||||||
|
return ($cur === (string)$default) ? '' : $cur;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验并规范化主题色(#RRGGBB)。
|
* 校验并规范化主题色(#RRGGBB)。
|
||||||
* @return string 合法则返回小写 6 位十六进制;非法返回空串
|
* @return string 合法则返回小写 6 位十六进制;非法返回空串
|
||||||
|
|||||||
Reference in New Issue
Block a user