Files
xamxam/templates/partials/pagination.php
Pontoporeia 7834d88873 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.
2026-04-02 12:20:31 +02:00

62 lines
2.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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>