Extract pagination into templates/partials/pagination.php

The pagination nav was duplicated between public/index.php and public/search.php
with structural differences: index.php used string concatenation for query params
and had first/last-page buttons (« »); search.php used http_build_query but had
only prev/next (‹ ›) and a flat <span> rather than a <ul>/<li> structure.

- Add templates/partials/pagination.php: accepts $page, $totalPages, $baseParams[]
  (any array of query params to preserve); builds URLs with http_build_query;
  renders a semantic <nav>/<ul>/<li> block with first/prev/info/next/last buttons,
  correct aria-disabled + tabindex on disabled links, and aria-label on each button.
  Returns immediately (no output) when $totalPages <= 1.

- Replace inline pagination block in index.php with:
    $baseParams = array_filter(['year' => $year]);
    include pagination.php

- Replace inline pagination block in search.php with:
    $baseParams = array_diff_key($_GET, ['page' => '']);
    include pagination.php
  This also upgrades search.php to the full first/last button set it was missing.

Both callers verified with php -l. No functional change to existing behaviour.
This commit is contained in:
Pontoporeia
2026-04-02 12:20:31 +02:00
parent 0ab08f3aa0
commit 7834d88873
4 changed files with 72 additions and 49 deletions

View File

@@ -0,0 +1,61 @@
<?php
/**
* Pagination partial
*
* Required variables (set before include):
* int $page — current page (1-based)
* int $totalPages — total number of pages
* array $baseParams — query-string params preserved across page links
* (e.g. ['year' => 2024, 'query' => 'design'])
* The 'page' key is injected automatically; do not include it.
*
* Usage:
* <?php $baseParams = array_filter(['year' => $year]); ?>
* <?php include APP_ROOT . '/templates/partials/pagination.php'; ?>
*/
if (!isset($page, $totalPages) || $totalPages <= 1) {
return; // nothing to render
}
$baseParams = isset($baseParams) && is_array($baseParams) ? $baseParams : [];
/** Build a URL for a given target page, preserving all base params. */
$paginationUrl = static function(int $targetPage) use ($baseParams): string {
return '?' . http_build_query(array_merge($baseParams, ['page' => $targetPage]));
};
$atFirst = $page <= 1;
$atLast = $page >= $totalPages;
?>
<nav class="pagination-wrap" aria-label="Pagination">
<ul>
<li>
<a href="<?= $paginationUrl(1) ?>"
class="pagination-btn<?= $atFirst ? ' disabled' : '' ?>"
<?= $atFirst ? 'aria-disabled="true" tabindex="-1"' : '' ?>
aria-label="Première page">«</a>
</li>
<li>
<a href="<?= $paginationUrl(max(1, $page - 1)) ?>"
class="pagination-btn<?= $atFirst ? ' disabled' : '' ?>"
<?= $atFirst ? '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="<?= $paginationUrl(min($totalPages, $page + 1)) ?>"
class="pagination-btn<?= $atLast ? ' disabled' : '' ?>"
<?= $atLast ? 'aria-disabled="true" tabindex="-1"' : '' ?>
aria-label="Page suivante"></a>
</li>
<li>
<a href="<?= $paginationUrl($totalPages) ?>"
class="pagination-btn<?= $atLast ? ' disabled' : '' ?>"
<?= $atLast ? 'aria-disabled="true" tabindex="-1"' : '' ?>
aria-label="Dernière page">»</a>
</li>
</ul>
</nav>