调整分组` 还在, * 而且手机上的 HTML5 拖放本来就不生效,那套表单就是窄屏的正路。 * * ⚠️ 卡片结构是 div > a + details,**不能写成 a > form**: * 表单套在链接里是非法 HTML,浏览器会把 DOM 拆开,表单里那个「移动」按钮 * 可能连提交机会都没有(或者把整张卡片点成跳转)。 */ $canMove = \App\Auth::canWrite(); $pickable = $pickable ?? 0; $total = 0; foreach ($grouped as $list) { $total += count($list); } /** * 画一栏人。用闭包是因为"分好组的各栏"和"未分类"两处要画同一套卡片, * 复制一遍迟早会改漏一处。 * * ⚠️ `$groups` 必须写进 `use (...)`:卡片里的「调整分组」下拉要列出我能用的分组。 * 漏掉它的后果**不会报错**(PHP 8 只 warning 一句"未定义变量", * 而 foreach 拿到 null 就是零次循环)—— 于是每张卡片的那个下拉里 * 只剩「未分类」一项,看着像"分组功能没做",其实是变量没传进来。 */ $renderGrid = function (array $list) use ($meId, $canMove, $groups): void { ?>
data-initials="">
。 ① 现有的 e2e 断言就是按这个形状读「这一行显示的是谁」 (person_names():只认
内的第一段文本)—— 包一层 span 会让它读到空串,6 条断言齐刷刷变红, 而页面看着完全正常(这种"改样式把测试打挂"最难查); ② 包起来也没有任何用处:.pname 本身已经带字重与字号, 下面的关系标签/徽标都在姓名**之后**,不需要靠 span 定位。 */ ?> >
都不画** —— 留一个空标签只会让每行都长一截。 // 用户 2026-10-04 第 3 条:生日**阴历阳历都列**,且只显示月和日(不显示年)。 $facts = []; if (($p['phone_plain'] ?? '') !== '') { $facts[] = ['手机', (string)$p['phone_plain']]; } foreach ((array)($p['birthdays'] ?? []) as [$bk, $bv]) { $facts[] = [(string)$bk, (string)$bv]; } if (trim((string)($p['email'] ?? '')) !== '') { $facts[] = ['邮箱', (string)$p['email']]; } if (trim((string)($p['org'] ?? '')) !== '') { $facts[] = ['单位', (string)$p['org']]; } ?>
,且必须在 person-main 这个 **外面** —— a 套 a 是非法 HTML,浏览器会把 DOM 拆开。 */ ?>

人 放到这里

家庭名册

共 人

没有匹配的人 换个词试试。 0): ?> 你的名册还是空的 家里已经有 个人了 —— 直接挑过来就行,不用重新录一遍。 名册还是空的 把家里人加进来,之后观影、旅行的同行人就可以直接从名册里选。 等家里人把你加进来,或者让管理员给你开个账号。

还没有任何分组。管理员可以在「系统设置 → 公共分组」里建一套全家共用的, 你也可以在「个人设置 → 我的分组」里加只给自己看的。