Вы не зашли.
Тогда getPageRange()
надо сделать управляющим.
В нем вызывать определенные методы со своими расчетами/математикой.
После устранять неточности и строить ранжировку.
- - - -
Или сделать _buildRange();
В котором так же устраняются неточности.
Отредактировано tipsun (2012.01.08 09:09)
так да. типовая ситуация. в самом простом случае, делается 2 публичных метода с отличающимся кодом и 1 приватный с общим для этих 2-х методов.
Gemorroj написал:
так да. типовая ситуация. в самом простом случае, делается 2 публичных метода с отличающимся кодом и 1 приватный с общим для этих 2-х методов.
Как ты говорил, так, в итоге, и вышло все таки
Код:
span style="color: #0000BB"><?php//Часто повторяетсяif (1 == $this->getPages()) return array(1);//Может его только в методе: _buildRange() оставить? |
Код:
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); } /** * Построение ряда. * @param integer $lower * @param integer $upper * @return array */ private function _rangeBuild($lower, $upper) { if (1 == $this->getPages()) return array(1); $array = array(); if (1 >= $lower) { $lower = 1; } else { $array[] = 1; } if ($this->_pages < $upper) { $upper = $this->_pages; } for ($i = $lower; $i <= $upper; $i++) { $array[] = $i; } if ($this->_pages > $upper) { $array[] = $this->_pages; } return $array; } public function getPageRangeSimple() { if (1 == $this->getPages()) return array(1); $lower = $this->getPage() - $this->_range; $upper = $this->_page + $this->_range; return $this->_rangeBuild($lower, $upper); } public function getPageRangeComplex() { if (1 == $this->getPages()) return array(1); $lower = $this->getPage() - $this->_range; $upper = $this->_page + $this->_range; $lower = $this->getPages() < $upper ? $this->_pages - $upper + $lower : $lower; $upper = 1 > $lower ? $upper - $lower + 1 : $upper; if ($this->_pages <= $upper) $lower -= 1; if (1 >= $lower) $upper += 1; return $this->_rangeBuild($lower, $upper); }} |
Отредактировано tipsun (2012.01.08 21:09)
Хмм. Зачем так далеко было идти?
Просто надо было в setCount сделать так:
Код:
span style="color: #0000BB"><?php /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->_isNatural($count)) { $this->_count = (int)$count; } else { $this->pages = $this->page = 1; } return $this; } |
А если так, то можно убрать лишнее:
Код:
span style="color: #0000BB"><?php /** * Расчет общего кол-ва страниц. * @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; } |
Отредактировано tipsun (2012.01.10 14:02)
Все, правку у себя тоже делаю сейчас.
Добавлено спустя 4 минуты 44 секунды: Нет. Ошибаюсь.
А если метод вообще не будет вызван, а? Ну я Петросян.
Расскоментировать надо закомментированное.
Отредактировано tipsun (2012.01.10 15:03)
Еще можно в конструкте сделать так:
Или метод сделать такой.
Код:
span style="color: #0000BB"><?php//privatepublic function __construct($array){ if ($array['count']) $this->setCount($array['count']); if ($array['page']) $this->setPage($array['page']); if ($array['items']) $this->setItems($array['items']); if ($array['range']) $this->setRange($array['range']);} |
А еще так можно.
Код:
span style="color: #0000BB"><?php /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { if (0 == $this->count) { $this->_pages = 1; } else { $this->_pages = (int)ceil($this->_count / $this->_items); } } return $this->_pages; } |
Отредактировано tipsun (2012.01.18 00:12)
Код:
span style="color: #0000BB"><?php /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { //++++ if (0 == $this->_count) { $this->_pages = $this->_page = 1; } else { $this->_pages = (int)ceil($this->_count / $this->_items); } } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { $this->getPages(); if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->_pages); } return $this->_page; } |
Отредактировано tipsun (2012.01.18 11:11)
В правильном направлении хоть?
_rangeBuild() оставить как есть?
Код:
span style="color: #0000BB"><?phpif (1 == $this->getPages()) return array(1); |
Убрать с _rangeBuild()?
объясни плз на что обратить внимание и вообще.. я потерял нить что-то
Данные:
1) указаны*
1.1) корректны
1.2) не корректны
2) не указаны**
- - - -
1.1: все как обычно.
1.2: определить переменные, которые должны будут расчитаны в последующем, чтоб зря не запускать методы/функции.
2: см. пункт (1.1)
- - - -
* - значит использовали методы-указатели (так их обзову).
** - были пропущены или вообще не использовались методы-указатели.
- - - -
Как-то так вот почему-то думаю.
Пост #137.
_start в принципе определить заранее тоже можно.
- - - -
А вообще нормальный пользователь сначала проверит, если записи или нет.
Код:
span style="color: #0000BB"><?php$count =//query SELECT COUNT(1/*) ...If ($count)//run PageMan and query SELECT 'rows' FROM 'table' LIMIT <put from PageMan>;else echo 'Empty'; |
Отредактировано tipsun (2012.01.18 23:11)