Skip to content

Instantly share code, notes, and snippets.

@aktolu
Last active August 29, 2023 12:56
Show Gist options
  • Save aktolu/8389040d298a2ad718c4e932bc2b109e to your computer and use it in GitHub Desktop.
Save aktolu/8389040d298a2ad718c4e932bc2b109e to your computer and use it in GitHub Desktop.
PHP Pagination
<?php
function pagination(int $totalResults, int $activePage, int $resultsPerPage = 12, int $maxPage = 5):stdClass {
// return için hazırlık yapıyoruz
$return = new stdClass();
$return->totalResults = $totalResults;
$return->activePage = $activePage;
$return->resultsPerPage = $resultsPerPage;
// Toplam sayfa sayısını hesaplıyoruz, ve küsüratlı olması durumunda yukarı yuvarlıyoruz
$return->numberOfPages = (int)ceil($totalResults / $resultsPerPage);
// sayfaları
$return->startSQL = (int)ceil(($activePage-1) * $resultsPerPage);
$return->start = $totalResults > 0 ? $return->startSQL + 1 : 0;
$return->end = min($activePage * $resultsPerPage, $totalResults);
$return->limit = $return->startSQL.', '.$resultsPerPage;
// Eğer hesaplama birden fazla sayfa olduğunu söylüyorsa, HTML çıktısı için verileri hazırlıyoruz
// Toplam sonuç sayısı 1 sayfadan fazla değilse HTML çıktısını göstermeyeceğiz
if ($totalResults > $resultsPerPage) {
$maxPageHalf = floor($maxPage/2);
$links = [];
$links['firstPage'] = $activePage - $maxPageHalf > 1 ? 1 : false;
$links['previousPage'] = $activePage > 1 ? $activePage - 1 : false;
$links['nextPage'] = $return->numberOfPages > $activePage ? $activePage + 1 : false;
$links['lastPage'] = $return->numberOfPages - $maxPageHalf > $activePage ? $return->numberOfPages : false;
$links['pages'] = [];
$filters = [
'min' => $activePage - $maxPageHalf,
'max' => $activePage + $maxPageHalf,
];
for ($i = 1; $i <= $return->numberOfPages; $i++) {
if ($i < $filters['min'] || $i > $filters['max']) continue;
$links['pages'][] = [
'page' => $i,
'active' => $i === $activePage,
];
}
$return->links = $links;
} else {
$return->links = [];
}
return $return;
}
<?php
function paginationHTML2(array $links, string $url):string {
$return = '';
// Eğer birden fazla sayfa sayısı yoksa, buraya boş bir dizi(array) gelecektir
// Bu durumda html çıktısını boş göndereceğiz
if (count($links)) {
// Pagination itemlerinin dışındaki kapsayıcı html kısmını yazıyoruz
// Örneğimizde Bootstrap 5 kullanıyoruz, ama siz kendi projenize göre class'ları düzenleyebilirsiniz
$return .= '<nav aria-label="'.l('Navigation').'"><ul class="pagination justify-content-center">';
if ($links['firstPage']) {
$href = str_replace('{p}', $links['firstPage'], $url);
$return .= '<li class="page-item"><a href="'.$href.'" class="page-link prev">&laquo;</a></li>';
}
if ($links['previousPage']) {
$href = str_replace('{p}', $links['previousPage'], $url);
$return .= '<li class="page-item"><a href="'.$href.'" class="page-link prev">&lsaquo;</a></li>';
}
foreach ($links['pages'] as $item) {
$href = str_replace('{p}', $item['page'], $url);
$c = [
'li' => $item['active'] ? ' class="page-item disabled"' : ' class="page-item"',
'a' => $item['active'] ? ' href="'.$href.'" onclick="return false" class="page-link" tabindex="-1"' : ' href="'.$href.'" class="page-link"',
];
$return .= '<li'.$c['li'].'><a'.$c['a'].'>'.$item['page'].'</a></li>';
}
if ($links['nextPage']) {
$href = str_replace('{p}', $links['nextPage'], $url);
$return .= '<li class="page-item"><a href="'.$href.'" class="page-link next">&rsaquo;</a></li>';
}
if ($links['lastPage']) {
$href = str_replace('{p}', $links['lastPage'], $url);
$return .= '<li class="page-item"><a href="'.$href.'" class="page-link next">&raquo;</a></li>';
}
// Kapsayıcı HTML'i kapatıyoruz
$return .= '</ul></nav>';
}
return $return;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment