Вы не зашли.
Главная » PHP » Функция навигации по страницам
#121. Gemorroj Off (107)
Administrator
2012.01.07 21:09
наверное, метод getRange лучше переименовать, т.к. он не является геттером переменной range (сеттер setRange).
#122. tipsun Off (19)
Moderator
2012.01.07 22:10
Не проблема. Сейчас.
Код:
span style="color: #0000BB"><?phpclass PageMan{ private $_count = 0, $_tmpPage = 1, $_items = 10, $_range = 2, $_page, $_pages, $_start; private function __construct() {} /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ private function _isNatural($var) { return (is_numeric($var) and 0 < $var); } /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->_isNatural($count)) { $this->_count = (int)$count; } return $this; } /** * Регистрация текущей страницы. * @param integer $page * @return pageMan */ public function setPage($page) { if ($this->_isNatural($page)) { $this->_tmpPage = (int)$page; } return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $items * @return pageMan */ public function setItems($items) { if ($this->_isNatural($items)) { $this->_items = (int)$items; } else if($this->_count) { $this->_items = $this->_count; } return $this; } /** * Регистрация масштаба ранжировки. * @param integer $range * @return pageMan */ public function setRange($range) { if ($this->_isNatural($range)) { $this->_range = (int)$range; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { $this->_pages = (int)ceil($this->_count / $this->_items); if (0 == $this->_pages) $this->_pages += 1; } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->getPage() - 1) * $this->_items; } return $this->_start; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArray() { return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count)); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } /** * Получение ближайшего отрезка номеров страниц для создания навигации * вида: (1 p-2 p-1 [p] p+1 p+2 N). * @return array */ public function getPageRange() { if (1 == $this->getPages()) return array(1); $prev = $this->getPage() - $this->_range; $next = $this->_page + $this->_range; $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start -= $this->_pages <= $stop ? 1 : 0; $stop += 1 >= $start ? 1 : 0; $start = 1 < $start ? $start : 1; $stop = $this->_pages > $stop ? $stop : $this->_pages; $array = range($start, $stop); if (1 < $start) array_unshift($array, 1); if ($this->_pages > $stop) $array[] = $this->_pages; return $array; }}
Отредактировано tipsun (2012.01.07 22:10)
#123. tipsun Off (19)
Moderator
2012.01.07 22:10
Happy End? smile
Или еще чего осталось?
Отредактировано tipsun (2012.01.07 22:10)
#124. Gemorroj Off (107)
Administrator
2012.01.07 22:10
ну по архитектуре, вроде норм)
то, что получается на выходе мне оценивать сложно. нужно, наверное, простые экзамплы с примерами реально работающей пагинации.
#125. tipsun Off (19)
Moderator
2012.01.07 22:10
Ура! smile
#126. tipsun Off (19)
Moderator
2012.01.07 23:11
Код:
Fatal error: Call to private PageMan::__construct() from invalid context in L:\home\tt.php\www\PageMan.php on line 187
Надо конструкт публичным сделать.
Отредактировано tipsun (2012.01.08 02:02)
#127. tipsun Off (19)
Moderator
2012.01.08 01:01
Код:
span style="color: #0000BB"><?phppublic function getPageRange(){ if (1 == $this->getPages()) return array(1); $prev = $this->getPage() - $this->_range; $next = $this->_page + $this->_range; //+сделаю отдельный метод может $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start -= $this->_pages <= $stop ? 1 : 0; $stop += 1 >= $start ? 1 : 0; //-сделаю отдельный метод может if(1 >= $start) $start = 1; else $array[] = 1; if($stop > $this->_pages) $stop = $this->_pages; for ($i=$start; $i<=$stop; $i++) { $array[] = $i; } if ($stop < $this->_pages) $array[] = $this->_pages; return $array;}
Отредактировано tipsun (2012.01.08 02:02)
#128. Gemorroj Off (107)
Administrator
2012.01.08 04:04
tipsun написал:
Надо конструкт публичным сделать.
так да. закрывали его для синглтона же)
#129. tipsun Off (19)
Moderator
2012.01.08 08:08
Код:
span style="color: #0000BB"><?php/** * Как бы будет сразу 2 метода в 1. * При вызове getPageRange() будет расчитываться простая ранжировка. * При вызове getPageRange(1)/getPageRange(true) будет расчитываться сложная ранжировка. */public function getPageRange($complex=null){ if (1 == $this->getPages()) return array(1); $prev = $this->getPage() - $this->_range; $next = $this->_page + $this->_range; if ($complex) { $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; if ($this->_pages <= $stop) $start -= 1; if (1 >= $start) $stop += 1; } else { $start = $prev; $stop = $next; } if(1 >= $start) $start = 1; else $array[] = 1; if($stop > $this->_pages) $stop = $this->_pages; for ($i=$start; $i<=$stop; $i++) { $array[] = $i; } if ($stop < $this->_pages) $array[] = $this->_pages; return $array;}
Отредактировано tipsun (2012.01.08 08:08)
#130. Gemorroj Off (107)
Administrator
2012.01.08 09:09
tipsun написал:
Как бы будет сразу 2 метода в 1.
никогда так не делай
Страниц: 111 12 13 14 15 16 Все
Главная
WEB
PunBB Mod v0.6.2
0.015 s