| 1: | <?php |
| 2: | |
| 3: | namespace Zippy\Html\DataList; |
| 4: | |
| 5: | use Zippy\Html\HtmlContainer; |
| 6: | |
| 7: | /** |
| 8: | * Базовый клас для компонентов - списков(таблиц) данных |
| 9: | */ |
| 10: | abstract class AbstractList extends HtmlContainer |
| 11: | { |
| 12: | protected $pagesize = PHP_INT_MAX; |
| 13: | protected $currentpage = 1; |
| 14: | protected $DataSource; |
| 15: | protected $pagerowscount = 0; |
| 16: | protected $rowscount = -1; |
| 17: | protected $sortf = null; |
| 18: | protected $sortd = null; |
| 19: | |
| 20: | /** |
| 21: | * Конструктор |
| 22: | * @param ID компонента |
| 23: | * @param Zippy\Interfaces\DataSource Источник данных |
| 24: | */ |
| 25: | public function __construct($id, $DataSource) { |
| 26: | HtmlContainer::__construct($id); |
| 27: | $this->DataSource = $DataSource; |
| 28: | $this->pagesize = PHP_INT_MAX; |
| 29: | } |
| 30: | |
| 31: | /** |
| 32: | * Возвращает количество всех строк в наборе |
| 33: | */ |
| 34: | public function getAllRowsCount() { |
| 35: | |
| 36: | if ($this->rowscount == -1) { |
| 37: | $this->rowscount = $this->DataSource->getItemCount(); |
| 38: | } |
| 39: | return $this->rowscount; |
| 40: | } |
| 41: | |
| 42: | /** |
| 43: | * Возвращает количество всех строк на текущей странице |
| 44: | */ |
| 45: | public function getPageRowsCount() { |
| 46: | return $this->pagerowscount; |
| 47: | } |
| 48: | |
| 49: | /** |
| 50: | * Возвращает размер страницы |
| 51: | */ |
| 52: | public function getPageSize() { |
| 53: | return $this->pagesize; |
| 54: | } |
| 55: | |
| 56: | /** |
| 57: | * Устанавливает размер страницы данных |
| 58: | * @param int Количество строк в странице данных |
| 59: | */ |
| 60: | public function setPageSize($pagesize) { |
| 61: | if ($pagesize > 0) { |
| 62: | $this->pagesize = $pagesize; |
| 63: | } else { |
| 64: | $this->pagesize = 20; |
| 65: | } |
| 66: | |
| 67: | $this->currentpage = 1; |
| 68: | // $this->Reload(); |
| 69: | } |
| 70: | |
| 71: | /** |
| 72: | * Возвращает номер текущей страницы |
| 73: | * @return int |
| 74: | */ |
| 75: | public function getCurrentPage() { |
| 76: | return $this->currentpage; |
| 77: | } |
| 78: | |
| 79: | /** |
| 80: | * Устанавливает текущую страницу |
| 81: | * @param int Номер страницы |
| 82: | * @see Paginator |
| 83: | */ |
| 84: | public function setCurrentPage($page) { |
| 85: | if ($page > 0 && $page <= $this->getPageCount()) { |
| 86: | $this->currentpage = $page; |
| 87: | } else { |
| 88: | $this->currentpage = 1; |
| 89: | } |
| 90: | |
| 91: | // $start = ($this->currentpage - 1) * $this->pagesize; |
| 92: | // $this->setPageRows($start, $this->pagesize); |
| 93: | // $this->Reload(); |
| 94: | } |
| 95: | |
| 96: | /** |
| 97: | * Количество страниц в списке |
| 98: | */ |
| 99: | final public function getPageCount() { |
| 100: | |
| 101: | $rowcount = $this->getAllRowsCount(); |
| 102: | return ceil($rowcount / $this->pagesize); |
| 103: | } |
| 104: | |
| 105: | /** |
| 106: | * Обновляет данные с провайдера |
| 107: | */ |
| 108: | public function Reload($resetpage = true) { |
| 109: | |
| 110: | if ($resetpage) { |
| 111: | $this->setCurrentPage(1); |
| 112: | $this->rowscount = -1; |
| 113: | } |
| 114: | } |
| 115: | |
| 116: | /** |
| 117: | * Возвращает ссылку на источник данных |
| 118: | * |
| 119: | */ |
| 120: | public function getDataSource() { |
| 121: | return $this->DataSource; |
| 122: | } |
| 123: | |
| 124: | public function setDataSource($ds) { |
| 125: | $this->DataSource = $ds; |
| 126: | } |
| 127: | |
| 128: | |
| 129: | /** |
| 130: | * Возвращает данные текущей страницы |
| 131: | */ |
| 132: | protected function getItems() { |
| 133: | $list = $this->DataSource->getItems($this->pagesize * ($this->currentpage - 1), $this->getPageSize(), $this->sortf, $this->sortd); |
| 134: | $this->pagerowscount = count($list); |
| 135: | return is_array($list) ? $list : array(); |
| 136: | } |
| 137: | |
| 138: | /** |
| 139: | * Возвращает массив строк |
| 140: | * return array |
| 141: | */ |
| 142: | public function getDataRows() { |
| 143: | $list = array(); |
| 144: | foreach ($this->components as $child) { |
| 145: | if ($child instanceof DataRow) { |
| 146: | $list[] = $child; |
| 147: | } |
| 148: | } |
| 149: | return $list; |
| 150: | } |
| 151: | |
| 152: | /** |
| 153: | * @see HtmlComponent |
| 154: | */ |
| 155: | public function Render() { |
| 156: | |
| 157: | $this->beforeRender(); |
| 158: | $this->RenderImpl(); |
| 159: | $this->afterRender(); |
| 160: | } |
| 161: | |
| 162: | /** |
| 163: | * Устанавливает имя поля и направление сортировки. |
| 164: | * Установленные параметры передаютя провайдеру данных |
| 165: | */ |
| 166: | final public function setSorting($field, $dir = 'asc') { |
| 167: | $this->sortf = $field; |
| 168: | $this->sortd = $dir; |
| 169: | } |
| 170: | |
| 171: | final public function getSorting() { |
| 172: | return array('field'=>$this->sortf,'dir'=>$this->sortd); |
| 173: | } |
| 174: | |
| 175: | |
| 176: | |
| 177: | |
| 178: | } |
| 179: |