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);
}
}