`。
⚠️ 抽成闭包是为了**不在下面每处 if/else 手抄两遍结构** ——
抄两遍必然有一天两边不同步(v37 那种"改了 A 忘了 B"的坑)。
⚠️ 「是否必填」作为**参数**传(不要用 `use` 捕获 —— 闭包定义时那个变量还没赋值,
捕获到的是 null,标记永远不出现)。
🔴🔴 v94(用户 2026-10-25):必填的表示法从「末尾加红色星号」改成
「标签本身红色加粗」,由 CSS 类 `.is-req` 驱动(样式见 `app.css` 末尾
「必填项统一标记」那段)。
⚠️ 第三个参数 v94 起从 `$star` 更名为 `$req`:它原来叫"画星",现在只表示
"这是必填" —— 名字不改会让后来者以为还在画星号,去 CSS 里找不存在的规则。 */
$evRowOpen = static function (string $full = '', bool $hidden = false) use ($evMv): string {
return '
';
};
/* 重复规则**先算好**:下面"结束条件 / 重复次数 / 重复到"三行要不要默认藏起来,
取决于它(见 v44 第 2 条)。原来 `$rp` 是在「重复」那一行才 parse 的,
那三行排在它后面 ⇒ 拿不到。提到最前面,只算一次。 */
$evRp = \App\Repeat::parse((string)($evF['rrule'] ?? ''));
$evRepeating = (string)($evRp['freq'] ?? '') !== '';
$evLab = static function (string $text, string $for = '', bool $req = false) use ($evMv): string {
$cls = $req ? ' is-req' : '';
if ($evMv) {
// 观影式:标签是 ,冒号由 CSS ::after 给
return '' . $text . '';
}
return '';
};
?>
= $evLab('标题', 'ev-title', true) ?>
= $evLab('地点', 'ev-location') ?>
= $evLab('提醒') ?>
`:后者在手机上要"按住再点",
几乎没法用(任务共享那个 multiple 下拉就是因此被换掉的)。
⚠️ 字段名必须是 `reminder_minutes[]` —— Calendar::reminderMinutes() 认得数组。
写成 `reminder_minutes`(不带 [])会让 PHP 只留最后一个勾选。
🔴 v43(用户第 5 条):他要求把这一栏底下那句「多选与不提醒」的说明去掉
⇒ 这里删掉那个 `.tip`(多选语义由复选框本身表达)。 */
$curReminders = \App\Calendar::reminderList($evF['reminder_minutes'] ?? null); ?>
$word): ?>
bx.offsetParent !== null)`)。而这一版**结束那一端默认
带 `hidden`**(要点「+ 添加结束时间」才出现)→ 判断永远不成立 →
范围控件**从来没被挂上去过**(实测 data-semi-range-done 恒为 null)。
更糟的是 CSS 还有 `html.js .dt-range:not(.is-semi-range) > .dt-input
{ visibility: hidden }` —— 两端于是都是**不可见**的:
屏幕上一片空白、点哪儿都没反应。这就是「无法使用」的全部。
修法:**结束那一端不再默认藏起来**,范围控件一次性就挂上。
起止成对本来就该一起填。想表达"只有一个时刻"的话,范围控件 clear 一下即可。
⚠️ 顺带删掉「+ 添加结束时间 / 去掉结束时间」那套开关:
它切换显隐会让范围控件反复重挂;范围控件自己就能表达"没有结束"。
🔴🔴 v43(用户 2026-10-11 第 5 条):「开始和结束时间也没有用我们最新的控件,
直接就是四个字"时间范围"。」
—— 两处真缺陷一起修:
① 这个字段块**没传 `$dtPlugin='antd'`** ⇒ 用户看到的还是年/月/日 + 时/分
五个原生下拉,而不是他点名要的 Ant Design 控件;
② 标签写的是「时间范围」四个字,没告诉人"这是开始 / 结束"。
⇒ `$dtPlugin='antd'`(与观影/行程同一套:面板有可点的时/分列、中文「确定」),
标签改「开始 / 结束」(并去掉那颗必填星号的位置歧义 —— 只标在开始上)。
⚠️ 契约一字未改:隐藏字段仍是 `*_date/_hour/_minute`;antd 拉不动时
自动退回自建下拉(渐进增强)。
🔴🔴 v44(用户 2026-10-12 第 2 条):「开始/结束,改为:日期范围:。
之前的日期选择控件还有,需要删除。」
—— 用户要三种东西:① 标签「日期范围」;② 标签与**最新控件同行**;
③ 原生那套(年/月/日 + 时/分 五个下拉)**真的消失**。
🔴🔴 **"还在"的真根因(结构性,不是样式没写)**:
观影那对是 `‹div.mv-row.dt-range› ‹div.dt-input›`(**直接子**),
而日程这对是 `‹div.dt-range› ‹div.field.ev-dt› ‹div.dt-input›`
—— `.dt-input` 是**孙子**。
于是那条最常见的收起规则 `.dt-range.is-antd > .dt-input`(**直接子**选择器)
**在日程上根本不命中** ⇒ antd 挂上了、原生五个下拉照样显示
(用户看到两个控件并排,"之前的日期选择控件还有")。
⚠️ 与 v43 纪念日那次是**同一个家族**:结构一变,直接子选择器就静默失效。
⇒ 两手都做:① 把日程的结构改成与观影**一致**(`.dt-input` 直接子);
② CSS 里把 `>` 放宽成后代选择器(0,2,0 → 仍高于基类),
将来结构再变也不会又冒出第二个控件。
⇒ 形态:由 `_datetime.php` 的 `$dtLabel` 把「日期范围:」
**内联在控件那一行**(不靠宿主的行结构),一个 `.mv-lb` 挂在
`.dt-input` 里 → 三样天然同行,宽度不够时整体换行。 */ ?>
日期范围
= $evLab('重复', 'ev-freq') ?>
= $evLab('结束条件', 'ev-rep-end') ?>
>
= $evLab('重复次数', 'ev-rep-count') ?>
0) ? '' : ' hidden' ?>>
= $evLab('重复到', 'ev-rep-until') ?>
= $evLab('备注', 'ev-note') ?>
= $evLab('附件(可多选)') ?>