站点列表 * @param array $engines 我的搜索引擎 * @param array $navSet 我的导航设置 * @param string $phrase 我的短语(空 = 还没设,展示页不可用) * @param string $showUrl 展示页完整地址(短语为空时是空串) * @param string $meAvatar 我的头像地址 */ $canWrite = \App\Auth::canWrite(); $editSite = null; $editGroup = null; $editEngine = null; // 点「编辑」时用 ?edit_site=12 / edit_group=3 / edit_engine=5 带出既有值 $eSite = (int)($_GET['edit_site'] ?? 0); $eGrp = (int)($_GET['edit_group'] ?? 0); $eEng = (int)($_GET['edit_engine'] ?? 0); foreach ($sitesBy as $gid => $rows) { foreach ($rows as $r) { if ((int)$r['id'] === $eSite) { $editSite = $r; } } } foreach ($allGroups as $g) { if ((int)$g['id'] === $eGrp) { $editGroup = $g; } } foreach ($engines as $e) { if ((int)$e['id'] === $eEng) { $editEngine = $e; } } $sc = static fn($k, $d = '') => (string)($navSet[$k] ?? $d); /* 🔴 v28 用户第 11 条:「导航模块,右上角增加设置按钮,和其他模块一样。 把导航展示地址,放进去,把导航设置,放进去,把板块设置,放进去, 把搜索引擎的设置,也放进去,你参考一下之前的导航系统 simplenav, 把之前的那些设置,都放在设置中,进来之后,默认就是添加网址,和所有网址的列表。」 ⇒ 两种视图,用 `?set=1` 切(服务端渲染,无 JS 也能切;刷新/回退都不丢状态): · 默认(`?set` 空):**只显示「新增站点」+「站点列表」** —— 日常真正要用的两件事; · 设置(`?set=1`):展示地址 / 导航设置 / 板块 / 搜索引擎 四块。 ⚠️ 为什么用查询参数而不是 JS 折叠:设置项里有表单(保存后会 302 回本页), 用 JS 折叠的话每次保存回来都会**自动摊开全部设置**,用户还要再收一次。 用参数就能让"保存后回到设置页"(下面的表单里保留了 `set=1` 的隐藏域)。 ⚠️ 保留 `$editSite` 等编辑态:正在编辑某个站点/板块/引擎时,**强制显示设置视图**, 否则用户点"编辑板块"会看到一个没有板块表单的页面(看起来像功能坏了)。 */ /* 🔴🔴 v29 用户第 5 条:「导航的设置,做成设置按钮,点击后,拉下来设置选项, 分别是地址设置、导航设置、板块设置、搜索引擎设置,把现在的设置页面,拆开, 放在不同的设置选项下。」 ⇒ 从"一个大的设置页"改成**下拉菜单 + 四个独立视图**: · `?set=addr` 地址设置(展示页地址 + 短语) · `?set=general` 导航设置(标题/搜索引擎/布局等,原 SimpleNav 的 settings) · `?set=board` 板块设置 · `?set=engine` 搜索引擎设置 · 不带 `set` 默认:新增网址 + 网址列表 ⚠️ 为什么拆开(而不只是把四块堆在一个?"设置页"里): 用户点的原话就是"拆开"。而且四块各自是**独立表单**,堆在一页里 每次保存后 302 回来都要重新找自己在哪一块。分开之后 "你在哪一块"由 URL 决定,保存后回到原地,位置感清楚。 ⚠️ 用**链接**(服务端渲染)而不是 JS 下拉切换内容: 与 v28 的 `?set=1` 同一理由 —— 设置里有表单,保存会 302 回来, 纯 JS 的展开状态在刷新后就丢了。`
` 只负责"菜单展开"这一个动效, 点条目是**真实导航**(URL 变、视图变、刷新/回退都不丢)。 ⚠️ 编辑态(正在编辑某板块/某引擎)要落到对应的那个视图里, 否则用户点"编辑板块"会看到一个没有板块表单的页面(看起来像功能坏了)。 */ $setKey = (string)($_GET['set'] ?? ''); if ($editGroup !== null) { $setKey = 'board'; } if ($editEngine !== null) { $setKey = 'engine'; } $inSettings = in_array($setKey, ['addr', 'general', 'board', 'engine'], true); /* 设置项的登记表(菜单与"当前在哪一项"的标题都读它,只有一份) */ $setItems = [ 'addr' => ['地址设置', 'M2.5 4h11M2.5 8h7M2.5 12h9'], 'general' => ['导航设置', 'M8 5.5a2.5 2.5 0 100 5 2.5 2.5 0 000-5z M8 1.5v1.6M8 12.9v1.6M1.5 8h1.6M12.9 8h1.6M3.4 3.4l1.1 1.1M11.5 11.5l1.1 1.1M12.6 3.4l-1.1 1.1M4.5 11.5l-1.1 1.1'], 'board' => ['板块设置', 'M2 3.5h4v4H2zM10 3.5h4v4h-4zM2 9.5h4v4H2zM10 9.5h4v4h-4z'], 'engine' => ['搜索引擎设置', 'M7 2.5a4.5 4.5 0 100 9 4.5 4.5 0 000-9z M10.4 10.4L14 14'], ]; ?>

← 回到网址列表 你个人用的网址导航 · 每人一份
` 样式,迟早跟那边不一致。 🔴🔴 v30 用户第 3 条:「导航模块的设置按钮,右上角,不要用文字, 和其他的模块一样,三个横线那个图标。」 ⇒ summary 换成与其他七个模块**逐字节相同**的形态: `class="btn btn-icon"` + 一个 path 里的三条横线(☰)。 ⚠️ 三处必须一起改,少一处就是"看着像改了、其实没改": `btn-ghost btn-sm` → **`btn-icon`**(纯图标方形,高度取 --act-h); 删掉「设置」二字(文字会把方块撑成一行,`.btn-icon` 的 width 形同虚设); 图标换成 ☰(原来是单个向下的箭头,那是"展开"的意思,不是"设置")。 ⚠️ 宽度固定为 --act-h 之后,`.btn-icon` 的 `padding:0 !important` 才会生效 —— 仍带 `.btn-sm` 会让它在页头动作区里矮一截(部署脚本有一条专门守这个)。 */ ?>

导航设置

展示页最上方的大标题。
留空就不显示(不会自动填回默认值)。
在展示页的搜索框里,用哪组键选中联想词。

站点列表 按住左边的 ⋮⋮ 可以拖动排序

还没有站点。上面「新增站点」加一个吧。

` 探针证明执行根本没走到 409 行)。 ⇒ 「非设置态才显示」只该管**站点编辑 + 站点列表**这两块(见 v29 第 5 条), 设置类视图(addr/general/board/engine)各自独立、不受它管。 */ ?>

板块列表 拖动排序

百度是 wd,搜狗是 query,多数是 q。
用 {q} 占位关键词;留空 = 这个引擎没有联想。
这些接口对**所有用户**都可见、可直接选用。国内网络下不可达的 (谷歌 / DuckDuckGo)没有列进来 —— 选了也只会永远是空下拉。

搜索引擎列表

内置了必应 / 百度 / 360 三档(国内可用)。谷歌 / 搜狗 / DuckGo 也列在下面, 但它们的联想或搜索在国内网络下不可用,所以默认未启用。 展示页顶部那排标签,就是这里已启用的引擎。

已有的不会被改动(你改过的地址、颜色都保留)。