Просмотр файла engine/classes/pages.class.php

Размер файла: 14.35Kb
<?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 = '&#8592; '; // Назад 
    $this->gt = ' &#8594;'; // Вперед 
} 
/** 
  *  вывод списка страниц  
  */ 
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.'&amp;p='.$i.'">'.$i.'</a> '; 
            } 
             
            // если пейдж 3 - рендерим 4 сстраницу 
            if($this->page == 3) 
            { 
                $string_pages .= ' <a href="'.$this->link.'&amp;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.'&amp;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.'&amp;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.'&amp;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.'&amp;p='.$i.'">'.$i.'</a> '; 
            } 
            $string_pages .= '...'; 
             
            // одна ссылка слева/ неактивная посредине / ссылка справа 
            $string_pages .= ' <a href="'.$this->link.''.$pag.'&amp;p='.($this->page - 1).'">'.($this->page - 1).'</a> '; 
            $string_pages .= ' '.$this->page.' '; 
            $string_pages .= ' <a href="'.$this->link.''.$pag.'&amp;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.'&amp;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.'&amp;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.'&amp;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.'&amp;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.'&amp;p='.($this->page+1).'">Вперед'.$this->gt.'</a>'; 
    } 
    elseif($this->page >= $this->all_pages) 
    { 
        $this->this_links = '<a href="'.$this->link.'&amp;p='.($this->page-1).'">'.$this->lt.'Назад</a>'; 
    } 
    else 
    { 
        $this->this_links = '<a href="'.$this->link.'&amp;p='.($this->page-1).'">'.$this->lt.'Назад</a>'.$razdelitel.'<a href="'.$this->link.'&amp;p='.($this->page+1).'">Вперед'.$this->gt.'</a>'; 
    } 
    } 
    else 
    { 
        if($this->page <= 1) 
    { 
        $this->this_links = '<a href="'.$this->link.'&amp;p='.($this->page+1).'">Назад'.$this->gt.'</a>'; 
    } 
    elseif($this->page >= $this->all_pages) 
    { 
        $this->this_links = '<a href="'.$this->link.'&amp;p='.($this->page-1).'">'.$this->lt.'Вперед</a>'; 
    } 
    else 
    { 
        $this->this_links = '<a href="'.$this->link.'&amp;p='.($this->page-1).'">'.$this->lt.'Вперед</a>'.$razdelitel.'<a href="'.$this->link.'&amp;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." ;"; 
} 

} 
?>