v2.0.0.1
Publisium
- <?php
-
- declare(strict_types=1);
-
- require_once __DIR__ . '/includes/config.php';
- require_once __DIR__ . '/includes/database.php';
- require_once __DIR__ . '/includes/user-auth.php';
- require_once __DIR__ . '/includes/language.php';
- require_once __DIR__ . '/includes/site-front.php';
- require_once __DIR__ . '/includes/pagination.php';
- require_once __DIR__ . '/includes/article-card.php';
- require_once __DIR__ . '/includes/featured-banner.php';
-
- UserAuth::boot();
-
- $db = Database::site();
- $settings = SiteFront::settings();
-
- $source = (string) ($_GET['source'] ?? '');
- $page = Pagination::currentPage();
-
- if ($source === 'category') {
- $slug = trim((string) ($_GET['slug'] ?? ''));
-
- $categoryStatement = $db->prepare('SELECT id FROM categories WHERE slug = :slug LIMIT 1');
- $categoryStatement->execute(['slug' => $slug]);
- $category = $categoryStatement->fetch();
-
- if (!$category) {
- http_response_code(404);
- exit;
- }
-
- $perPage = max(1, (int) $settings['articles_per_page_category']);
- $offset = Pagination::offset($page, $perPage);
-
- $totalStatement = $db->prepare("SELECT COUNT(*) AS c FROM articles a WHERE a.status = 'published' AND a.category_id = :category_id" . Languages::articleFilterSql('a'));
- $totalStatement->execute(['category_id' => $category['id']]);
- $totalArticles = (int) $totalStatement->fetch()['c'];
- if (($settings['article_loading_mode'] ?? 'scroll') === 'static') {
- $perPage = max(1, $totalArticles);
- $page = 1;
- $offset = 0;
- }
-
- $articlesStatement = $db->prepare(
- "SELECT a.* FROM articles a WHERE a.status = 'published' AND a.category_id = :category_id" . Languages::articleFilterSql('a') . " ORDER BY a.published_at DESC LIMIT :limit OFFSET :offset"
- );
- $articlesStatement->bindValue('category_id', $category['id'], PDO::PARAM_INT);
- $articlesStatement->bindValue('limit', $perPage, PDO::PARAM_INT);
- $articlesStatement->bindValue('offset', $offset, PDO::PARAM_INT);
- $articlesStatement->execute();
- $articles = Languages::articles($articlesStatement->fetchAll());
-
- $baseUrl = 'category.php';
- $extraParams = ['slug' => $slug];
- } elseif ($source === 'home') {
- $excludedIds = featuredExcludedIds($settings, Languages::onlyTranslated(featuredBannerArticles($db, $settings)));
- $excludeSql = (empty($excludedIds) ? '' : ' AND a.id NOT IN (' . implode(',', $excludedIds) . ')') . Languages::articleFilterSql('a');
-
- $perPage = max(1, (int) $settings['articles_per_page_home']);
- $offset = Pagination::offset($page, $perPage);
-
- $totalArticles = (int) $db->query("SELECT COUNT(*) AS c FROM articles a WHERE a.status = 'published'" . $excludeSql)->fetch()['c'];
- if (($settings['article_loading_mode'] ?? 'scroll') === 'static') {
- $perPage = max(1, $totalArticles);
- $page = 1;
- $offset = 0;
- }
-
- $articlesStatement = $db->prepare(
- "SELECT a.*, c.name AS category_name, c.slug AS category_slug FROM articles a LEFT JOIN categories c ON c.id = a.category_id WHERE a.status = 'published'" . $excludeSql . " ORDER BY a.published_at DESC LIMIT :limit OFFSET :offset"
- );
- $articlesStatement->bindValue('limit', $perPage, PDO::PARAM_INT);
- $articlesStatement->bindValue('offset', $offset, PDO::PARAM_INT);
- $articlesStatement->execute();
- $articles = Languages::articles($articlesStatement->fetchAll());
-
- $baseUrl = SiteFront::homeUrl();
- $extraParams = [];
- } else {
- http_response_code(400);
- exit;
- }
-
- $totalPages = Pagination::totalPages($totalArticles, $perPage);
-
- header('Content-Type: text/html; charset=utf-8');
-
- if (Languages::current() !== '') {
- ob_start([Languages::class, 'absolutizeUrls']);
- }
-
- foreach ($articles as $article) {
- echo renderArticleCard($article);
- }
-
- echo Pagination::render($settings['pagination_style'], $baseUrl, $page, $totalPages, $extraParams, 'article-list');
-