[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Небольшой пагинатор
ИНСИ
Что-то смотрю, все тут пагинаторы свои пишут :) Я не исключение )) Выложу свой класс, вдруг кому пригодится.

P.S. Я знаю что в рунете дофига таких же реализаций и т.д...

// Подключаем файл с классом
require_once 'paginator.php';

Стандартный вывод навигации:
// Инициализируем пагинатор
$paginator = new paginator(array(
'limit' => 2, // Количество записей на одной странице
'table' => 'rows', // Таблица в БД, в которой необходимо подсчитать записи
));

// Вытаскиваем значение LIMIT
$limit = $paginator->getLimit();

// Формируем запрос на вывод записей из БД
$rows = mysql_query("
SELECT *
FROM `rows`
ORDER BY `id` DESC

{$limit}
");

// Если найдены строки
if(mysql_num_rows($rows) > 0) {

// Выводим навигацию по страницам
$paginator->showPages();

// Обходим циклом записи
while($data = mysql_fetch_assoc($rows)) {
echo $data['title'] . ' <br /> ';
}

// Выводим навигацию по страницам
$paginator->showPages();

} else {
echo '<p>Нет записей :(</p>';
}

Также есть дополнительные параметры, которые вы можете передавать:

$where = '`category` = 1';

// Дополнительные параметры
$paginator = new paginator(array(
'nowPage' => 1, // Страница, с которой начать вывод записей
'sizeNeighbours' => 7, // Количество дополнительных страниц от активной (слево и справо)
'radio' => '`id`', // По какому полю вести подсчет в БД
'pathUrl' => 'category=1', // Дополнительные параметры в адрессной строке
'subQuery' => $where, // Дополнительное условие WHERE при подсчете количества записей в БД

// Текст навигации

'paginatorLeft' => 'Вперед',
'paginatorRight' => 'Назад'
));


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

Много расписывать не буду, если у кого будут вопросы, обращайтесь.

Свернутый текст

/*
Автор: INSIDIOUS
Версия: 1.0 (Бета)
Приминение: Пагинатор
*/

class paginator
{
// Объявляем нужные переменные для использования внутри класса
private $info = array(
'start' => 1, // Нумерация записи, с которой должен начаться вывод
'limit' => 25, // Количество записей на одной странице
'table' => false, // Таблица в БД, в которой необходимо подсчитать записи

'nowPage' => 1, // Дефолтная страница
'sizePages' => 0, // Количество страниц в дефолтном состоянии
'sizeNeighbours' => 5, // Количество дополнительных страниц от активной

'radio' => '*', // По какому полю вести подсчет в БД
'pathUrl' => false, // Дополнительные параметры в адрессной строке
'subQuery' => false, // Дополнительное условие WHERE при подсчете количества записей в БД

// Текст навигации

'paginatorLeft' => 'Влево',
'paginatorRight' => 'Вправо'
);

/*
Метод: Инициализация класса
*/

function __construct($arr = array()) {

// Берем нумерацию страницы из GET - если есть
if(isset($_GET['page']))
$this->info['nowPage'] = (int)$_GET['page'];

// Если переданы значения - принимаем их
if(sizeof($arr) > 0) {
foreach($arr as $key => $data) {
$this->info[$key] = $data;
}
}


// Если активная страница меньше 1 - устанавливаем новое значение
if($this->info['nowPage'] < 1)
$this->info['nowPage'] = 1;

// Формируем конечное значение адрессной строки
$this->info['pathUrl'] = '?' . ($this->info['pathUrl'] != '' ? $this->info['pathUrl'] . '&' : '') . 'page=';
}

/*
Метод: Определяет общее количество страниц и возвращает значение LIMIT
*/

function getLimit() {

// Если не было инициализации класса - останавливаем работу
if($this->info['table'] == false)
return false;

// Если было указано дополнительное значение для параметра WHERE в запросе ()
$where = ($this->info['subQuery'] != false ? 'WHERE ' . $this->info['subQuery'] : '');

// Узнаем общее количество строк в БД
$row = mysql_query("
SELECT COUNT({
$this->info['radio']})
FROM `{
$this->info['table']}`
{$where}
LIMIT 1
"
) or exit('mysql error: ' . mysql_error());

// Общее количество записей в БД
$sizeRows = mysql_result($row, 0);

// Узнаем количество страниц
$this->info['sizePages'] = ceil($sizeRows / $this->info['limit']);

// Если нумерация указанной страницы больше общего количества страниц в БД - присваиваем новое значение
if($this->info['nowPage'] > $this->info['sizePages'])
$this->info['nowPage'] = $this->info['sizePages'];

// Высчитаем с какой именно записи необходимо начать вывод
$this->info['start'] = (int)($this->info['nowPage'] - 1) * $this->info['limit'];
$this->info['start'] = (int)($this->info['start'] > 0 ? $this->info['start'] : 0);

// Возвращаем данные
return "LIMIT {$this->info['start']},{$this->info['limit']}";
}

/*
Метод: Вывод навигации по страницам
*/

function showPages($path = '') {

// Если не было инициализации класса - останавливаем работу
if($this->info['sizePages'] < 1)
return false;

// Узнаем количество страниц слева
$this->info['leftNeighbours'] = (int)(
(
$this->info['nowPage'] - $this->info['sizeNeighbours']) < 1
? 1
: ($this->info['nowPage'] - $this->info['sizeNeighbours'])
);


// Узнаем количество страниц справа
$this->info['rightNeighbours'] = (int)(
(
$this->info['nowPage'] + $this->info['sizeNeighbours']) > $this->info['sizePages']
?
$this->info['sizePages']
: (
$this->info['nowPage'] + $this->info['sizeNeighbours'])
);


// Создаем массив - который в конце мы выведем (можно сразу выводить на экран)
$show = array();

// Если нумерация нынешней страницы больше 1
if($this->info['nowPage'] > 1)
$show[] = '<a href="' . $this->info['pathUrl'] . ($this->info['nowPage'] - 1) . '">' . $this->info['paginatorLeft'] . '</a>';

// Если общее количество страниц больше 1
if($this->info['sizePages'] > 1) {
// Выводим в навигацию все страницы
for($i = $this->info['leftNeighbours']; $i <= $this->info['rightNeighbours']; $i++) {
if($i != $this->info['nowPage'])
$show[] = '<a href="' . $this->info['pathUrl'] . $i . '">' . $i . '</a>';
else
$show[] = '<span>' . $i . '</span>';
}
}


// Если активная страница не последняя и есть другие
if($this->info['nowPage'] < $this->info['sizePages'])
$show[] = '<a href="' . $this->info['pathUrl'] . ($this->info['nowPage'] + 1) . '">' . $this->info['paginatorRight'] . '</a>';

// Выводим навигацию по страницам
echo implode(' ', $show);
}
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.