Масштабирующийся пагинатор
-
03-07-2019 - |
Вопрос
<< 1 2 3 4 ... 15 16 17 ... 47 48 49 50 >>
<< 1 2 3 4 5 6 7 ... 47 48 49 50 >>
<< 1 2 3 4 ... 44 45 46 47 48 49 50 >>
(жирным шрифтом выделена выбранная страница)
Есть ли какая-нибудь логика скалывателя, которая создает такое масштабируемое разбиение на страницы?Я уже создавал один из них, но в итоге он превратился в путаницу логических утверждений.
Язык, на котором я сейчас это делаю, — PHP, но если у вас есть примеры или советы для любого языка, мы будем признательны.
Под масштабированием я имею в виду ситуацию, когда страниц всего несколько.Пагинация отображает это.
<< 1 2 3 4 5 6 7 >>
По мере того, как количество страниц достигает определенной точки, нумерация страниц перестает отображать все числа и начинает их разделять.
<< 1 2 3 4 ... 47 48 49 50 >>
<< 1 2 3 4 5 6 ... 47 48 49 50 >>
<< 1 2 3 4 5 6 7 8 ... 47 48 49 50 >>
<< 1 2 3 4 .. 7 8 9 ... 47 48 49 50 >>
<< 1 2 3 4 .. 15 16 17 ... 47 48 49 50 >>
<< 1 2 3 4 ... 44 45 46 47 48 49 50 >>
<< 1 2 3 4 ... 47 48 49 50 >>
(обратите внимание, фактические цифры и количество показаний до и после не имеют значения)
Решение
Извините за кусок кода, но вот.Надеюсь, комментариев будет достаточно, чтобы рассказать вам, как это работает. Если вы оставите комментарий, я, возможно, добавлю еще.
/**
* Get a spread of pages, for when there are too many to list in a single <select>
* Adapted from phpMyAdmin common.lib.php PMA_pageselector function
*
* @param integer total number of items
* @param integer the current page
* @param integer the total number of pages
* @param integer the number of pages below which all pages should be listed
* @param integer the number of pages to show at the start
* @param integer the number of pages to show at the end
* @param integer how often to show pages, as a percentage
* @param integer the number to show around the current page
*/
protected function pages($rows, $pageNow = 1, $nbTotalPage = 1, $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20, $range = 10)
{
if ($nbTotalPage < $showAll)
return range(1, $nbTotalPage);
// Always show the first $sliceStart pages
$pages = range(1, $sliceStart);
// Always show last $sliceStart pages
for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++)
$pages[] = $i;
$i = $sliceStart;
$x = $nbTotalPage - $sliceEnd;
$met_boundary = false;
while ($i <= $x)
{
if ($i >= ($pageNow - $range) && $i <= ($pageNow + $range))
{
// If our pageselector comes near the current page, we use 1
// counter increments
$i++;
$met_boundary = true;
}
else
{
// We add the percentate increment to our current page to
// hop to the next one in range
$i = $i + floor($nbTotalPage / $percent);
// Make sure that we do not cross our boundaries.
if ($i > ($pageNow - $range) && !$met_boundary)
$i = $pageNow - $range;
}
if ($i > 0 && $i <= $x)
$pages[] = $i;
}
// Since because of ellipsing of the current page some numbers may be double,
// we unify our array:
sort($pages);
return array_unique($pages);
}