<?php
/*
* Класс постраничной навигации для файлов
* class Navigation
* @param $input - массив данных ( array() - для файлов, int - для записей из бд )
* @param $on_page - сколько результатов выводить на странице ( int )
* @param $print_str - писать ли возле ссылок на страницы Стр. ( bool (true / false ) )
* @param $order - сортировка для файлов, asc - по возрастанию, desc - по убыванию ( string ( asc , desc ))
* @param $link - строка запроса, которая прицепится к ссылкам на страницы ( string )
*
*
*
* ################# Пример использования #####################
* ################################################################
* 1.Навигация для БД
* // считаем все поля которые подходят для вывода
* $allfield = mysql_result(mysql_query("select count(*) from `TABLE`;"),0);
*
* $newlist = new Navigation($allfield, // кол-во полей для вывода
* 5, // выводить 5 записей на страницу
* true); // выводить "Стр." возле ссылок навигации
*
* $query = mysql_query("select * from `TABLE` order by `id` asc limit ". $newlist->limit().";");
* while($res = mysql_fetch_assoc($query))
* {
* echo $res['field'].'<br />';
* }
* echo $newlist->pagination();
*
* ###############################################################
* 2. Навигация для файлов/текста
*
* $rfile - массив с файлами/текстом
*
*
* $newlist = new Navigation($rfile, // массив с файлами/текстом
* 5, // 5 елементов на страницу
* true, // писать "Стр." возле ссылок на страницы
* 'asc'); // сортировка по возрастанию
*
* foreach($newlist->result_files() as $key => $val)
* {
* echo $val.'<br />';
* }
*
* ################ Методы #####################
*
* $newlist->result_files(); - результирующий массив файлов, на страницу
* $newlist->back_forward_links(); - показывает ссылки << Назад | Вперед >>
* $newlist->pagination(); - выводит строку ссылок на страницы
* $newlist->show_info(); - показывает информацию сколько всего файлов(+параметры)
* $newlist->show_form(); - показывает форму быстрого перехода(+параметры)
* $newlist->limit(); - лимит, при использовании БД
*
* ############### Дополнительные свойства #####################
*
* 1. Чтоб при заходе на страницу с постраничной навигацией, сразу кидало
* в конец списка, добавьте к ссылке _GET параметр "last"
* ( например "list.php?last" )
*
* 2. Ненужные или запрещенные файлы к показу, надо зараннее выбросить из массива $input
* ("." , ".." , ".htaccess" к примеру)
*/
class Navigation {
// конструктор, высчитывание обязательных (и не очень) переменных
public function __construct($input,$on_page,$print_str = false, $order = 'asc',$link = '?')
{
// если входящий массив
if(is_array($input))
{
// перестройка массива в нужный формат для навигации
$this->rfile=array_values($input);
// счетчик файлов
$this->all_files = count($this->rfile);
// оборачиваем(сортируем в нужном направлении) или оставляем без изменений массив файлов
$this->rfile = $order == 'asc' ? $this->rfile : array_reverse($this->rfile);
$this->type_result = 'Файлов';
}
else
{
$this->all_files = $input;
$this->type_result = 'Записей';
}
// линк который цеплять к ссылкам постранички
$this->link = $link;
// сколько результатов на страницу
$this->on_page = $on_page < 1 ? 1 : $on_page;
// пишем или не пишем Стр.
$this->str = $print_str === true ? '' : '';
// сортировка, asc - по убыванию, desc - по возрастанию
$this->order = $order;
// всего страниц
$this->all_pages = ceil($this->all_files / $this->on_page);
// если не установлен page = он равен 1, если установленый page больше
// за все страниц - окончательный page равен последней странице
$this->page = !isset($_GET['p']) || $_GET['p'] <= 0 ? 1 : abs(intval($_GET['p']));
$this->page = $this->page > $this->all_pages ? $this->all_pages : $this->page;
// бросать ли на последнюю страницу
$this->page = isset($_GET['last']) ? $this->all_pages : $this->page;
// старт и конец отсчета файлов в массиве
$this->start = ($this->page * $this->on_page) - 1;
// если число больше чем файлов, знач максим число = это число файлов
$this->start = $this->start > $this->all_files ? $this->all_files : $this->start;
// начальное число массива
$this->end = ($this->page * $this->on_page)- $this->on_page;
// последние 3 страницы
$this->last_three_page = $this->all_pages - 2;
// "стрелочки" возле ссылок Вперед/Назад
$this->lt = '← '; // Назад
$this->gt = ' →'; // Вперед
}
/**
* вывод списка страниц
*/
public function pagination($pag = false) {
// пишем или не пишем Стр.
$string_pages = $this->str;
// если страниц больше чем 10, выводим тройной линк, иначе все ссылки подряд
if($this->all_pages > 10)
{
// если текущая страница меньше равна 3
// выводим первые три ссылки и последние
if($this->page <= 3)
{
// выводим первые три ссылки
for($i=1;$i<=3;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
// если пейдж 3 - рендерим 4 сстраницу
if($this->page == 3)
{
$string_pages .= ' <a href="'.$this->link.'&p=4">4</a> ';
}
// и последние 3 ссылки, через троеточие
$string_pages .= '...';
for($i = $this->last_three_page;$i<=$this->all_pages;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
}
// если ссылки вышли за радиус обзора, т.е в середину списка
elseif($this->page < 6 && $this->page <= $this->last_three_page)
{
// выводим первые три ссылки
for($i=1;$i<=6;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
// и последние 3 ссылки, через троеточие
$string_pages .= '...';
for($i = $this->last_three_page;$i<=$this->all_pages;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
}
// если выбранная страница >= 6
elseif($this->page >= 6 && $this->page <= ($this->last_three_page - 2))
{
// выводим первые три ссылки
for($i=1;$i<=3;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
$string_pages .= '...';
// одна ссылка слева/ неактивная посредине / ссылка справа
$string_pages .= ' <a href="'.$this->link.''.$pag.'&p='.($this->page - 1).'">'.($this->page - 1).'</a> ';
$string_pages .= ' '.$this->page.' ';
$string_pages .= ' <a href="'.$this->link.''.$pag.'&p='.($this->page + 1).'">'.($this->page + 1).'</a> ';
// и последние 3 ссылки, через троеточие
$string_pages .= '...';
for($i = ($this->last_three_page);$i<=$this->all_pages;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.'&p='.$i.'">'.$i.'</a> ';
}
}
// если выбранные ссылки в конце
elseif(($this->page + 1) >= ($this->last_three_page))
{
// выводим первые три ссылки
for($i=1;$i<=3;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
// и последние 3 ссылки, через троеточие
$string_pages .= '...';
for($i = ($this->last_three_page - 3);$i<=$this->all_pages;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.'&p='.$i.'">'.$i.'</a> ';
}
}
}
else
{
// вывод всех ссылок, если ссылок <= 10
for($i=1;$i<=$this->all_pages;$i++)
{
$string_pages .= $this->page == $i ? ' '.$i.' ' : ' <a href="'.$this->link.''.$pag.'&p='.$i.'">'.$i.'</a> ';
}
}
return '<div style="text-align:center;font-weight:bold;" class="mainpost">'.$string_pages.'</div>';
}
/*
* function result_files
* результирующий массив файлов
*/
public function result_files() {
$this->arr = array();
for($i=$this->end;$i<=$this->start;$i++)
{
if(isset($this->rfile[$i]))
{
$this->arr[$i] = $this->rfile[$i];
}
}
return $this->arr;
}
/*
* function show_info
* выводим сколько всего файлов
*/
public function show_info($vsego = false) {
$res = $vsego != false ? $vsego : $this->type_result;
return $res.': '.$this->all_files;
}
/*
* function back_forward_links
* функция вывода линков вида - Назад | Вперед
*/
public function back_forward_links($razdelitel = ' | ' , $poradok = true) {
if($poradok === true)
{
if($this->page <= 1)
{
$this->this_links = '<a href="'.$this->link.'&p='.($this->page+1).'">Вперед'.$this->gt.'</a>';
}
elseif($this->page >= $this->all_pages)
{
$this->this_links = '<a href="'.$this->link.'&p='.($this->page-1).'">'.$this->lt.'Назад</a>';
}
else
{
$this->this_links = '<a href="'.$this->link.'&p='.($this->page-1).'">'.$this->lt.'Назад</a>'.$razdelitel.'<a href="'.$this->link.'&p='.($this->page+1).'">Вперед'.$this->gt.'</a>';
}
}
else
{
if($this->page <= 1)
{
$this->this_links = '<a href="'.$this->link.'&p='.($this->page+1).'">Назад'.$this->gt.'</a>';
}
elseif($this->page >= $this->all_pages)
{
$this->this_links = '<a href="'.$this->link.'&p='.($this->page-1).'">'.$this->lt.'Вперед</a>';
}
else
{
$this->this_links = '<a href="'.$this->link.'&p='.($this->page-1).'">'.$this->lt.'Вперед</a>'.$razdelitel.'<a href="'.$this->link.'&p='.($this->page+1).'">Назад'.$this->gt.'</a>';
}
}
return $this->this_links;
}
/*
* function show_form
* функция показа формы для перехода
*/
public function show_form($array = array()) {
$hidden = '';
// добавляем скрытые поля к форме
if(count($array) > 0)
{
foreach($array as $key => $value)
{
$hidden .= '<input type="hidden" name="'.$key.'" value="'.$value.'" />';
}
}
return '<form action="'.$_SERVER['PHP_SELF'].'" method="get">'.
'<div>'.$hidden.
'Стр. <input type="text" size="4" name="p" value="'.$this->page.'" />'.
'<input type="submit" value="Go!" />'.
'</div>'.
'</form>';
}
/*
* function limit
* Лимит выводящих записей
*/
function limit() {
// высчитываем лимиты
return 'limit '.(($this->page*$this->on_page)-$this->on_page).' ,'.$this->on_page." ;";
}
}
?>