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'; // 默认引擎 $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'); 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()) ?> · <?= e(setting('subtitle', '个人网站导航')) ?>

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