mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 19:19:19 +02:00
- Feature 1: public /licence.php fetches 'licenses' page from DB, renders Markdown - Feature 1: nav.php adds 'Licence' link with active state - Feature 2: Database::getPage(), savePage(), getAllPages() methods - Feature 2: bundled src/Parsedown.php (MIT, zero-dependency) - Feature 2: apropos.php now renders 'about' page content from DB via Parsedown - Feature 2: admin/pages.php (list) + admin/pages-edit.php (EasyMDE editor) - Feature 2: admin/actions/page.php (auth+CSRF+validation+save) - Feature 2: admin/head.php adds 'Pages statiques' nav link - Feature 3: storage/schema.sql seeds 8 CC license types - Feature 3: storage/migrations/003_seed_license_types.sql (applied to live DB) - Feature 3: Database::getLicenseTypes() / getAllLicenseTypes() - Feature 3: admin/add.php + formulaire.php: license_id field on add form - Feature 3: admin/edit.php: license_id field on edit form with raw FK lookup - Feature 3: tfe.php: shows 'Licence :' meta row when non-null - Feature 6: main.css: .card__media--gradient styles - Feature 6: index.php: deterministic HSL gradient placeholder cards - Feature 6: Database::getLatestYearTheses() + getLatestPublishedYear() - Feature 6: index.php default home = random latest-year theses with info label
145 lines
6.1 KiB
PHP
145 lines
6.1 KiB
PHP
<?php
|
||
// Load configuration
|
||
require_once __DIR__ . '/../config/bootstrap.php';
|
||
require_once APP_ROOT . '/src/Database.php';
|
||
|
||
$page = isset($_GET["page"]) ? max(1, intval($_GET["page"])) : 1;
|
||
$year = isset($_GET["year"]) ? intval($_GET["year"]) : null;
|
||
$itemsPerPage = 24;
|
||
|
||
// Default home view: random theses from latest year (no year filter, no explicit page)
|
||
$isDefaultView = (!$year && $page === 1);
|
||
|
||
try {
|
||
$db = Database::getInstance();
|
||
$offset = ($page - 1) * $itemsPerPage;
|
||
$availableYears = $db->getAvailableYears();
|
||
|
||
if ($year) {
|
||
$itemsToLoad = $db->searchTheses(['year' => $year], $itemsPerPage, $offset);
|
||
$totalItems = $db->countSearchResults(['year' => $year]);
|
||
} elseif ($isDefaultView) {
|
||
$latestYear = $db->getLatestPublishedYear();
|
||
$itemsToLoad = $db->getLatestYearTheses($itemsPerPage);
|
||
$totalItems = count($itemsToLoad); // no pagination on default view
|
||
} else {
|
||
$itemsToLoad = $db->getPublishedTheses($itemsPerPage, $offset);
|
||
$totalItems = $db->countPublishedTheses();
|
||
}
|
||
|
||
$totalPages = $isDefaultView ? 1 : (int)ceil($totalItems / $itemsPerPage);
|
||
} catch (Exception $e) {
|
||
error_log("Error loading theses: " . $e->getMessage());
|
||
$itemsToLoad = [];
|
||
$totalPages = 0;
|
||
$availableYears = [];
|
||
$totalItems = 0;
|
||
$latestYear = null;
|
||
$isDefaultView = false;
|
||
}
|
||
|
||
$currentNav = '';
|
||
?>
|
||
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>Posterg</title>
|
||
<link rel="icon" type="image/svg+xml" href="/assets/admin_favicon.svg">
|
||
<link rel="stylesheet" href="assets/modern-normalize.min.css">
|
||
<link rel="stylesheet" href="assets/common.css">
|
||
<link rel="stylesheet" href="assets/main.css">
|
||
<?php if (php_sapi_name() === 'cli-server'): ?>
|
||
<script>
|
||
(function poll() {
|
||
fetch('/live-reload.php').then(r=>r.json()).then(d=>{
|
||
if(d.changed) location.reload(); else setTimeout(poll,1000);
|
||
}).catch(()=>setTimeout(poll,2000));
|
||
})();
|
||
</script>
|
||
<?php endif; ?>
|
||
</head>
|
||
<body class="home-body">
|
||
|
||
<?php include APP_ROOT . '/templates/nav.php'; ?>
|
||
<?php include APP_ROOT . '/templates/search-bar.php'; ?>
|
||
|
||
<?php if ($year): ?>
|
||
<div class="filter-info">
|
||
Année : <?= htmlspecialchars($year) ?>
|
||
<a href="index.php" class="clear-filter">✕ Réinitialiser</a>
|
||
</div>
|
||
<?php elseif ($isDefaultView && !empty($latestYear)): ?>
|
||
<div class="filter-info home-latest-label">
|
||
Découvrez les TFE de <?= (int)$latestYear ?> — sélection aléatoire
|
||
</div>
|
||
<?php endif; ?>
|
||
|
||
<main class="home-main">
|
||
<div class="cards-container">
|
||
<?php foreach ($itemsToLoad as $item): ?>
|
||
<a href="tfe.php?id=<?= (int)$item["id"] ?>" class="card-link">
|
||
<div class="card">
|
||
<div class="card__media">
|
||
<?php
|
||
// Resolve thumbnail: banner_path → cover file → gradient placeholder
|
||
$thumb = null;
|
||
|
||
// 1. Banner path (dedicated home thumbnail)
|
||
if (!empty($item['banner_path'])) {
|
||
$thumb = $item['banner_path'];
|
||
}
|
||
|
||
// 2. Cover image from thesis_files (not returned by view — skip for now)
|
||
// 3. Fall through to gradient
|
||
?>
|
||
<?php if ($thumb): ?>
|
||
<img src="/media.php?path=<?= urlencode($thumb) ?>"
|
||
alt="<?= htmlspecialchars($item['title']) ?>"
|
||
loading="lazy">
|
||
<?php else: ?>
|
||
<?php
|
||
$hue = ($item['id'] * 47 + 160) % 360;
|
||
$hue2 = ($hue + 40) % 360;
|
||
?>
|
||
<div class="card__media--gradient"
|
||
style="background:linear-gradient(135deg,hsl(<?= $hue ?>,60%,65%),hsl(<?= $hue2 ?>,55%,45%));">
|
||
<span class="card__gradient-author"><?= htmlspecialchars($item['authors'] ?? '') ?></span>
|
||
<span class="card__gradient-title"><?= htmlspecialchars($item['title']) ?></span>
|
||
</div>
|
||
<?php endif; ?>
|
||
</div>
|
||
<div class="card__info">
|
||
<p class="authors"><?= htmlspecialchars($item["authors"] ?? '') ?><?php if (!empty($item['authors']) && !empty($item['title'])): ?> – <?php endif; ?><?= htmlspecialchars($item["title"]) ?></p>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<?php endforeach; ?>
|
||
|
||
<?php if (empty($itemsToLoad)): ?>
|
||
<p style="padding:2rem;color:#666;">Aucun mémoire trouvé.</p>
|
||
<?php endif; ?>
|
||
</div>
|
||
|
||
<?php if ($totalPages > 1): ?>
|
||
<div class="pagination-wrap">
|
||
<?php $yearParam = $year ? '&year=' . (int)$year : ''; ?>
|
||
<a href="?page=1<?= $yearParam ?>"
|
||
class="pagination-btn <?= $page <= 1 ? 'disabled' : '' ?>">«</a>
|
||
<a href="?page=<?= max(1, $page - 1) . $yearParam ?>"
|
||
class="pagination-btn <?= $page <= 1 ? 'disabled' : '' ?>">‹</a>
|
||
<span class="pagination-info">
|
||
<span class="page-current"><?= $page ?></span> / <?= $totalPages ?>
|
||
</span>
|
||
<a href="?page=<?= min($totalPages, $page + 1) . $yearParam ?>"
|
||
class="pagination-btn <?= $page >= $totalPages ? 'disabled' : '' ?>">›</a>
|
||
<a href="?page=<?= $totalPages . $yearParam ?>"
|
||
class="pagination-btn <?= $page >= $totalPages ? 'disabled' : '' ?>">»</a>
|
||
</div>
|
||
<?php endif; ?>
|
||
</main>
|
||
|
||
</body>
|
||
</html>
|