mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 11:09:18 +02:00
Replace 6 CSS class selectors across tfe.css, main.css, and search.css with semantic element-based selectors, removing the corresponding classes from the HTML templates entirely. tfe.css: - .tfe-meta-list → article dl / article dl > div / article dl dt / article dl dd - .tfe-media-block → aside figure (+ img, video, embed children) - .tfe-file-caption → aside figcaption main.css: - .card__media → .home-body figure (+ img/video children and hover/motion rules) - .card__caption → .home-body li > a > p search.css: - .repertoire-col > h2 → .repertoire-index section > h2 Template changes: - tfe.php: removed class= from <dl>, <figure>, and <figcaption> - index.php: removed class= from <figure> and <p class=card__caption>; stripped orphaned card__media from the gradient <div> (only --gradient needed) No visual change — selectors match the same elements as before since the semantic HTML was already in place from prior refactoring work.
166 lines
7.1 KiB
PHP
166 lines
7.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);
|
||
|
||
// Batch-load cover images for theses that have no banner_path
|
||
$coverMap = [];
|
||
if (!empty($itemsToLoad)) {
|
||
$needCover = array_column(
|
||
array_filter($itemsToLoad, fn($t) => empty($t['banner_path'])),
|
||
'id'
|
||
);
|
||
$coverMap = $db->getCoverPathsForTheses($needCover);
|
||
}
|
||
} catch (Exception $e) {
|
||
error_log("Error loading theses: " . $e->getMessage());
|
||
$itemsToLoad = [];
|
||
$totalPages = 0;
|
||
$availableYears = [];
|
||
$totalItems = 0;
|
||
$latestYear = null;
|
||
$isDefaultView = false;
|
||
$coverMap = [];
|
||
}
|
||
|
||
$currentNav = '';
|
||
$pageTitle = 'Posterg – Mémoires de l\'ERG';
|
||
$metaDescription = 'Posterg répertorie et valorise les mémoires de fin d\'études (TFE) de l\'erg – École de Recherches Graphiques de Bruxelles.';
|
||
$ogTags = [
|
||
'type' => 'website',
|
||
'title' => $pageTitle,
|
||
'description' => $metaDescription,
|
||
'url' => 'https://posterg.erg.be/',
|
||
'site_name' => 'Posterg – ERG',
|
||
];
|
||
$extraCss = ['/assets/css/main.css'];
|
||
$bodyClass = 'home-body';
|
||
?>
|
||
<?php include APP_ROOT . '/templates/head.php'; ?>
|
||
<?php include APP_ROOT . '/templates/header.php'; ?>
|
||
|
||
<?php if ($year): ?>
|
||
<p class="filter-info" role="status">
|
||
Année : <?= htmlspecialchars($year) ?>
|
||
<a href="index.php" class="clear-filter"><span aria-hidden="true">✕</span> Réinitialiser</a>
|
||
</p>
|
||
<?php elseif ($isDefaultView && !empty($latestYear)): ?>
|
||
<p class="filter-info home-latest-label" role="status">
|
||
Découvrez les TFE de <?= (int)$latestYear ?> — sélection aléatoire
|
||
</p>
|
||
<?php endif; ?>
|
||
|
||
<main class="home-main" id="main-content">
|
||
<h1 class="sr-only">Mémoires de l'ERG</h1>
|
||
<ul class="cards-container">
|
||
<?php foreach ($itemsToLoad as $item): ?>
|
||
<li class="card">
|
||
<a href="tfe.php?id=<?= (int)$item["id"] ?>">
|
||
<?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 (batch-loaded above)
|
||
if (!$thumb && isset($coverMap[$item['id']])) {
|
||
$thumb = $coverMap[$item['id']];
|
||
}
|
||
|
||
// 3. Fall through to gradient
|
||
?>
|
||
<?php if ($thumb): ?>
|
||
<figure>
|
||
<img src="/media.php?path=<?= urlencode($thumb) ?>"
|
||
alt="Couverture — <?= htmlspecialchars($item['title']) ?> par <?= htmlspecialchars($item['authors'] ?? '') ?>"
|
||
loading="lazy">
|
||
</figure>
|
||
<?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 ?>,55%,40%),hsl(<?= $hue2 ?>,50%,28%));"
|
||
aria-hidden="true">
|
||
<span class="card__gradient-author"><?= htmlspecialchars($item['authors'] ?? '') ?></span>
|
||
<span class="card__gradient-title"><?= htmlspecialchars($item['title']) ?></span>
|
||
</div>
|
||
<?php endif; ?>
|
||
<p><?= htmlspecialchars($item["authors"] ?? '') ?><?php if (!empty($item['authors']) && !empty($item['title'])): ?> – <?php endif; ?><?= htmlspecialchars($item["title"]) ?></p>
|
||
</a>
|
||
</li>
|
||
<?php endforeach; ?>
|
||
|
||
<?php if (empty($itemsToLoad)): ?>
|
||
<li class="cards-empty">Aucun mémoire trouvé.</li>
|
||
<?php endif; ?>
|
||
</ul>
|
||
|
||
<?php if ($totalPages > 1): ?>
|
||
<nav class="pagination-wrap" aria-label="Pagination">
|
||
<?php $yearParam = $year ? '&year=' . (int)$year : ''; ?>
|
||
<ul>
|
||
<li>
|
||
<a href="?page=1<?= $yearParam ?>"
|
||
class="pagination-btn <?= $page <= 1 ? 'disabled' : '' ?>"
|
||
<?= $page <= 1 ? 'aria-disabled="true" tabindex="-1"' : '' ?>
|
||
aria-label="Première page">«</a>
|
||
</li>
|
||
<li>
|
||
<a href="?page=<?= max(1, $page - 1) . $yearParam ?>"
|
||
class="pagination-btn <?= $page <= 1 ? 'disabled' : '' ?>"
|
||
<?= $page <= 1 ? 'aria-disabled="true" tabindex="-1"' : '' ?>
|
||
aria-label="Page précédente">‹</a>
|
||
</li>
|
||
<li class="pagination-info" aria-current="page">
|
||
<span class="page-current"><?= $page ?></span> / <?= $totalPages ?>
|
||
</li>
|
||
<li>
|
||
<a href="?page=<?= min($totalPages, $page + 1) . $yearParam ?>"
|
||
class="pagination-btn <?= $page >= $totalPages ? 'disabled' : '' ?>"
|
||
<?= $page >= $totalPages ? 'aria-disabled="true" tabindex="-1"' : '' ?>
|
||
aria-label="Page suivante">›</a>
|
||
</li>
|
||
<li>
|
||
<a href="?page=<?= $totalPages . $yearParam ?>"
|
||
class="pagination-btn <?= $page >= $totalPages ? 'disabled' : '' ?>"
|
||
<?= $page >= $totalPages ? 'aria-disabled="true" tabindex="-1"' : '' ?>
|
||
aria-label="Dernière page">»</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
<?php endif; ?>
|
||
</main>
|
||
|
||
<?php include APP_ROOT . '/templates/footer.php'; ?>
|