Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Настройка SVN || Форма обратной связи для wordpress >>>

PHP навигация

24.05.2012
PHP навигация

Здравствуйте, уважаемые читатели блога LifeExample, я постарался максимально проработать скрипт php навигации, и сделать пагинацию на php очень удобной, а самое главное полностью универсальной.

Данный скрипт, в котором будет рассмотрена постраничная навигация php, пригоден для использования, в совершенно любой CMS системе. Достигнуто это благодаря тому, что php навигация реализована выделенным автономным классом, которому для работы нужно лишь получить исходный MySQL запрос, данные для подключения к БД, и параметры вывода.

Когда я только начинал заниматься web программированием, передо мной в скором будущем встала задача реализовать постраничную навигацию. В то время введя в поисковик запросы "пагинация php" и "постраничная навигация php" я был крайне удивлен скудности доступной информации по этой теме.

Сейчас спустя год я задался целью создать такой скрипт php пагинации, который бы можно было использовать абсолютно в любой системе, затратив на это минимум усилий. Должен сказать, что у меня это получилось, и сейчас я хочу продемонстрировать его вам, с подробным описанием его алгоритмов, и способов применения постраничной навигации.

Скрипт постраничной навигации на php

Как я уже упомянул, скрипт реализован автономным классом. Под автономным классом я понимаю, php класс, который можно внедрить в любую систему и при определении экземпляра данного класса, указав любой MySql запрос, а также некоторые настройки, можно сразу получить результат.

Пример постраничной навигации

На приведенной иллюстрации, изображен результат работы данного скрипта пагинации на php, который выводит на страницу результаты выполненного SQL запроса, и список страниц для навигации.

Скачать скрипт постраничная навигация php ( Скачали: 1973 чел. ) 

Как все это работает, я расскажу позже, а пока объясню, как настроить данный скрипт для работы в любой CMS.

Интеграция пагинации в любую CSM

Скрипт PHP навигации

Открыв скачанный архив, вы увидите три файла:

  1. class.navgator.php – включает в себя всю логику генерации страниц и работы с ними.
  2. index.php – его сожержимое показывает как правильно настроить навигацию, и вывести нужную страницу.
  3. style.css – нужен для изменения внешнего отображаемого списка страниц.

Содержимое файла index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<link rel="stylesheet" href="style.css" type="text/css" media="screen" /><!--Подключение стилей-->
<?php
    require_once("class.navigator.php"); // подключение класса для постраничной навигации
   
    $Page=1; //номер страницы которую нужно открыть
   
    if($_GET["page"]) $Page=$_GET["page"]; //если был произведен запрос другой страницы, то присваиваем переменной новый индекс
   
    $array=array(
            array( //настройки для подключения к БД
                'host'=>"localhost", // хост
                'user'=>"root", // пользователь
                'password'=>"", //пароль
                'name_bd'=>"test", //база данных
            ),
            array(     
                'countRecordOnPage'=>5,//количество выводимых записей
                'numberPage'=>$Page,//номер запрашиваемой страницы
                'paramName'=>"page",//название параметры в GET запросе
                'linkCount'=>5, //количество страниц в списке
                'viewAll'=>false //показать все записи на одной странице       
            )
    ); 
   
    $navigator = new Navigator($array, "SELECT * FROM models"); //определяем класс
    echo $navigator->getNavigator();//выводим запрашиваемую страницу
?>

Первым делом подключаем CSS стили и файл с классом навигатора. Затем определяем номер запрашиваемой страницы, через GET параметр, если он существует, иначе будет выведена первая в списке страница.

В массив $array добавляем все необходимые настройки для подключения к базе, а также параметры вывода страницы. Все это передаем в конструктор класса, вместе с запросом. Далее дело техники, и логики работы самого класса навигатора. Единственное, что останется, это вывести сформированную навигатором страницу echo $navigator->getNavigator.

Все требуемые параметры описаны в комментариях файла, так что проблем с пониманием быть не должно. Собственно на этом, те, кто не желает вникать в смысл работы php навигации, могут благополучно пользоваться данным классом. Ну, а интересующимся читателям, я все-таки поведаю, о том, как работает постраничная навигация php.

Очень хочется выложить полностью код класса, но смысла в этом не вижу, поскольку рассказывать я буду только о его структуре и алгоритме работы. В связи с этим я выложу макетную версию данного класса, без содержимого функций.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Navigator{
    //Блок переменных доступных только внутри класса.
    private $SQL_SETTING; // Параметры подключения к БД.
    private $CONNECT; //Указатель на соединение с MySQL.
    private $COUNTRECORD; //Количество выводимых записей на странице.
    private $SQL; // Исходный SQL запрос.
    private $NUMBERPAGE; //Номер текущей страницы.
    private $VIEWALL; //Флаг - показать все страницы.
    private $PARAMNAME; //Имя параметра в GET запросе например "page".
    private $LINKCOUNT; //количество выводимых ссылок на страницы в пайджере.
    private $NAVIGATOR; //сформировананный навигатор, готовый к выводу.

    public function  __construct($arr,$sql){}
    public function  getNavigator(){}
    private function initConectionBD(){}   
    private function calcDataPage(){}
    private function getPage(){}   
    private function createNavigator(){}
}

В классе Navigator заведены поля описывающие все необходимые для работы параметры, такие как настройки БД, количество выводимых записей, номер текущей страницы, количество выводимых ссылок на следующие страницы , ну некоторые другие важные и не очень параметры.

В конструкторе класса инициализируются все поля класса, и устанавливается подключение с БД средствами функции initConectionBD(). Затем методом calcDataPage() производится расчет общего количества записей полученных по переданному SQL запросу.

Вычислив количество записей, алгоритм рассчитывает общее число страниц, учитывая параметр $COUNTRECORD, и модернизирует исходный SQL запрос соответствующим параметром LIMIT.

Наверное, надо было раньше рассказать про LIMIT, поскольку вся php навигация построена именно на этом SQL операторе.

1
LIMIT [offset],[rows]

Ключевое слово LIMIT дописанное в конец любого запроса сообщает MySQL о выводе только [rows] запросов начиная с позиции [offset].

Конечной целью метода calcDataPage(), нашего класса , в конечном итоге стоит определение необходимых параметров [offset] и [rows], соответствующих запрошенной странице.

Например, для того чтобы из 300 записей, вывести 3-ю страницу и 100 строк на ней, параметры offset и rows должны иметь следующие значения:

1
2
offset =200
rows = 100

Тогда как для первой:

1
2
offset =0
rows = 100

А для второй:

1
2
offset =100
rows = 100

В функции calcDataPage() параметры offset и rows вычисляются математически, и к исходному SQL запросу добавляется столь важный оператор LIMIT.

После этого методом getPage(), для последующего выводу формируется таблица из соответствующих запрашиваемой таблице записей. Если вам понадобится вывести данные не в виде таблицы, а другом формате, то придется изменить код этой функции.

PHP пагинация

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

Обратите внимание, список страниц будет меняться в зависимости от положения выбранной страницы относительно остальных в списке.

Всего может быть 5 разных вариантов:

Пагинация php

Как видите, отличаются они наличием кнопок навигации и многоточием, означающим, что с соответствующей стороны еще имеется, хотя бы одна доступная страница.

Как реализован данный алгоритм, вы можете посмотреть непосредственно в коде метода, или спросите в комментариях, если будут вопросы.

Завершающим этапом работы конструктора класса Navigator, мы закрываем открытое соединение с базой. Теперь все необходимые данные имеются в полях экземпляра данного класса, и для вывода сгенерированной странце и списка постраничной навигации, нужно лишь обратиться к открытой функции getNavigator().

Обратите ваше внимание на то, что в данном классе доступными из вне, являются только две функции: getNavigator() и __construct().

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

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

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Samigo

    Хороший материал. За это — СПАСИБО!
    Но, у меня есть две замечания:
    1. Я (пока) не волшебник я только учусь, и еще с классами не очень дружу. И CMS систем тоже пока не пробовл (потому что я сам хочу все сделать). Вот, как я понял, в SQL строке «SELECT * FROM models» Вы указали имени таблицы «models» явным образом а не в переменной. Или у всех таблицы имеют одинаковое название?

    2. Я для «своих чудес» «мучаю» dreamweaver. И чтобы посмотреть одним глазком на Ваш «почерк» запустил «DW» и понят не мог что за там текст в комментариях. Если сказать коротко:
    Вам надо добавить в начале своих файлов строку:
    «»
    А то, некоторые (не буду говорит кто это 🙂 ) «нерусские» пользуются кодировкой по умолчанию «utf-8».

    • Dima

      <<<А то, некоторые (не буду говорит кто это 🙂 ) “нерусские” пользуются кодировкой по умолчанию “utf-8″.

      Вот и "нерусские"-то и не используют UTF8, а новички используют пережиток прошлого: dreamweaver и windows-1251

  • Samigo

    Опят 🙂
    попробую по другому:
    mеtа http-еquiv=»Cоntеnt-Туре» соntеnt=»tехt/html; сhаrsеt=windоws-1251″

  • Дiмка

    Добрый день!

    В ходе изучения принципа работы постраничной навигации php был выявлен некий «косяк», связанный с тем, что:
    если передаваемый параметр countRecordOnPage достаточно велик, по сравнению с общим количеством строк выводимой таблице БД, тогда может сложится ситуация когда количество (рассчитанное) страниц для показа окажется меньше linkCount, те количество страниц для показа переданное пользователем. При этом навигатор $navigator «поплывет» показывая что то типо:
    << >> или
    << < … 1 0 1 2 3 или
    << >>
    ну и тд в зависимости от сочетания указанных выше переметров, переданных пользователем.

    Своим решение я добавил в класс Navigator (после строки 150, перед «склееванием» всех частей навигации) сл. код:

    if($this->maxCountRecOnPageLINKCOUNT) {
    $this->LINKCOUNT=$this->maxCountRecOnPage;
    $pager=»»; //отчищаем значение ранее сформерованной номерации страниц
    $rightpoint=»»; //в нашем случае не используется
    $leftpoint=»»; //в нашем случае не используется
    $lastpages=»»; //в нашем случае не используется
    $firstpages=»»; //в нашем случае не используется
    for ($i=1; $imaxCountRecOnPage; $i++){ //»генерируем» новую навигацию
    $class=»linkPage»;
    if($i==$this->NUMBERPAGE)$class=»activ»;
    $pager.=»PARAMNAME.»=».$i.»‘>».$i.»«;
    }
    }

    который создает исключение для случая когда расчетное количество страниц в итоге меньше чем этого «хочет» пользователь.
    Хотя для себя я еще добавил форму с select для задания количество выводимых запесей

    • Спасибо, постараюсь учесть это при реализации следующих версий.

  • Али

    Здравствуйте. Ваш скрипт, очень хорош. Но как сделать, чтобы первая строка имела в виде заголовков не названия полей из БД, а человекоудобные названия? К примеру не «id», а «Номер заявки»… Сам лишь неделю как изучаю ПХП и МаСКУЛ, потому прошу сильно не пинать за вопрос.
    Заранее большое спасибо

  • Oleg

    Здравствуйте.
    Спасибо за статью, ваш скрипт не пригодился — понадобилась его логика, так как сейчас все можно найти готовое но это не интересно =) а написать самому захотелось думал как сделать лучше всего, в вашей статье нашел подтверждение всем своим замыслам.
    Еще раз спасибо

  • Александр

    Здравствуйте. спасибо за статью. Подскажите, пожалуйста где и как прописать кодировку?
    База на CP1251
    Страница

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика