View file system/inc/classes/navigation.class.php

File size: 19.99Kb
<?
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() {
    // пишем или не пишем Стр.
    $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 class="navigation" href="'.$this->link.'&amp;p='.$i.'">'.$i.'</a> ';
            }
            
            // если пейдж 3 - рендерим 4 сстраницу
            if($this->page == 3)
            {
                $string_pages .= ' <a class="navigation" 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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&amp;p='.$i.'">'.$i.'</a> ';
            }
            $string_pages .= '...';
            
            // одна ссылка слева/ неактивная посредине / ссылка справа
            $string_pages .= ' <a class="navigation" href="'.$this->link.'&amp;p='.($this->page - 1).'">'.($this->page - 1).'</a> ';
            $string_pages .= ' '.$this->page.' ';
            $string_pages .= ' <a class="navigation" href="'.$this->link.'&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 class="navigation" 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 class="navigation" href="'.$this->link.'&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 class="navigation" 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 class="navigation" href="'.$this->link.'&amp;p='.$i.'">'.$i.'</a> ';
        }
    }
    return $string_pages; 
}

public function paginationid() {
global $id;
    // пишем или не пишем Стр.
    $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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&amp;p='.$i.'">'.$i.'</a> ';
            }
            $string_pages .= '...';
            
            // одна ссылка слева/ неактивная посредине / ссылка справа
            $string_pages .= ' <a href="'.$this->link.'&amp;p='.($this->page - 1).'">'.($this->page - 1).'</a> ';
            $string_pages .= ' '.$this->page.' ';
            $string_pages .= ' <a href="'.$this->link.'&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 class="navigation" 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 class="navigation" href="'.$this->link.'&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 class="navigation" 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 class="navigation" href="'.$this->link.'id='.$id.'&amp;p='.$i.'">'.$i.'</a> ';
        }
    }
    return $string_pages; 
}

public function paginationdir() {
global $id;
    // пишем или не пишем Стр.
    $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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&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 class="navigation" href="'.$this->link.'&amp;p='.$i.'">'.$i.'</a> ';
            }
            $string_pages .= '...';
            
            // одна ссылка слева/ неактивная посредине / ссылка справа
            $string_pages .= ' <a href="'.$this->link.'&amp;p='.($this->page - 1).'">'.($this->page - 1).'</a> ';
            $string_pages .= ' '.$this->page.' ';
            $string_pages .= ' <a href="'.$this->link.'&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 class="navigation" 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 class="navigation" href="'.$this->link.'&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 class="navigation" 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 class="navigation" href="'.$this->link.'dir='.$id.'&amp;p='.$i.'">'.$i.'</a> ';
        }
    }
    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 = '<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." ;";
}

}
?>