v24 第 8 条:凡「选人」都走同一套弹窗 + 拼音首字母(补上唯一漏做的一条)
用户原话:「名册详情页面,添加关系那里,选择一个人,应该也是和观影人一样, 点击弹窗,用拼音首字母选择,否则人多的时候,这个选择起来太麻烦了。」 - 成员详情页:①「添加关系 → 对方」 ②「分享他的名片给…」→ 全局选人组件(单选) - 任务:③ 列表页「共享给(多选)」 ④ 列表页「负责人」 ⑤ 详情页「负责人」 (共享候选人先把自己过滤掉 —— 共享给自己是空操作) - 纪念日:「与谁相关」→ 单选,且保留原下拉第一项「不指定」(ppAllowEmpty) - 「对方」是必填,但组件里是原生 radio(HTML 没有"必选一个 radio"的可靠约束) → 页面补一道 submit 拦截,否则用户点了按钮会静默无反应 顺带修一个用户没提、我自己抓到的真 bug: _person_picker.php 原用**文件顶层**的 `static $ppSeq` 做 id 计数 —— PHP 里被 include 的文件,顶层 static 初值**每次 include 都重新绑定**(与函数体内的 static 不同)→ 同一页 include 两次都拿 pp1 → DOM id 撞车(getElementById / <label for> 全抓到第一个)。实测 include 三次得到 pp1,pp1,pp1。改用 $GLOBALS['ppSeq']。这个坑只有同一页出现两个组件时才暴露,且资源页第二个组件 只有真有资源时才渲染 —— 所以写成**单元级**探针(同一请求 include 两次)。 另修一个构建层隐患(本轮部署时踩到,白查了一轮): 本机 core.autocrlf=true,一次 git stash 往返就把 6 个文件全改成 CRLF;而部署 打包取的是工作树 → 包里带 CRLF 上去 → 部署脚本里 grep -qxF '<整行 CSS 选择器>' 的校验在 Linux 上一条都匹配不到(报错却指向"CSS 少了某条规则",极易误诊)。 → .gitattributes 加 `* text=auto eol=lf`(必须排在 -text 那几条之前), 并在打包前加一道行尾体检 _fb_eol_check.py(失败时点名文件)。 验证:反向验证对着 git stash 出来的真·改动前状态跑 → 11 通过 / 17 失败; 新增 _fb_picker_unify.py 28/0;e2e 785/0;几何 428/0;移动端 688/0;交互 97/0; 升级 126/0;家谱 34/0;专项 91/0;导入 21/0;豆瓣 22/0;行尾体检 + 两道新静态 门禁均实测可失败。线上 6 文件 md5 一致、CR=0。
This commit is contained in:
@@ -32,10 +32,15 @@ $ppTitle = $ppTitle ?? '选择';
|
||||
$ppEmptyText = $ppEmptyText ?? '未选择';
|
||||
$ppAllowEmpty = !empty($ppAllowEmpty);
|
||||
|
||||
// 同一页多个实例要各有一套 id,否则 document.getElementById 全抓到第一个
|
||||
static $ppSeq = 0;
|
||||
$ppSeq++;
|
||||
$ppId = 'pp' . $ppSeq;
|
||||
// 同一页多个实例要各有一套 id,否则 document.getElementById 全抓到第一个。
|
||||
//
|
||||
// ⚠️⚠️ 别用文件顶层的 `static $ppSeq` 做这个计数 —— PHP 里**被 include 的文件**顶层的
|
||||
// `static` 初值会**每次 include 都重新绑定**(与函数体内的 static 不同,那个才跨调用)。
|
||||
// 实测:同一页 include 三次,拿到的都是 pp1。资源页今天就有两处(归属人 + 共享给谁),
|
||||
// DOM 里两套 pp1 撞在一起,getElementById / `<label for>` / 任何按 id 取的元素都会指错。
|
||||
// 改成 $GLOBALS 计数:它才是**一次请求内真正跨 include 持续**的。
|
||||
$GLOBALS['ppSeq'] = ($GLOBALS['ppSeq'] ?? 0) + 1;
|
||||
$ppId = 'pp' . $GLOBALS['ppSeq'];
|
||||
$ppIsMulti = $ppMode === 'single' ? false : true;
|
||||
$ppInputType = $ppIsMulti ? 'checkbox' : 'radio';
|
||||
// ⚠️ 「已选」要按**非零**判断:筛选表单常用 0 表示「全部」,[0] 是个非空数组,
|
||||
|
||||
Reference in New Issue
Block a user