limit().";"); * while($res = mysql_fetch_assoc($query)) * { * echo $res['field'].'
'; * } * echo $newlist->pagination(); * * ############################################################### * 2. Навигация для файлов/текста * * $rfile - массив с файлами/текстом * * * $newlist = new Navigation($rfile, // массив с файлами/текстом * 5, // 5 елементов на страницу * true, // писать "Стр." возле ссылок на страницы * 'asc'); // сортировка по возрастанию * * foreach($newlist->result_files() as $key => $val) * { * echo $val.'
'; * } * * ################ Методы ##################### * * $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() { // пишем или не пишем Стр. $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.' ' : ' '.$i.' '; } // если пейдж 3 - рендерим 4 сстраницу if($this->page == 3) { $string_pages .= ' 4 '; } // и последние 3 ссылки, через троеточие $string_pages .= '...'; for($i = $this->last_three_page;$i<=$this->all_pages;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } } // если ссылки вышли за радиус обзора, т.е в середину списка elseif($this->page < 6 && $this->page <= $this->last_three_page) { // выводим первые три ссылки for($i=1;$i<=6;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } // и последние 3 ссылки, через троеточие $string_pages .= '...'; for($i = $this->last_three_page;$i<=$this->all_pages;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } } // если выбранная страница >= 6 elseif($this->page >= 6 && $this->page <= ($this->last_three_page - 2)) { // выводим первые три ссылки for($i=1;$i<=3;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } $string_pages .= '...'; // одна ссылка слева/ неактивная посредине / ссылка справа $string_pages .= ' '.($this->page - 1).' '; $string_pages .= ' '.$this->page.' '; $string_pages .= ' '.($this->page + 1).' '; // и последние 3 ссылки, через троеточие $string_pages .= '...'; for($i = ($this->last_three_page);$i<=$this->all_pages;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } } // если выбранные ссылки в конце elseif(($this->page + 1) >= ($this->last_three_page)) { // выводим первые три ссылки for($i=1;$i<=3;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } // и последние 3 ссылки, через троеточие $string_pages .= '...'; for($i = ($this->last_three_page - 3);$i<=$this->all_pages;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } } } else { // вывод всех ссылок, если ссылок <= 10 for($i=1;$i<=$this->all_pages;$i++) { $string_pages .= $this->page == $i ? ' '.$i.' ' : ' '.$i.' '; } } return $string_pages; } /* * 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 = 'Вперед'.$this->gt.''; } elseif($this->page >= $this->all_pages) { $this->this_links = ''.$this->lt.'Назад'; } else { $this->this_links = ''.$this->lt.'Назад'.$razdelitel.'Вперед'.$this->gt.''; } } else { if($this->page <= 1) { $this->this_links = 'Назад'.$this->gt.''; } elseif($this->page >= $this->all_pages) { $this->this_links = ''.$this->lt.'Вперед'; } else { $this->this_links = ''.$this->lt.'Вперед'.$razdelitel.'Назад'.$this->gt.''; } } return $this->this_links; } /* * function show_form * функция показа формы для перехода */ public function show_form($array = array()) { $hidden = ''; // добавляем скрытые поля к форме if(count($array) > 0) { foreach($array as $key => $value) { $hidden .= ''; } } return '
'. '
'.$hidden. 'Стр. '. ''. '
'. '
'; } /* * function limit * Лимит выводящих записей */ function limit() { // высчитываем лимиты return 'limit '.(($this->page*$this->on_page)-$this->on_page).' ,'.$this->on_page." ;"; } } ?>