Посторінкова навігація на сайті

15.07.2011

Дуже часто буває потреба у створенні постанічної навігації на сайті, наприклад для новин, статей, фотоальбомів, коли кількість записів стає дуже великою і незручною для читання. У цій статті я розповім про те, як створити просту та надійну посторінкову навігацію для вже написаного компонента на PHP.

Етапи створення посторінкової навігації (пейджера)

  1. Усунення і обмеження, тобто. нормування, виведення даних із моделі (функції виведення даних нашого компонента).
  2. Формування та виведення динамічного меню, що змінюється в залежності від кількості інформації на сайті, і від межі виведення інформації на одній сторінці.
  3. Здійснення взаємодії між нашим меню та виведенням даних.
    1. На першому етапі нам потрібно мати можливість обмежувати виведення інформації. Припустимо, у класі 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,'">&laquo;</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,'">&raquo;</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), що формує та відображає меню посторінкової навігації.

Останнє в нашому блозі

Інтернет маркетинг
04.11.2019