Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Алгоритм пагинации (https://javascript.ru/forum/misc/55787-algoritm-paginacii.html)

riki-tik 14.05.2015 12:55

Алгоритм пагинации
 
Дано:
Количество записей на странице
Количество всех страниц
Количество всех записей.

С этими данными сейчас выводятся страницы все подряд и это очень не красиво выглядит.

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

Как сделать чтобы была допустим первая страница, затем те на которой мы находимся, справа и слева от нее две-три и последняя страница?

vasa_c 14.05.2015 12:58

1. Вывести первую
2. Вывести ту на которой находимся и справа и слева от неё две-три
3. Вывести последнюю
4. PROFIT

riki-tik 14.05.2015 13:03

Нужен пример кода.
Тут есть нюансы типа: На какой странице мы сейчас находимся, здесь нужны правильные проверки на количество, а то вдруг страниц всего две, а выведется две справа и две слева, плюс первая, тогда получится 1 -1 1 2 3 4 2 (если мы на второй находимся.
Прошу помощи с кодом

laimas 14.05.2015 13:18

Вообще-то сервер должен формировать навигатор, и почему не устраивает задание ширины навигатора с переходами на каждую из частей страниц определяемых этой шириной?

ruslan_mart 14.05.2015 13:30

Я вот так на PHP делал:

function generatePages($url, $count, $checked = 0, $extra = false) {
		$j = 1 + ($checked < 2 || ($checked > $count - 3) ? 0 : $checked - 2 - ($checked == $count - 3));
		for($i = 1, $l = $count > 7 ? 7 : $count; $i <= $l; $i++, $j++) {
			if($i > 3 && $count > 7) {
				if($i == 4) {
					$result[] = '<a class="pages-change" data-count="'.$count.'" data-url="'.$url.'" title="Выбрать другую страницу">...</a>';
					continue;
				}
				$k = $count - ($l - $i);
			}
			else $k = $j;
			$result[] = '<a '.($checked == $k ? 'class="checked"': 'href="'.$url.'?page='.$k.'"').'>'.$k.'</a>';
		}
		if($extra) {
			array_unshift($result, '<a'.($checked != 1 ? ' href="'.$url.'?page='.($checked - 1).'"' : '').' title="Предыдущая страница">«</a>');
			$result[] = '<a'.($checked != $count ? ' href="'.$url.'?page='.($checked + 1).'"' : '').' title="Следующая страница">»</a>';
		}
		return implode("\n", $result);
	}


generatePages(ссылка, количество страниц, текущая страница. Вкл/Выкл стрелочки)


Итого получается примерно такой код:

<div class="pages">
   <?=generatePages('', 12, 5, true)?>
</div>


<div class="pages">
   <a href="?page=4" title="Предыдущая страница">«</a>
   <a href="?page=4">4</a>
   <a class="checked">5</a>
   <a href="?page=6">6</a>
   <a class="pages-change" title="Выбрать другую страницу">...</a>
   <a href="?page=10">10</a>
   <a href="?page=11">11</a>
   <a href="?page=12">12</a>
   <a href="?page=6" title="Следующая страница">«</a>
</div>


P.S.: мой код конечно не идеален, но я особо не заморачивался. :)

P.P.S: только сейчас узнал, что это пагинацией называется. Пошёл менять названия классов и ф-ций. :D

nerv_ 14.05.2015 13:57

https://github.com/nervgh/angular-pagination

рони 14.05.2015 14:05

riki-tik,
:write:
function pagination(b, c, d) {
    return Array(d + 1).join("1").split("").map(function(a, b) {
        return b + 1
    }).filter(function(a, e) {
        return c ? 1 == a || a == b || a == d || a <= b + c && a >= b - c : !0
    })
};
   //pagination(current,step,max ) step = 0 полный диапазон
 alert(pagination(13, 2, 14))
 alert(pagination( 5, 0 , 14))

Vlasenko Fedor 15.05.2015 01:58

Каждый должен написать свою пагинацию :lol:
Мой вариант http://jsfiddle.net/vlasenkofedor/hyQnb/

kostyanet 16.05.2015 05:49

У всех все неправильно, один я в белом. Решение давно известно, вот такое

задается макс слотов, скажем 10

в эти 10 слотов загоняется весь интерфейс с кнопками, логика построения которого такова:

если паг меньше кол-ва слотов - вывести континуально

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

Например мы на первой странице где их 12

1 2 3 4 5 6 7 … 11 12 Вперед »

Как видите разрыв шаблона начинается со страницы 7. Потому что континуум 5 слотов, а когда он целиком влезает, к нему континуально добавляется неиспользуемый квант начала. Если домотать до страницы 7, то получим

« Назад 1 2 … 5 6 7 8 … 11 12 Вперед »

... - hellip'ы - тоже кнопки, это третья кнопка в боковых отростках которая имеет номер страницы как обычно, но рендерится в качестве индикатора разрыва континуума

Теперь если мотать дальше, то неразрывный диапазон переедет к концу и там захапает отросток

« Назад 1 2 … 6 7 8 9 10 11 12 Вперед »

Он так и будет сдвигаться вправо пока не упрется в конец номеров и на последней странице получится

« Назад 1 2 … 10 11 12

Такая логика обеспечивает всегда отображение начала и конца диапазона страниц и небольшой промежуток для навигации вокруг выбранной.

Такая логика на многих коммерческих сайтах применена. Я по внешним признакам писал код, он на php. Готовый для такой логики найти не удалось, кругом были баяны.


Часовой пояс GMT +3, время: 13:54.