Решение проблемы постраничной навигации

831
.
Все разработчики парой сталкиваются с проблемой постраничной навигации. Особенно это касается мобильных wap-сайтов, т. к. выводить 1-1000 записей на страницу в телефоне не удобно и бессмысленно.
Для одних это вовсе не проблема, а для других решить проблему навигации оказывается сложнее чем Вы думаете. Когда разработчик сталкивается с данной проблемой - пытается решить сам, или найти в интернете. Если самому решить не удалось, находит в интернете листинги (уроки) о том как построить правильно навигацию. И вообще в чем именно проблема при постарении навигации?
1. лимит SQL (LIMIT x,y).
2. Как передать параметр содержащий номер страницы
3. А если страниц слишком много? Тогда у неумелых рук, при больших объемах данных и неправильном подходе к проблеме, навигация состоит из огромного количества ссылок, что тоже не является правильным.
4. Как правильно и грамотно придать стиль навигации
Мое решение проблемы это MPPN4 (Max's Post Page Navigation ver. 4).
В данном классе решены все задачи/проблемы указанные выше. Класс подойдет как начинающему так и бывалому кодеру. Решение проблемы навигации подошло к концу.

Документация
Начало работы с классом:
Для начала стоит открыть файл класса, и просмотреть настройки. Я все тщательно комментировал, и не думаю что останутся непонятки.
Если настройки по умолчанию вас устраивают, можете приступать.
Но если вам нужна настройка из скрипта то:

Запуск класса и пример работы
Запуск класса происходит в четырех этапах:
1. Подключение класса
2. Объявление объекта
3. Установка количества записей (при работе с sql, эту функцию выполняет Query(str SQL-query))
3. Вывод навигации
Пример работы:

//Подключаем класс
require_once('mppn.Class.php');
//Объявляем объект класса навигации
$nav = new PageNav;
//Устанавливаем к примеру количество записей на страницу*
$nav->SetParam ( 'per_page', 15);
//Выбираем всех пользователей
$query = $nav->Query("SELECT * FROM `users` #LIMIT"); //#LIMIT - условная переменная**
//Выведем ники пользователей
while ( $data = mysql_fetch_array ( $query ) ) {
  echo $data['login'] . "<br/>\n";
}
//Выводим навигацию
$nav->Show();


*Условная переменная #LIMIT заменяется на "LIMIT $start,$per_page" внутри класса относительно текущей страницы, после чего выполняется SQL-Запрос.
**Если не установить - возьмет кол-во записей по умолчанию внутри класса.


Функция настройки
Функция настройки - позволяет записывать параметры из сценария вашего скрипта. Таким образом, можно устанавливать настройки из панели управления например.
Синтаксис функции следующий:
//Подключаем класс
require_once('mppn.Class.php');
//Объявляем объект класса навигации
$nav = new PageNav;
//Устанавливаем к примеру количество записей на страницу
$nav->SetParam ( 'per_page', 15);
//или класс CSS кнопок
$nav->SetParam ( 'buttons_class', 'class_name');
//Или класс CSS текущей кнопки
$nav->SetParam ( 'button_class', 'class_name');

Подробнее о параметрах смотрите "Параметры класса"


С настройками разобрались, переходим непосредственно к навигации и обработки SQL-Запросов (если надо).
Обратите внимание, функции Show([int аргумент]) и Query(str SQL-query) зависимые друг от друга.
Если не выполнить Query(str SQL-query), то в аргументе Show([int аргумент]) обязательно должно быть указано количество записей, которое будет разбиваться на страницы. Ну а если Query(str SQL-query) был выполнен, количество записей передастся из него в функцию класса Show([int аргумент]), и аргумент вводить не обязательно.
Сделано это для расширения функционала. К примеру: постраничная навигация содержимого файла - там абсолютно не нужны sql-запросы.
[spoiler title="Query(str SQL-query)"]Query(str SQL-query) - ВОзвращает то же самое что и mysql_query(), с одним лишь различием - внутри строки можно использовать условную переменную. При переключении страниц, в SQL-запросе должен меняться оператор LIMIT. Потому внутри функции обрабатывается автоматически такая ерунда. И вместо лимита SQL ставится условная переменная "#LIMIT" (без кавычек). Ее также можно изменить в настройках класса (можете вообще поставить *L или lim главное не используйте $).
Также внутри функции подсчитывается количество записей которое будет разбиваться функцией Show([int аргумент]) на страницы, и аргумент функции подставится автоматически.


Show([int аргумент])
Show([int аргумент]) - Выводит навигацию по страницам. В аргументе может принимать количество записей ВСЕГО, после чего разобьет на страницы и выведет навигацию.
Действует по сценарию:
- Если задан аргумент использую его, если нет обращаюсь к Query(str SQL-query) и получаю кол-во записей всего.
- Разбиваю и округляю кол-во записей - получаю количество страниц.
Если количество страниц превишает оптимальный вид, вывожу упрощенную навигацию (5 кнопок), если нет вывожу обычную навигацию (кол-во кнопок зависит от настроек).


Параметры класса
Здесь просто опишу параметры класса:
per_page - количество записей на страницу
optimal - максимальное количество записей с обычной навигацией. (если записей больше - упрощенная навигация)
pars_var - условная переменная SQL-парсера Query(str SQL-query), которая заменяется на оператор LIMIT в SQL.
var - переменная которой будет передаваться номер страницы
buttons_class - css класс для кнопок навигации
button_class - css класс для кнопки навигации номер которой, соответствует текущей странице.


Как оно выглядит?
Ну... при переходе по страницам, в url ничего не меняется (передается формой через POST). Но если нужно попасть на какую-то страницу по ссылке, примит номер страницы и через url. Например если:

class PageNav {
.....
var $var = 'page'; //передается через page в заголовке
.....
}


то 4 страница будет доступна по адресту
http://some-site.ru/some_page.php?page=4

а последняя по адресу
http://some-site.ru/some_page. ... =last
Прикрепленные файлы:
.
точка невозврата
Ну ПН уже давно не проблема пример работы, пожалуйста.
.
NURD
vermas (09.05.2012/19:34)
Ну ПН уже давно не проблема пример работы, пожалуйста.
http://nurd-cms.ru/gb/?page=2
Только там MPPN3 стоит да и еще веб версия. (там минимизированная навигация на 7 кнопок а в MPPN4 на 5)
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
Автор, конечно извини, что не в тему, но данный пост в в Вашей гастивухе меня очень заинтересовал
Обратите внимание, что вся авторизация основана на сессиях, потому куков вы не найдете. И браузеры не поддерживающие сессии - работать с авторизацией не будут. Сделано это для безопасности и защиты от краж куков)

Вот объясни мне пожалуйста (может я уже отупел и что-то пропустил), где ты видел сессии без Куков?
Насколько я знаю, такое невозможно, если только ты не передаешь SESSION_ID как URL параметр. Но это считается устаревшим и неправильным и ОПАСНЫМ методом, сессии легко воруются.

А третьего способа, чтоб работать с сессиями и без Куков я не знаю.
Или я отстал от жизни и успели придумать что-то новое?
.
bleakas
AlkatraZ (09.05.2012/19:49)
Автор, конечно извини, что не в тему, но данный пост в в Вашей гастивухе меня очень заинтересовал

Вот объясни мне пожалуйста (может я уже отупел и что-то пропустил), где ты видел сессии без К
Да царь-баценька , отупели мы. Аффтар вообще креатив. такое выдумать трудно. Скорее всего он имел в виду сессии гет запросом
.
AlkatraZ (09.05.2012/19:49)
Автор, конечно извини, что не в тему, но данный пост в в Вашей гастивухе меня очень заинтересовал

Вот объясни мне пожалуйста (может я уже отупел и что-то пропустил), где ты видел сессии без К
Нет не отстал. Скорее я протупил. Когда я написал что работает без куков - имел введу что куки не записываются скриптом как основа авторизации. А используется сессия для определения кто залогинен. В БД при логине обновляется строчка session, потому так. Ну а при авторизации в списке куков - куков нету.
PS: Да и мне то 17 только в июне будет. Осенью учиться в универ на программиста. Так что не суди строго и не обращай внимания на глупости ок?
.
╭∩╮ (`-`) ╭∩╮
bleakas (09.05.2012/19:53)
Скорее всего он имел ввиду сесси гет запросом
Наверно так, другого метода, чтоб и с сессиями и без куков я не знаю.
Но передача сессии в URL - это же очень опасно.

Любые мануалы по элементарной безопасности, нескольколетней давности, в первую орчередь толкуют, что НЕ ПЕРЕДАВАЙТЕ ID сессии в ссылках. Это опасно, номер сессии может передаться и по рефералу и в случае если ты захотел кинуть к примеру ссылку на форум где-то на другом ресурсе, да и в любых логах тоже откладывается.

Посему, к примеру у нас в двиге session.use_trans_sid стоит 0 (запрещена передача ID сессии в ссылках).
.
╭∩╮ (`-`) ╭∩╮
NURD (09.05.2012/19:55)
Так что не суди строго и не обращай внимания на глупости ок?
Ничего, это нестрашно, все мы когда то учились.
Хорошо, если вовремя увидишь и исправишь.
---
Куки смело используй.
.
Усёк!
.
Ну а как мой MPPN4? Сдал?
Всего: 57