Source for file Pager.class.php

Documentation is available at Pager.class.php

  1. /**
  2.  * Класс Pager
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author 1m.dm
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkPager.class.php.html,v 1.1 2007/09/17 14:32:34 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/Object.class.php';
  12. require_once 'core/modules/share/components/Toolbar.class.php';
  13.  
  14. /**
  15.  * Список страниц для навигации при постраничном выводе.
  16.  *
  17.  * @package energine
  18.  * @subpackage core
  19.  * @final
  20.  */
  21. final class Pager extends Object {
  22.  
  23.     /**
  24.      * Количество отображаемых номеров страниц с каждой стороны от текущей
  25.      *
  26.      * Пример для VISIBLE_PAGES_COUNT = 3
  27.      * 1 2 ... 5  6  7 _8_ 9 10 11 ... 455 456
  28.      */
  29.     const VISIBLE_PAGES_COUNT = 2;
  30.  
  31.     /**
  32.      * @access private
  33.      * @var int количество записей на странице
  34.      */
  35.     private $recordsPerPage;
  36.  
  37.     /**
  38.      * @access private
  39.      * @var int количество страниц
  40.      */
  41.     private $numPages = 0;
  42.  
  43.     /**
  44.      * @access private
  45.      * @var int общее количество записей
  46.      */
  47.     private $recordsCount;
  48.  
  49.     /**
  50.      * @access private
  51.      * @var int номер текущей страницы
  52.      */
  53.     private $currentPage;
  54.  
  55.     /**
  56.      * @access private
  57.      * @var array дополнительные свойства списка страниц
  58.      */
  59.     private $properties = array();
  60.  
  61.     /**
  62.      * Конструктор класса.
  63.      *
  64.      * @access public
  65.      * @param int $recordsPerPage 
  66.      * @param int $currentPage 
  67.      * @return void 
  68.      */
  69.     public function __construct($recordsPerPage 0$currentPage 1{
  70.         parent::__construct();
  71.  
  72.         $this->setRecordsPerPage($recordsPerPage);
  73.         $this->setCurrentPage($currentPage);
  74.     }
  75.  
  76.     /**
  77.      * Устанавливает количество записей на странице.
  78.      *
  79.      * @access public
  80.      * @param int $recordsPerPage 
  81.      * @return void 
  82.      */
  83.     public function setRecordsPerPage($recordsPerPage{
  84.         $recordsPerPage = intval($recordsPerPage);
  85.         if ($recordsPerPage 1{
  86.             throw new SystemException('ERR_DEV_BAD_RECORDS_PER_PAGE'SystemException::ERR_DEVELOPER);
  87.         }
  88.         $this->recordsPerPage = $recordsPerPage;
  89.     }
  90.  
  91.     /**
  92.      * Возвращает количество записей на странице.
  93.      *
  94.      * @access public
  95.      * @return int 
  96.      */
  97.     public function getRecordsPerPage({
  98.         return $this->recordsPerPage;
  99.     }
  100.  
  101.     /**
  102.      * Возвращает количество страниц.
  103.      *
  104.      * @access public
  105.      * @return int 
  106.      */
  107.     public function getNumPages({
  108.         return $this->numPages;
  109.     }
  110.  
  111.     /**
  112.      * Устанавливает номер текущей страницы.
  113.      *
  114.      * @access public
  115.      * @param int $currentPage 
  116.      */
  117.     public function setCurrentPage($currentPage{
  118.         $currentPage = intval($currentPage);
  119.         if ($currentPage 1{
  120.             throw new SystemException('ERR_DEV_BAD_PAGE_NUMBER'SystemException::ERR_DEVELOPER);
  121.         }
  122.         $this->currentPage = $currentPage;
  123.     }
  124.  
  125.     /**
  126.      * Устанавливает общее количество записей.
  127.      *
  128.      * @access public
  129.      * @param int $count 
  130.      * @return void 
  131.      */
  132.     public function setRecordsCount($count{
  133.         $recordsCount = intval($count);
  134.         if ($recordsCount 0{
  135.             throw new SystemException('ERR_DEV_BAD_RECORDS_COUNT'SystemException::ERR_DEVELOPER);
  136.         }
  137.         $this->recordsCount = $recordsCount;
  138.         // пересчитываем количество страниц
  139.         $this->numPages = ceil($this->recordsCount / $this->recordsPerPage);
  140.     }
  141.  
  142.     /**
  143.      * Возвращает общее количество записей.
  144.      *
  145.      * @access public
  146.      * @return int 
  147.      */
  148.     public function getRecordsCount({
  149.         return $this->recordsCount;
  150.     }
  151.  
  152.     /**
  153.      * Возвращает номер текущей страницы.
  154.      *
  155.      * @access public
  156.      * @return int 
  157.      */
  158.     public function getCurrentPage({
  159.         return $this->currentPage;
  160.     }
  161.  
  162.     /**
  163.      * Устанавливает свойство списка страниц.
  164.      *
  165.      * @access public
  166.      * @param string $name 
  167.      * @param mixed $value 
  168.      * @return void 
  169.      */
  170.     public function setProperty($name$value{
  171.         $this->properties[$name$value;
  172.     }
  173.  
  174.     /**
  175.      * Возвращает лимит выборки для SELECT-запроса.
  176.      *
  177.      * @access public
  178.      * @return array 
  179.      * @see QAL::select()
  180.      */
  181.     public function getLimit({
  182.         return array(($this->getCurrentPage(1$this->getRecordsPerPage()$this->getRecordsPerPage());
  183.     }
  184.  
  185.     /**
  186.      * Строит документ списка страниц и возвращает ссылку на корневой узел документа.
  187.      *
  188.      * @access public
  189.      * @return DOMNode 
  190.      */
  191.     public function build({
  192.  
  193.         $pager new Toolbar('pager');
  194.         if (!empty($_GET)) {
  195.             $this->setProperty('get_string'http_build_query($_GET));
  196.         }
  197.         if (!empty($this->properties)) {
  198.             foreach ($this->properties as $propName => $propValue{
  199.                 $pager->setProperty($propName$propValue);
  200.             }
  201.         }
  202.  
  203.         $pager->setProperty('from'DBWorker::_translate('TXT_FROM'));
  204.         $pager->setProperty('to'DBWorker::_translate('TXT_TO'));
  205.  
  206.  
  207.         $startPage (($page $this->currentPage - self::VISIBLE_PAGES_COUNT1)?1:$page;
  208.         $endPage  (($page $this->currentPage + self::VISIBLE_PAGES_COUNT$this->numPages)?$this->numPages:$page;
  209.  
  210.         if ($startPage 1{
  211.             $control new Link("page1"1false1);
  212.             $pager->attachControl($control);
  213.         }
  214.         if ($startPage 2{
  215.             $control new Link("page2"2false2);
  216.             $pager->attachControl($control);
  217.             if ($startPage != 1{
  218.                 $control->setAttribute('start_break''start_break');
  219.             }
  220.         }
  221.  
  222.         for ($i $startPage$i <= $endPage$i++{
  223.             $isCurrent ($i == $this->currentPage);
  224.  
  225.             $control new Link("page$i"$ifalse$i);
  226.             if ($isCurrent{
  227.                 $control->disable();
  228.             }
  229.             $pager->attachControl($control);
  230.         }
  231.  
  232.         if ($endPage $this->numPages - 1{
  233.             $control new Link("page".($this->numPages-1)$this->numPages-1false$this->numPages-1);
  234.             $pager->attachControl($control);
  235.             if ($endPage != $this->numPages - 2{
  236.                 $control->setAttribute('end_break''end_break');
  237.             }
  238.         }
  239.         if ($endPage $this->numPages{
  240.             $control new Link("page$this->numPages"$this->numPagesfalse$this->numPages);
  241.             $pager->attachControl($control);
  242.         }
  243.  
  244.         return $pager->build();
  245.     }
  246. }

Documentation generated on Mon, 17 Sep 2007 13:30:53 +0300 by phpDocumentor 1.4.0a2