Умная пагинация на PHP. Генерация массива с номерами страниц
PHP функция генерации массива с номерами страниц пагинации.
function generateSmartPaginationPageNumbers($total, $perPage = null, $current = null, $adjacentNum = null)
{
$result = [];
if (isset($total, $perPage) === true) {
$result = range(1, ceil($total / $perPage));
if (isset($current, $adjacentNum) === true) {
if (($adjacentNum = floor($adjacentNum / 2) * 2 + 1) >= 1) {
$result = array_slice($result, max(0, min(count($result) - $adjacentNum, intval($current) - ceil($adjacentNum / 2))), $adjacentNum);
}
}
}
if (!in_array(1, $result)) {
if ($result[0] > 3) {
array_unshift($result, '');
}
if ($result[0] == 3) {
array_unshift($result, 2);
}
array_unshift($result, 1);
}
$totalPagesNum = ceil($total/$perPage);
$lastMiddlePageNum = $result[count($result)-1];
if (!in_array($totalPagesNum, $result)) {
if ($totalPagesNum - $lastMiddlePageNum > 2) {
$result[] = '';
}
if ($totalPagesNum - $lastMiddlePageNum == 2) {
$result[] = $lastMiddlePageNum + 1;
}
$result[] = $totalPagesNum;
}
return $result;
}
Пример использования:
$pages = generateSmartPaginationPageNumbers($found_rows, $per_page, $current_page, 3);
Имплементация ф-ции на javaScript:
var generateSmartPaginationPageNumbers = function(total, perPage, current, adjacentNum) {
var pages = [];
if (typeof total !== 'undefined' && typeof perPage !== 'undefined') {
pages = _.range(1, Math.ceil(total / perPage) + 1);
if (typeof current !== 'undefined' && typeof adjacentNum !== 'undefined') {
console.info('DEBUG: ', (adjacentNum = Math.floor(adjacentNum / 2) * 2 + 1) >= 1, adjacentNum);
if ((adjacentNum = Math.floor(adjacentNum / 2) * 2 + 1) >= 1) {
var startSlice = Math.max(0, Math.min(pages.length - adjacentNum, parseInt(current) - Math.ceil(adjacentNum / 2)));
pages = pages.slice(startSlice, startSlice + adjacentNum);
}
}
}
if ($.inArray(1, pages) === -1) {
if (pages[0] > 2) {
pages.unshift('');
}
pages.unshift(1);
}
var lastPage = Math.ceil(total / perPage);
if ($.inArray(lastPage, pages) === -1) {
pages.push('');
pages.push(lastPage);
}
return pages;
};
Использование:
var pages = generateSmartPaginationPageNumbers(200, 10, 9, 2); // [1, "", 8, 9, 10, "", 20]
#pagination