2026-09-30 09:44:55 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 「日期 + 24 小时制时:分:秒」组合输入控件(从 TripLog 的 _datetime.php 移植)。
|
|
|
|
|
|
*
|
|
|
|
|
|
* ⚠️ 为什么不用 <input type="datetime-local">:
|
|
|
|
|
|
* 它的显示格式由**浏览器 UI 语言 / 系统时间格式**决定,<html lang> 与元素 lang
|
|
|
|
|
|
* 都压不过它。中文环境实测会渲染成「下午 03:30」,用户很容易把上下午填反;
|
|
|
|
|
|
* 而且它只有时:分,**没有秒**。拆成「原生日期选择器 + 三个下拉」后,
|
|
|
|
|
|
* 24 小时制与"精确到秒"都由控件本身保证,浏览器改不掉。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 日期部分仍是原生 `<input type="date">`(app.js 里的 showPicker 脚本对它同样生效,
|
|
|
|
|
|
* 点输入框任意位置都能弹出日历 —— 这正是"整个输入框点击都可以弹出"的落点)。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 用法(include 前 set 好这些变量;模板里只读它们):
|
|
|
|
|
|
* $dtName 字段基名,如 'birthday_solar' → 产出 *_date / _hour / _minute / _second
|
|
|
|
|
|
* $dtValue 可空;'Y-m-d H:i:s' / 'Y-m-d H:i' / 'Y-m-d'。服务端用 read_dt_input($dtName) 取值
|
|
|
|
|
|
* $dtRequired 日期是否必填(默认 false)
|
|
|
|
|
|
* $dtId 可选;日期控件的 id(供 <label for>)
|
|
|
|
|
|
* $dtSeconds 是否要"秒"这一档(默认 true;生日要精确到时分秒)
|
|
|
|
|
|
*/
|
|
|
|
|
|
$dtName = (string)($dtName ?? 'time');
|
|
|
|
|
|
$dtValue = $dtValue ?? null;
|
|
|
|
|
|
$dtRequired = (bool)($dtRequired ?? false);
|
|
|
|
|
|
$dtId = (string)($dtId ?? '');
|
|
|
|
|
|
$dtSeconds = (bool)($dtSeconds ?? true);
|
|
|
|
|
|
|
2026-10-03 08:18:05 +08:00
|
|
|
|
// ⚠️⚠️ 临时变量**一律带 dt 前缀**,一个都不能漏:这里原来写成
|
|
|
|
|
|
// `$t = strtotime(...)`,把宿主模板里表示「这条任务 / 这条记录」的 `$t`
|
|
|
|
|
|
// 覆盖成了 int —— 于是 include 之后凡是读 `$t['id']`、`$t['status']` 的地方
|
|
|
|
|
|
// 全部拿到 null,子任务列表空、评论不渲染、@高亮消失,而且**不报任何错**
|
|
|
|
|
|
// (PHP 8 对 "Trying to access array offset on value of type int" 只 Warning)。
|
|
|
|
|
|
// tasks/show.php 上就是这么被 e2e 抓到的(2026-10-02)。
|
|
|
|
|
|
$dtTs = (!empty($dtValue) && ($dtTsTmp = strtotime(trim((string)$dtValue)))) ? $dtTsTmp : false;
|
2026-09-30 09:44:55 +08:00
|
|
|
|
$dtDate = $dtTs ? date('Y-m-d', $dtTs) : '';
|
|
|
|
|
|
$dtHour = $dtTs ? (int)date('G', $dtTs) : 0; // G = 0..23,天然 24 小时制
|
|
|
|
|
|
$dtMin = $dtTs ? (int)date('i', $dtTs) : 0;
|
|
|
|
|
|
$dtSec = $dtTs ? (int)date('s', $dtTs) : 0;
|
|
|
|
|
|
?>
|
|
|
|
|
|
<div class="dt-input">
|
|
|
|
|
|
<input type="date" class="dt-date" name="<?= e($dtName) ?>_date"
|
|
|
|
|
|
<?= $dtId !== '' ? 'id="' . e($dtId) . '"' : '' ?>
|
|
|
|
|
|
value="<?= e($dtDate) ?>"<?= $dtRequired ? ' required' : '' ?>
|
|
|
|
|
|
aria-label="日期">
|
|
|
|
|
|
<span class="dt-time">
|
|
|
|
|
|
<select class="dt-hour" name="<?= e($dtName) ?>_hour" aria-label="时(24 小时制)">
|
2026-10-01 00:12:04 +08:00
|
|
|
|
<?php for ($dtH = 0; $dtH < 24; $dtH++): $hv = sprintf('%02d', $dtH); ?>
|
|
|
|
|
|
<option value="<?= $hv ?>"<?= $dtH === $dtHour ? ' selected' : '' ?>><?= $hv ?></option>
|
2026-09-30 09:44:55 +08:00
|
|
|
|
<?php endfor; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<span class="dt-colon" aria-hidden="true">:</span>
|
|
|
|
|
|
<select class="dt-minute" name="<?= e($dtName) ?>_minute" aria-label="分">
|
2026-10-01 00:12:04 +08:00
|
|
|
|
<?php /* ⚠️ 循环变量一律带 dt 前缀:这里曾被写成 $m,把宿主模板里
|
|
|
|
|
|
表示「观影记录」的 $m 覆盖成了 int —— 编辑页的简介/备注回填
|
|
|
|
|
|
被静默清空、取消链接变 id=0,还不止一个 Warning(2026-09-30 e2e 抓到)。 */ ?>
|
|
|
|
|
|
<?php for ($dtM = 0; $dtM < 60; $dtM++): $mv = sprintf('%02d', $dtM); ?>
|
|
|
|
|
|
<option value="<?= $mv ?>"<?= $dtM === $dtMin ? ' selected' : '' ?>><?= $mv ?></option>
|
2026-09-30 09:44:55 +08:00
|
|
|
|
<?php endfor; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<?php if ($dtSeconds): ?>
|
|
|
|
|
|
<span class="dt-colon" aria-hidden="true">:</span>
|
|
|
|
|
|
<select class="dt-second" name="<?= e($dtName) ?>_second" aria-label="秒">
|
2026-10-01 00:12:04 +08:00
|
|
|
|
<?php for ($dtS = 0; $dtS < 60; $dtS++): $sv = sprintf('%02d', $dtS); ?>
|
|
|
|
|
|
<option value="<?= $sv ?>"<?= $dtS === $dtSec ? ' selected' : '' ?>><?= $sv ?></option>
|
2026-09-30 09:44:55 +08:00
|
|
|
|
<?php endfor; ?>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<?php /* 用完即清,避免残留变量影响下一次 include */ unset(
|
|
|
|
|
|
$dtName, $dtValue, $dtRequired, $dtId, $dtSeconds,
|
2026-10-03 08:18:05 +08:00
|
|
|
|
$dtTs, $dtTsTmp, $dtDate, $dtHour, $dtMin, $dtSec,
|
2026-10-01 00:12:04 +08:00
|
|
|
|
$dtH, $dtM, $dtS, $hv, $mv, $sv
|
2026-09-30 09:44:55 +08:00
|
|
|
|
); ?>
|