Файл: new_top/modules/home.php
Строк: 145
<?php
/**
* Home — Top-N with pagination, news, categories strip
*/
declare(strict_types=1);
$title = Database::fetchColumn('SELECT title FROM config WHERE id = 1') ?: 'Top System';
$pfMax = (int)(Database::fetchColumn('SELECT pf_max FROM config WHERE id = 1') ?: 100);
if ($pfMax < 1) {
$pfMax = 100;
}
$perPage = min(20, $pfMax);
$page = max(1, (int)($_GET['page'] ?? 1));
$totalActive = (int) Database::fetchColumn(
'SELECT COUNT(*) FROM platforms WHERE mode = 0 AND ban = 0'
);
$maxShow = min($totalActive, $pfMax);
$maxPage = max(1, (int)ceil($maxShow / $perPage));
if ($page > $maxPage) {
$page = $maxPage;
}
$offset = ($page - 1) * $perPage;
$limit = min($perPage, max(0, $maxShow - $offset));
$platforms = [];
if ($limit > 0) {
$platforms = Database::fetchAll(
'SELECT p.*, c.name AS cat_name
FROM platforms p
LEFT JOIN cat c ON c.id = p.cat_id
WHERE p.mode = 0 AND p.ban = 0
ORDER BY p.hs DESC, p.ht DESC
LIMIT ' . (int)$offset . ', ' . (int)$limit
);
}
$count = count($platforms);
$cats = Database::fetchAll(
'SELECT c.id, c.name,
(SELECT COUNT(*) FROM platforms p WHERE p.cat_id = c.id AND p.mode = 0 AND p.ban = 0) AS cnt
FROM cat c
WHERE (SELECT COUNT(*) FROM platforms p WHERE p.cat_id = c.id AND p.mode = 0 AND p.ban = 0) > 0
ORDER BY c.sort, c.name
LIMIT 12'
);
try { $news = Stats::latestNews(3); } catch (Throwable $e) { $news = []; }
?><!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<?= pwa_meta() ?>
<title>Топ-<?= (int)$pfMax ?> — <?= e($title) ?></title>
<link rel="stylesheet" href="/assets/css/style.css">
</head>
<body>
<div class="app">
<header class="topbar">
<div class="topbar-brand">
<div class="logo">T</div>
<span><?= e($title) ?></span>
</div>
<nav class="topbar-nav">
<a href="/" class="active">Топ</a>
<a href="/?module=cat">Категории</a>
<a href="/?module=search">Поиск</a>
<a href="/?module=rules">Правила</a>
<a href="/?module=office">Кабинет</a>
<?php if (!empty($_SESSION['user_level']) && (int)$_SESSION['user_level'] >= 9): ?>
<a href="/?module=admin">Админ</a>
<?php endif; ?>
</nav>
</header>
<h1 class="page-title">Топ-<?= (int)$pfMax ?></h1>
<p class="page-sub">
Лучшие площадки по хостам
<?php if ($totalActive > 0): ?> · в рейтинге <?= $totalActive ?><?php endif; ?>
<?php if ($maxPage > 1): ?> · стр. <?= $page ?>/<?= $maxPage ?><?php endif; ?>
</p>
<?php try { echo Ads::render('home_top'); } catch (Throwable $e) {} ?>
<div class="actions" style="margin-bottom:14px">
<a class="btn btn-accent btn-sm" href="/?module=rand">🎲 Случайный сайт</a>
<a class="btn btn-ghost btn-sm" href="/?module=rules">Правила</a>
<a class="btn btn-ghost btn-sm" href="/?module=search">Поиск</a>
</div>
<?php if ($news): ?>
<div class="card" style="margin-bottom:14px">
<h2 style="margin-bottom:10px">Новости</h2>
<?php foreach ($news as $n): ?>
<div style="padding:10px 0;border-bottom:1px solid var(--border)">
<strong><?= e($n['title']) ?></strong>
<div class="text-muted" style="font-size:.78rem;margin:4px 0"><?= date('d.m.Y H:i', (int)$n['time_add']) ?></div>
<div style="font-size:.9rem;color:var(--text-muted)"><?= nl2br(e(mb_substr($n['text'], 0, 280))) ?></div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php if ($cats): ?>
<div class="tabs" style="margin-bottom:14px">
<a class="active" href="/">Все</a>
<?php foreach ($cats as $c): ?>
<a href="/?module=cat&id=<?= (int)$c['id'] ?>"><?= e($c['name']) ?></a>
<?php endforeach; ?>
<a href="/?module=cat">Ещё →</a>
</div>
<?php endif; ?>
<?php if ($count === 0): ?>
<div class="empty">
<div class="empty-icon">📡</div>
<div>Список площадок пуст</div>
<p class="text-muted" style="margin-top:8px;font-size:.85rem">Добавьте первую через личный кабинет</p>
<a href="/?module=office" class="btn btn-primary" style="margin-top:16px">Открыть кабинет</a>
</div>
<?php else: ?>
<div class="rank-list">
<?php foreach ($platforms as $i => $p):
$pos = $offset + $i + 1;
$isGold = (int)$p['gold'] > time();
$cardClass = 'rank-card';
if ($pos === 1) $cardClass .= ' top1';
elseif ($pos === 2) $cardClass .= ' top2';
elseif ($pos === 3) $cardClass .= ' top3';
if ($isGold) $cardClass .= ' gold';
?>
<article class="<?= $cardClass ?>">
<div class="rank-pos"><?= $pos ?></div>
<div class="rank-body">
<div class="rank-url">
<a href="/in/<?= (int)$p['id'] ?>" target="_blank" rel="nofollow noopener">
<?= e($p['url']) ?>
</a>
<?php if ($isGold): ?>
<span class="badge-gold">★ Gold</span>
<?php endif; ?>
</div>
<?php if ($p['message'] !== ''): ?>
<div class="rank-msg"><?= e($p['message']) ?></div>
<?php endif; ?>
<div class="rank-meta">
<?php if (!empty($p['cat_name'])): ?>
<a class="chip" href="/?module=cat&id=<?= (int)$p['cat_id'] ?>"><?= e($p['cat_name']) ?></a>
<?php endif; ?>
<a class="chip" href="/?module=stats&id=<?= (int)$p['id'] ?>">📊 стат</a>
</div>
</div>
<div class="rank-stats">
<div class="stat-label">хосты</div>
<div class="stat-hs"><?= number_format((int)$p['hs'], 0, '', ' ') ?></div>
<div class="stat-ht"><?= number_format((int)$p['ht'], 0, '', ' ') ?> хитов</div>
</div>
</article>
<?php endforeach; ?>
</div>
<?php if ($maxPage > 1): ?>
<div class="actions" style="justify-content:center;margin-top:16px;flex-wrap:wrap">
<?php if ($page > 1): ?>
<a class="btn btn-ghost btn-sm" href="/?page=<?= $page - 1 ?>">← Назад</a>
<?php endif; ?>
<span class="text-muted" style="padding:8px 12px;font-size:.85rem"><?= $page ?> / <?= $maxPage ?></span>
<?php if ($page < $maxPage): ?>
<a class="btn btn-ghost btn-sm" href="/?page=<?= $page + 1 ?>">Вперёд →</a>
<?php endif; ?>
</div>
<?php endif; ?>
<?php endif; ?>
<?php try { echo Ads::render('home_bottom'); } catch (Throwable $e) {} ?>
<?php try { echo Ads::render('global_footer'); } catch (Throwable $e) {} ?>
<footer class="site-footer">
Топ-<?= (int)$pfMax ?> · <a href="/?module=cat">Категории</a> · <a href="/?module=rules">Правила</a>
</footer>
</div>
<?= pwa_register() ?>
</body>
</html>