Вход Регистрация
Файл: mg-core/lib/navigator.php
Строк: 226
<?php
/**
 * Класс Navigator - генерирует пейджер для постраничной навигации.
 *
 * @author Авдеев Марк <mark-avdeev@mail.ru>
 * @package moguta.cms
 * @subpackage Libraries
 */
class Navigator{

  
//Блок переменных достуных только внутри класса .

  
private $countRecord; //Количество выводимых записей на странице.
  
private $sql; // Исходный sql запрос.
  
private $maxAcceptedCount; //Количество запеисей вернувшихся по запросуж
  
private $numberPage; //Номер текущей страницы.
  
private $viewAll; //Флаг - показать все страницы.
  
private $paramName; //Имя параметра в GET запросе например "page".
  
private $linkCount; //количество выводимых ссылок на страницы в пайджере.
  
private $returnData = array();
  public  
$allPages = true;
  public 
$poinBetwenIntervar = false;

  
/**
   * Производит  sql запрос и устанавливает параметры.
   * @param type $sql - запрос к базе
   * @param type $numberPage - номер запрашиваемой страницы
   * @param type $countRecord - количество выводимых записаей на одной странице
   * @param type $linkCount - количесво выводимых ссылок в педжере
   * @param type $viewAll - вывести все страницы
   * @param type $paramName - наименование гет переменной указывающей текущую страницу
   */
  
public function __construct($sql, $numberPage, $countRecord = 20, $linkCount = 6, $viewAll = false, $paramName = "page"){
   
    
// Инициализируем переменные класса
    
$this->sql = $sql;
    
$this->countRecord = $countRecord;
    
$this->numberPage = $numberPage;
    
$this->viewAll = $viewAll;
    
$this->paramName = $paramName;

    
//количество ссылок не может быть меньше двух
    
$this->linkCount = $linkCount==1?2:$linkCount;

   
//$this->returnData = Storage::get(md5($sql.$numberPage));    
   //if($this->returnData == null){
      // если не запроcе вывод всего списка записей
      
if(!$this->viewAll){
        
//вычисляем данные для педжера
        
$this->calcDataPage();
      }

      
// выполняем запрос
      
$res = DB::query($this->sql);
     
      
// сохраняем все полученные записи
      
while($row = DB::fetchAssoc($res)){    
        
$this->returnData[] = $row;
      }

   
//  Storage::save(md5($sql.$numberPage),$this->returnData); 
   //}
  
}

  
/**
   * Возвращает результат выполнения  SQL запроса
   * return int
   */
  
public function getNumRowsSql(){
    return 
$this->maxAcceptedCount;
  }

  
/**
   * Возвращает количество записей
   * @return array - массив полученных записей
   */
  
public function getRowsSql(){ 
    if(empty(
$this->returnData)){
      return array();    
    }
    return 
$this->returnData;  
  }

  
/**
   * Возвращает результат выполнения  SQL запроса
   * @return string - пейджер в HTML виде
   */
  
public function getPager($type = "getQuery"){
    return 
$this->createNavigator($type);
  }

  
/**
   * Вычисляет все параметры для составления педжера:
   *  - общее количесво записей.
   *  - часть запроса указывающую на нужную страницу.
   *  - максимально доступное количество страниц
   */
  
private function calcDataPage(){   
    
$result = DB::query($this->sql);

    
//узнаем общее количество возвращенных записей
    
$count = DB::numrows($result);
   
    
$this->maxAcceptedCount = $count;
    
//Вычисляем максимально доступное количество страниц


    // общее количество страниц
    
if(empty($this->countRecord)||!is_numeric($this->countRecord)){$this->countRecord=1;}
    
$maxCountRecOnPage = ceil($count / $this->countRecord);

    
$this->maxCountRecOnPage = $maxCountRecOnPage;
    
// если общее количество страниц меньше чем должно выводиться впейджере
    
if($maxCountRecOnPage <= $this->linkCount){
      
$this->linkCount=$maxCountRecOnPage-1;
    }

    
// если максимальное количество страниц меньше чем номер запрашиваемой
    
if($maxCountRecOnPage <= ($this->numberPage - 1)){
      
      
// если запрашивается  страница пагинации, которая не существует,
      // то в публичной части произойдет редирект на страницу с ошибкой.
      // в админке будет выведена последняя из доступных.
      
if(MG::get('controller')!='controllers_ajax'){
        
header( "HTTP/1.1 404 Not Found" );
        
MG::redirect('/404');
        exit();      
      }
      
// то запросим у MySql последнюю доступную страницу
      
$pos = $maxCountRecOnPage - 1;
      
$pos = $pos>0?$pos:0;
      
//если номер запрашиваемой страницы, меньше либо равен 0
    
}elseif(0 >= ($this->numberPage - 1)){

      
//то запросим у MySql первую доступную страницу
      
$pos = 0;

      
// если запрашиваемая страница попадает в диапазон существующих
    
}else{
      
//то запросим у MySql нужную страницу
      
$pos = $this->numberPage - 1;
    }

    
    
// к запросу дописываем параметр вывода записей с нужной позиции, и их количесвто
    
$this->sql = $this->sql." LIMIT ".$pos * $this->countRecord.", ".$this->countRecord;
  }

  private function 
createNavigator($type){


    
// если все записи помещаются на одной странице не формируем навигатор
    
if($this->maxAcceptedCount < $this->countRecord){
      return 
false;
    }

    
//формирование  навигатора
    //если текущая страница, выходит за рамки допустимых, то показываем первую доступную с нужной стороны.
    
if($this->numberPage <= 0){
      
$this->numberPage = 1; // если текущая страница меньше первой то показываем всегда перву.
    
}
    if(
$this->numberPage > $this->maxCountRecOnPage){
      
$this->numberPage = $this->maxCountRecOnPage; // если текущая страница больше последней то показываем всегда последнюю.
    
}


    
$first = '';
    
$prev = '';
    
$next = '';
    
$last = '';
    
//создаем кнопки для навигатора
    
if($this->numberPage > 1){ // если не первая страница
      
$prev = $this->gelLink('linkPage navButton', ($this->numberPage - 1), $type, '&laquo;');
      
$first = $this->gelLink('linkPage navButton', (1), $type, '&laquo;&laquo;');
    }
    if(
$this->numberPage < $this->maxCountRecOnPage){ // если не последняя страница
      
$next = $this->gelLink('linkPage navButton', ($this->numberPage + 1), $type, '&raquo;');
      
$last = $this->gelLink('linkPage navButton', ($this->maxCountRecOnPage), $type, '&raquo;&raquo;');
    }

    
// если количесво доступных страниц меньше требуемого, то вывести лишь возможные
    
if($this->linkCount > $this->maxCountRecOnPage){
      
$this->linkCount = $this->maxCountRecOnPage;
    }



    
$half = floor($this->linkCount / 2);

    
$pager = '';
    if(
$this->allPages){
      
$allPages='<div class="allPages">Всего '.$this->maxCountRecOnPage.' страниц</div>';
    };
    
// если все записи помещаются на двух страницах выводим только две ссылки
    
if($this->linkCount==1){
       for(
$i = 1; $i <= 2; $i++){
      
$class = "linkPage";
      if(
$i == $this->numberPage){
        
$class = "active";
      }
      
$pager.=$this->gelLink($class, $i, $type);

      
// возвращаем полученный список страниц
      
}
      
$navigator = '<div class="mg-pager">'.$allPages.'<ul>'.$pager."</ul></div>";

      return 
$navigator;
    }


    
//средняя часть навигатора , вывод ссылок по половине от общего числа выводимых
    //по обе стороны текущей страницы
    
for($i = ($this->numberPage - $half);
        
$i <= ($this->numberPage + $half);
        
$i++){

      
//всем ссылкам назначается класс 'linkPage'
      
$class = "linkPage";

      
//если ссылка идет на текущую страницу то ей присваивается особый класс active
      
if($i == $this->numberPage){
        
$class = "active";
      }

      
$noneftpoint = false;
      
$norightpoint = false;
      
$leftpoint = '';
      
$lastpages = ''; 
     
      
// формирование ссылок на добавочные с конца страницы
      
if($i <= 0){

        
$numberPage = (abs($i) + $this->numberPage + $half + 1);
        
$lastpages = $this->gelLink($class, $numberPage, $type).$lastpages;
        
// если начали добавлять страницы, убираем точки с другого конца
        
$leftpoint = "";
        
// флаг о том что точки слева убраны
        
$noneftpoint = true;
      }

      
$firstpages ='';
      
$rightpoint ='';
      
// формирование ссылок на добавочные с начала страницы
      
if($i > $this->maxCountRecOnPage){
        
$numberPage = (abs($i - $this->maxCountRecOnPage - $this->numberPage + $half));
        
$firstpages = $this->gelLink($class, $numberPage, $type).$firstpages;
        
$norightpoint = true; //если начали добавлять  страницы, убираем точки с другого конца
        
$rightpoint = ""; // флаг о том что точки справа убраны
      
}


        if(
$i > 0 && $i <= $this->maxCountRecOnPage){ //если формируемая ссылка попадает в интервал допустимых страниц
          
if(!$noneftpoint && $this->poinBetwenIntervar)
            
$leftpoint = "<span class='point'>...</span>"; //добавляем точки слева от списка
          
$pager.=$this->gelLink($class, $i, $type); //создаем ссылку
          
if(!$norightpoint && $this->poinBetwenIntervar)
            
$rightpoint = "<span class='point'>...</span>"; //добавляем точки справа от списка
        
}

    }

    
//склеиваем все сгенерированные части навигатора
    
$navigator = '<div class="mg-pager">'.$allPages.'<ul>'.$first.$prev.$leftpoint.$firstpages.$pager.$lastpages.$rightpoint.$next.$last."</ul></div>";
    
// возвращаем полученный список страниц
    
return $navigator;
  }

  private function 
gelLink($class, $numberPage, $type = "getQuery", $ancor = null){
    
$href = "href='javascript:void(0);'";
    if(
$type == "forAjax"){
      
$href = "href='javascript:void(0);'";
    }
    if(
$type == "getQuery"){
     
$href =  "href='".URL::add_get($_SERVER['REQUEST_URI'], $this->paramName, $numberPage)."'";
    }
    
$ancor = $ancor ? $ancor : $numberPage;
    return 
"<li><a class='".$class." page_".$numberPage."' ".$href." >".$ancor."</a></li>";
  }

}
Онлайн: 2
Реклама