Посторінкова навігація на сайті
Дуже часто буває потреба у створенні постанічної навігації на сайті, наприклад для новин, статей, фотоальбомів, коли кількість записів стає дуже великою і незручною для читання. У цій статті я розповім про те, як створити просту та надійну посторінкову навігацію для вже написаного компонента на PHP.
Етапи створення посторінкової навігації (пейджера)
- Усунення і обмеження, тобто. нормування, виведення даних із моделі (функції виведення даних нашого компонента).
- Формування та виведення динамічного меню, що змінюється в залежності від кількості інформації на сайті, і від межі виведення інформації на одній сторінці.
- Здійснення взаємодії між нашим меню та виведенням даних.
На першому етапі нам потрібно мати можливість обмежувати виведення інформації. Припустимо, у класі News нашого компенента є метод _list(), який здійснює вибірку з таблиці бази даних всіх новин.
Приклад методу _list() не нормалізує виведення інформації
function _list() { $query = 'SELECT * FROM `news` WHERE `status`>0 ORDER BY `id` DESC'; $res = $this->db->fetch_object($query); return (isset($res[0]->id)) ?$res :NULL; }
Формується SQL-запит у якому здійснюється вибірка всіх полів з таблиці news, у яких поле status більше нуля і впорядковує рядки з полю id порядку убування. Після цього це запит відправляються в базу даних, і аналізується дані, шляхом перевірки вмісту в них об'єкта id в масиві з нульовим індексом (результат випонування функції mysqli_fatch_object(), і при його наявності метод віддає ці дані у вигляді масиву об'єктів, в якому кожен елемент масиву є рядком, а кожен об'єкт є полем таблиці news.
Тепер додамо до методу _list() нормалізацію виведення.
Приклад методу _list(), що здійснює нормалізацію виведення інформації
function _list() { $query = 'SELECT * FROM `news` WHERE `status`>0 ORDER BY `id` DESC'; $res = $this->db->fetch_object($query); $this->count = count($res); if (isset($res[0]->id) && (int)$this->limit > 0 && (int)$_REQUEST['step'] > 0) $res = array_slice($res,((int)$_REQUEST['step']-1)*$this->limit, $this->limit); return (isset($res[0]->id)) ?$res :NULL; }
Після отримання даних з таблиці, рахуються елемети масиву, які відповідають кількості всіх рядків, взятих з таблиці news і зберігаються у властивість count. Потім перевіряється, чи встановлено обмеження на виведення даних, що зберігаються в своєрідності limit і заданий в елементі step суперглобального масиву $_REQUEST крок відображення сторінки, тобто. номер сторінки, яку потрібно відобразити? У разі негативної відповіді після перевірки, є дані масивом що містить свійство id, дані віддаються без зміни. Але у разі позитивної відповіді дані нормалізуються за допомогою функції array_slice (array, int1, int2), яка робить вибірку з масиву array починаючи з позиції int1 у елементів int2. І повертає новий отриманий масив, починаючи зі сторінки вказаної в $_REQUEST['step'] в якому міститься кількість рядків, вказана в обмеженні limit.
Для відображення сторінки використовується метод pager(url), якому передається рядковий параметр url до якого потрібно додати номер сторінки за допомогою GET-запиту.
Приклад методу pager(url) формує та виводить динамічне меню.
function pager($url) { if ((int)$this->limit > 0 && $this->count > $this->limit) { $count_page = ((int)$this->limit > 0) ?ceil($this->count/$this->limit) :0; $step_prev = ((int)$_REQUEST['step'] > 0) ?(int)$_REQUEST['step']-1 :0; $step_prev = ((int)$step_prev > 1) ?'/'.$step_prev :NULL; echo '<div style="clear:both;" id="nav_page"><ul><li class="arrow"><a href="/',$url,$step_prev,'">«</a></li>'; for($i=1; ($i-1)<$count_page; ++$i) { $current = ((int)$_REQUEST['step'] == $i) ?'class="current_nav" ' :NULL; $step = ($i > 1) ?'/'.$i :NULL; echo '<li><a',$current,'href="/',$url,$step,'">',$i,'</a></li>'; } $step_next = ((int)$_REQUEST['step'] < $count_page) ?(int)$_REQUEST['step']+1 :$count_page; $step_next = ((int)$step_next > 1) ?'/'.$step_next :NULL; echo '<li class="arrow"><a href="/',$url,$step_next,'">»</a></li></ul></div>'; return $count_page; } else return NULL; }
Відбувається перевірка чи встановлено обмеження у якості limit і якщо встановлено то більше воно ніж у рядків, збережених раніше у якості count? У разі негативної відповіді метод повертає порожнечу. Якщо умови виконуються. то метод формує динамічне меню, що складаються зі стрілок перемикання на одну сторінку більше або менше і цифрових посилань, що відповідають кожним сторінкам даних, при натисканні на які через метод GET інформація про поточну сторінку потрапляє в метод _list() і змінює виведення інформації.
Приклад виклику методів _list() та pager(url), що здійснюють посторінкову навігацію.
$res = $obj->_list(); ............................... Код обробки даних про новини ............................... $obj->pager($_REQUEST['view'].'/'.$obj->id_alias((int)$_REQUEST['id']).'.html');
Значала викликається метод _list(), що нормалізує виведення даних, а потім викликається метод pager(url), що формує та відображає меню посторінкової навігації.