пейджинг как stackoverflow's - PullRequest
2 голосов
/ 15 июня 2011

Я новичок в php, особенно при создании страниц.

мой вопрос: как сделать разбиение на страницы похожим на разбиение на страницы stackoverflow?
я имею в виду пейджинг, как это:

1 ... 5 6 7 8 9 ... 25
(первый номер и последний номер всегда появляются, но в середине только 5 номеров с выбранной страницей абсолютно посередине)

в php я пробовал делать пейджинг,

<?php

//Show page links
for($i=1; $i<=$pages; $i++)
{
    echo '<li id="'.$i.'">'.$i.'</li>';
}

?>

но все страницы будут показаны как

1 2 3 4 5 6 7 8 9 10 и т. д.

У какого тела есть простой логический пример для решения этой проблемы?
большое спасибо:)

Ответы [ 6 ]

13 голосов
/ 15 июня 2011

Это сгенерирует числа, как указано выше, с current = 7, pages = 25. Замените числа ссылками, чтобы получить фактический индекс нумерации страниц.

$current = 7;
$pages = 25;
$links = array();

if ($pages > 3) {
    // this specifies the range of pages we want to show in the middle
    $min = max($current - 2, 2);
    $max = min($current + 2, $pages-1);

    // we always show the first page
    $links[] = "1";

    // we're more than one space away from the beginning, so we need a separator
    if ($min > 2) {
        $links[] = "...";
    }

    // generate the middle numbers
    for ($i=$min; $i<$max+1; $i++) {
        $links[] = "$i";
    }

    // we're more than one space away from the end, so we need a separator
    if ($max < $pages-1) {
        $links[] = "...";
    }
    // we always show the last page
    $links[] = "$pages";
} else {
    // we must special-case three or less, because the above logic won't work
    $links = array("1", "2", "3");
}
echo implode(" ", $links);

Выход:

1 ... 5 6 7 8 9 ... 25
10 голосов
/ 15 июня 2011

Ниже приведен фрагмент из общего класса нумерации страниц 1 , который я написал несколько лет назад.Я отредактировал его, чтобы показать только соответствующие части.

// cntAround is the number of pages to show before and after the current
function renderNavigation($cntAround = 1) {
    $out      = '';
    $isGap    = false; // A "gap" is the pages to skip
    $current  = // Current page
    $cntPages = // Total number of pages

    for ($i = 0; $i < $pages; $i++) { // Run through pages
        $isGap = false;

        // Are we at a gap?
        if ($cntAround >= 0 && $i > 0 && $i < $cntPages - 1 && abs($i - $current) > $cntAround) { // If beyond "cntAround" and not first or last.
            $isGap    = true;

            // Skip to next linked item (or last if we've already run past the current page)
            $i = ($i < $current ? $current - $cntAround : $cntPages - 1) - 1;
        }

        $lnk = ($isGap ? '...' : ($i + 1)); // If gap, write ellipsis, else page number
        if ($i != $current && !$isGap) { // Do not link gaps and current
            $lnk = '<a href="?page=' . ($i + 1) . '">' . $lnk . '</a>';
        }
        $out .= "\t<li>" . $lnk . "</li>\n"; // Wrap in list items
    }

    return "<ul>\n" . $out . '</ul>'; // Wrap in list
}

Пример 1

cntAround = 1, current = 5, cntPages = 9:

[1] ... [4] 5 [6] ... [9]

Пример 2

cntAround = 3, current = 5, cntPages = 11:

[1] [2] [3] [4] 5 [6] [7] [8] ... [11]

1) Статья на датском языке.Версия Google Translate'd здесь .

2 голосов
/ 15 июня 2011

Примерно так (псевдокод):

pg = CurrentPageNo
low = 1
high = MAX_PAGES
if (pg-low <=5)
    output 1 to pg-1 [with links]
else
    output 1..3 [with links]
    output "..."
    output (pg-3) to (pg-1) [with links]

output pg

if (high - pg <=5)
    output pg+1 to high  [with links]
else
    output (pg+1) to high-3 [with links]
    output "..."
    output (high-2) to high [with links]
1 голос
/ 15 июня 2011

Ниже приведена ссылка на классы php, откуда вы можете скачать класс php для разбивки на страницы.

http://www.phpclasses.org/search.html?words=paging&x=0&y=0&go_search=1

1 голос
/ 15 июня 2011

Вы можете использовать Zend_Paginator , чтобы сделать это, и научиться использовать Zend Framework во время работы.

0 голосов
/ 07 января 2013

Если у вас (возможно, имеется) большое количество страниц, рассмотрите возможность использования «логарифмической» навигации по страницам, как описано здесь (пример кода включен):

Как выполнить навигацию по страницам для многих,много страниц?Логарифмическая навигация по страницам

(Обратите внимание, что, конечно же, она отлично подойдет и для небольшого числа страниц!)

...