Умная пагинация на PHP. Генерация массива с номерами страниц

Категория: 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

категория: PHP