From 50286e5327bdbb3a39d5a1391d9842f3c1fd6d3f Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 5 Nov 2026 20:15:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=EF=BC=9Apanel=5Fsav?= =?UTF-8?q?e=20/=20Task::setAttrs=20=E6=94=AF=E6=8C=81=20repeat=5Frule=20(?= =?UTF-8?q?#83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 配合网页端与鸿蒙端把「循环」改成可编辑。 ① Task::setAttrs() 新增 repeat_rule 分支 只写 repeat_rule 一列(与 due_at / category_id / title / note 同一套 按 `array_key_exists` 判"传没传"的逻辑)。 ⚠️ 白名单校验:只接受 `self::REPEAT` 里有的键,其余一律存 NULL。 不校验的话前端传个乱值就进库了,`repeatWord()` 会显示成空白, 而且 `spawnNext` 那种"按规则生成下一次"的地方会静默不工作。 ⚠️ 空串 = 不循环,存 NULL(与 `update()` 的 `?: null` 同口径)。 ② index.php 的 tasks/panel_save 接收 repeat_rule 同一套 `array_key_exists` 语义:表单没带就不动(保留原值), 带了才更新 —— 这样"只改标题"的调用方不会把循环规则清掉。 实测: 设 repeat_rule=week => [week] ✅ 标题未被破坏 ✅ 设非法值 hacked_value => [NULL] ✅ 已拦下 只改 due_at => repeat_rule 不变 ✅ category_id 保留 ✅ --- app/Task.php | 10 ++++++++++ index.php | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/app/Task.php b/app/Task.php index 6696d24..d3af753 100644 --- a/app/Task.php +++ b/app/Task.php @@ -788,6 +788,16 @@ final class Task $sets[] = 'category_id = ?'; $args[] = self::categoryIdOf($familyId, (int)($d['category_id'] ?? 0)); } + /* 🔴 #83(用户 2026-11-05):「分类和重复,也就是循环,都需要加上。」 + ⇒ 面板里改成可编辑之后,得有一条能只写 repeat_rule 的路径。 + ⚠️ 空串 = 不循环,存 NULL(与 `Task::update()` 的 `?: null` 同一口径)。 + ⚠️ 白名单校验:只接受 `REPEAT` 里有的键,其余一律当"不循环"。 + 不校验的话,前端传个乱值会进库,`repeatWord()` 那边就显示成空白。 */ + if (array_key_exists('repeat_rule', $d)) { + $sets[] = 'repeat_rule = ?'; + $rr = trim((string)($d['repeat_rule'] ?? '')); + $args[] = ($rr !== '' && isset(self::REPEAT[$rr])) ? $rr : null; + } /* 🔴 #78(用户 2026-11-05):「现在在首页上点一个任务,直接就是编辑页面啊。 所以不需要再加一个编辑按钮了。」 ⇒ 删掉「编辑」按钮后,标题/备注也得能在这里改。 diff --git a/index.php b/index.php index 4cd0dcb..a90d841 100644 --- a/index.php +++ b/index.php @@ -7367,6 +7367,11 @@ $want = array_keys($want); if (array_key_exists('category_id', $_POST)) { $sd['category_id'] = (int)$_POST['category_id']; } + /* #83:循环(重复规则)。与上面几个同一套 `array_key_exists` 语义 —— + 表单没带这个字段就**不动**(保留原值),带了才更新(空串 = 不循环)。 */ + if (array_key_exists('repeat_rule', $_POST)) { + $sd['repeat_rule'] = trim((string)$_POST['repeat_rule']); + } /* 🔴 #78(用户 2026-11-05):「现在在首页上点一个任务,直接就是编辑页面啊。 所以不需要再加一个编辑按钮了。」 ⇒ 既然要删掉「编辑」按钮,标题和备注必须能在这里改。