1. Введение
Нередко разработчики web-приложений сталкиваются с задачей постраничного разбиенияданных, будь то большой массив записей или объемный текст. В процессе реализациипрограммного решения задачи возникает вопрос – как же организовать перемещениепользователя по страницам так, чтобы это, с одной стороны, было удобно, то естьчтобы панель навигации выполняла свое прямое назначение, и, с другой стороны,имело бы приемлемый внешний вид.
2. О рассматриваемых в статье вопросах
Существует много вариантов реализации навигационной панели. Остановимся нанескольких, наиболее распространенных.
Пример 1. Простейшая навигационная система c выводом всех страницдля 20 страниц выглядит так
<< < 1 2 3 4 5 6 7 8 9 10 [12] 13 14 15 16 17 18 19 20 > >>
Пример 2. Навигационная система с выводом ограниченного ряда страницдля 20 страниц выглядит так
<< < … 8 9 10 11 [12] 13 14 15 … > >>
Навигация этого типа, например, применяется на таких известных поисковых системах,как Яndex и Google.
Пример 3. Навигационная система с реперными точками для 20 страницвыглядит так
1 … 5 … 10 11 [12] 13 14 15 … 20
К недостаткам систем первого типа следует отнести громоздкий вид при большомчисле страниц. Системы второго типа часто не обеспечивают быстрого перемещенияна большие расстояния. Системы третьего типа при некотором фиксированном расстояниимежду реперными точками (опорными точками в массиве страниц, которыеспециально выделяются из общего ряда, чтобы сделать панель навигации более компактной)с ростом страниц, как и системы первого типа, становятся все более громоздкими.
В данной статье будет рассмотрена навигационная система с принципом дистанцирования,который заключается в том, что расстояние между реперными точками не являетсяфиксированной величиной, а пропорционально уменьшается при движении от крайнихстраниц к текущей.
Пример 4. Навигационная система с принципом дистанцирования для 350страниц выглядит так
<< < 100 ... 110 120 ... 122 123 124 [125] 126 127 128 ... 130 140150 160 170 180 190 ... 200 300 > >>
Второй вопрос, которого мы коснемся в статье, будет касаться ссылок. Априориполагаем, что переменные от страницы к странице будут передаваться методом GET.Встает вопрос – каким образом эффективно менять значение текущей страницы вQUERY_STRING и формировать ссылку? Решение дает функция, которая позволяет изменятьзначение параметров, передаваемых в QUERY_STRING, не изменяя общий вид самойстроки.
3. Детали реализации
Навигационная система реализована в виде класса. Это упрощает интеграцию вразличные приложения.
Общий подход в формировании массива ссылок такой. Сначала формируется текстоваястрока, содержащая панель навигации в заданном формате. Затем эта строка припомощи регулярных выражений преобразуется в массив ссылок, готовый к отображению.
Навигационная панель формируется из трех частей – середины, левой и правой.Середина представляет собой текущую страницу, окруженную сателлитами(страницами, удаленными от данной не более чем на задаваемое число, меньшеедесяти). Правая и левая части формируются согласно принципу дистанцирования,сначала перечисляются страницы, удаленные на 10*k, 1<=k<=9 от текущей,затем на 100*m, 1<=m<=9, и так далее. В реализации функций, выводящихлевую и правую части, применена рекурсия (вызов функции самой себясо специально подобранными параметрами, применяется, например, при обработкедеревьев).
Перейдем к рассмотрению того, как формируются ссылки. Классу задается форматссылки, например, в таком виде
[page]
где строка может иметь любой вид, за исключением двух тэгов [href] и [page],которые будут заменены соответственно на URL и номер страницы. URL формируются,исходя из системных переменных, дающих значение имени скрипта и строки QUERY_STRING.Строка QUERY_STRING обрабатывается отдельной функцией, которая меняет значениепараметра page на заданный, не изменяя значений других параметров и, тем самым,сохраняя общий вид строки. Если в строке не было этого параметра, функция добавитего, внеся требуемые изменения.
4. Пример работы с классом
// Пример работы
include_once(“advanced_nav.class.php”)
// Определяем класс
$nav_class=new advanced_nav();
// Инициализация. Задаем начальные условия
$nav_class->init("[page]",125,350,3);
/*
Здесь:
[page]" – формат ссылки
125 – номер текущей страницы
350 – общее число страниц
3 – число сателлитов
*/
// Строим панель навигации
$nav_class->build_nav();
// Выводим панель навигации пользователю
$nav_class->print_nav();
?>
5. Скачать
Скачать