query("SELECT * FROM groups WHERE is_visible=1 AND display='grid' ORDER BY sort_order, id")->fetchAll(); $tabGroups = $pdo->query("SELECT * FROM groups WHERE is_visible=1 AND display='tabs' ORDER BY sort_order, id")->fetchAll(); $engines = $pdo->query("SELECT * FROM engines WHERE is_active=1 ORDER BY sort_order, id")->fetchAll(); // 合集区的显示方式(后台「设置 → 合集显示方式」): // tabs = 标签页折叠(默认)—— 一次只平铺当前这一个合集 // flat = 全部平铺 —— 每个合集各占一块,一眼看全、不用点 $collLayout = setting('collections_layout', 'tabs') === 'flat' ? 'flat' : 'tabs'; /** 站点链接与顶部搜索框的打开方式(后台「设置 → 打开方式」) * 返回 `_blank`(新标签页,默认,等同改造前的旧行为)或 `_self`(当前页面)。 * ⚠️ 搜索框与站点格必须共用这一个来源,不要在任何一处写死 target。 */ function open_target(): string { return setting('open_blank', '1') === '1' ? '_blank' : '_self'; } $openTarget = open_target(); $openMode = $openTarget === '_blank' ? 'blank' : 'self'; // 联想词的选中按键(后台「设置 → 联想词按键」): // both = ↓/↑ 与 , . 都认(默认) / arrows = 只认 ↓/↑ / punct = 只认 , 和 . // 白名单回退:任何非法值都回到 both(默认值,与 db.php 一致),别让手改库/被篡改的表单把交互搞坏。 $suggestKeys = setting('suggest_keys', 'both'); if (!in_array($suggestKeys, ['arrows', 'punct', 'both'], true)) { $suggestKeys = 'both'; } // 默认引擎 $defSlug = setting('default_engine', 'bing'); $default = null; foreach ($engines as $en) { if ($en['slug'] === $defSlug) { $default = $en; break; } } if ($default === null) { $default = $engines[0] ?? null; } $primary = setting('primary_color', '#2F6BF7'); // 副标题(后台「设置 → 副标题」)。 // ⚠️ 允许为空:用户清空后就**不显示**副标题,不要回退成默认文案 —— // 这正是 bug 的现场(原先空串被当成「未设置」,删了照样显示)。 // 空串原样取出(默认值取 ''),渲染处再按需判断是否输出。 $subtitle = setting('subtitle', ''); function sites_of(int $gid): array { $st = db()->prepare("SELECT * FROM sites WHERE group_id=? AND is_visible=1 ORDER BY sort_order, id"); $st->execute([$gid]); return $st->fetchAll(); } function site_label(array $s): string { return $s['short_name'] !== '' ? $s['short_name'] : ($s['name'] !== '' ? $s['name'] : domain_of($s['url'])); } /** 渲染一个网站格(网格板块与合集共用) */ function site_tile(array $s): void { $label = site_label($s); $src = icon_src($s['icon']); // 打开方式与顶部搜索框同源(见 open_target()):新标签页 or 当前页面 $tgt = open_target(); ?>
  • title="">
  • <?= e(site_name()) ?><?= $subtitle !== '' ? ' · ' . e($subtitle) : '' ?>

    $g, 'items' => $items]; } } ?>
    合集
    $c): ?>
    $c): ?>