РедактироватьСоздать страницу
Удобный node.js-модуль для постраничного вывода контента.

node-paginator

Менеджер постраничного вывода контента в 55 строк.
При желании может использоваться отдельно от node.js, в том числе на стороне клиента.
Не требует сторонних библиотек.

Функционал

Модуль управляет лимитами и оффсетами sql запроса и генерирует html-код списка с первой, последней и с соседними страницами (или всего списка страниц без исключений), так же в модуле есть автоинкремент порядкового номера, он может применяться в поочередном выводе записей (стартовое число этого индекса будет соответствовать порядковому номеру первой записи на установленной странице).

Сорсы

Этот скрипт используется на сервере WikiClick, вернее его упрощенная и менее продвинутая версия.

Собственно сам модуль paginator.js

var paginator = function() { return {
	page: 1,
	limit: 100,
	count: 0,
	pages: 0,
	length: 0,
	selected_page_href: 1,
	i: 0,
	set_limit: function (l) {
		this.count = parseInt(l);
	},
	set_page: function (p) {
		this.page = parseInt(p) ? parseInt(p) : 1
	},
	index: function() {
		if(!this.i) this.i = this.limit*(this.page-1)+1;
		else this.i++;
		return this.i;
	},
	set_count: function (c) {
		this.count = parseInt(c);
	},
	set_length: function(l) {
		this.length = parseInt(l)
	},
	sql_limit: function() {
		return ' LIMIT '+this.limit*(this.page-1)+', '+this.limit+' ';
	},
	html_links: function (href, length, sph) {

		if (typeof length != 'undefined')
			this.set_length(length);

		if (typeof sph != 'undefined')
			this.selected_page_href = parseInt(sph);
		
		chain = Array();
		this.pages = Math.ceil(this.count/this.limit);
		for(i=1; i<=this.pages; i++) {
			classes = Array();
			hrefstr = (((i != this.page) || this.selected_page_href) ? (' href="'+href.replace(':page', i)+'"') : '');			
			if (i == 1) classes.push("p-start");
			if (i == this.pages) classes.push("p-end");
			if (i == this.page) classes.push("p-selected");
			if (this.length && Math.abs(i-this.page) <= this.length/2) classes.push("p-center");
			clss = (classes.length ? (' class="'+classes.join(' ')+'"') : '');
			if(!this.length || classes.length) {
				chain.push('<a'+hrefstr+clss+'>'+i+'</a>');
			}
		}
		return chain.join('');
	}	
}}

module.exports = paginator;

Как использовать

// Создаем объект модуля
paginator = require('./paginator.js');
pgntr = new paginator();
// Настраиваем
pgntr.set_page(3); // default 1;
pgntr.set_limit(20); // default 100;
// Делаем выборку
connection.query('select * from pages '+pgntr.sql_limit());
// Указываем количество записей в БД (этот метод необходимо выполнить до генерации списка страниц html_links())
pgntr.set_count(100);
// Выводим страницы
res.send(pgntr.html_links('/page/:page'));
res.send(pgntr.html_links('/page/:page', 0, 0));
res.send(pgntr.html_links('/page/:page', 5, 0));
res.send(pgntr.html_links('/page/:page', 5, 1));
res.send(pgntr.html_links('/page/:page'));
/* в последнем случае для вывода будут использованы параметры из предыдущего вызова функции */
res.send(pgntr.index())//автоинкремент порядкового номера начиная с первой записи на этой странице
/* последняя функция может быть полезна если вы хотите сообщать клиенту какая идет запись по счету, может использоваться в цикле вывода элементов */

Код проекта на GitHub

https://github.com/4eckme/node-paginator
#javascript#node.js#pagination

Последние правки


Комментарии (1)