#131 2012.01.08 09:48

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Тогда getPageRange()
надо сделать управляющим.
В нем вызывать определенные методы со своими расчетами/математикой.
После устранять неточности и строить ранжировку.
- - - -
Или сделать _buildRange();
В котором так же устраняются неточности.

Отредактировано tipsun (2012.01.08 09:59)

Неактивен

#132 2012.01.08 11:35

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Функция навигации по страницам

так да. типовая ситуация. в самом простом случае, делается 2 публичных метода с отличающимся кодом и 1 приватный с общим для этих 2-х методов.

Активен

#133 2012.01.08 21:12

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Gemorroj написал:

так да. типовая ситуация. в самом простом случае, делается 2 публичных метода с отличающимся кодом и 1 приватный с общим для этих 2-х методов.

Как ты говорил, так, в итоге, и вышло все таки big_smile

Код:

1
span style="color: #0000BB"><?php//Часто повторяетсяif (1 == $this->getPages()) return array(1);//Может его только в методе: _buildRange() оставить?

Код:

1
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:52)

Неактивен

#134 2012.01.10 14:05

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Хмм. Зачем так далеко было идти?
Просто надо было в setCount сделать так:

Код:

1
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; }

А если так, то можно убрать лишнее:

Код:

1
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:12)

Неактивен

#135 2012.01.10 15:19

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Все, правку у себя тоже делаю сейчас.
Добавлено спустя   4 минуты  44 секунды:
Нет. Ошибаюсь.
А если метод вообще не будет вызван, а? Ну я Петросян.
Расскоментировать надо закомментированное.

Отредактировано tipsun (2012.01.10 15:26)

Неактивен

#136 2012.01.10 16:22

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Еще можно в конструкте сделать так:
Или метод сделать такой.

Код:

1
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']);}

А еще так можно.

Код:

1
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:58)

Неактивен

#137 2012.01.18 00:54

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Код:

1
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:03)

Неактивен

#138 2012.01.18 22:57

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

В правильном направлении хоть? smile
_rangeBuild() оставить как есть?

Код:

1
span style="color: #0000BB"><?phpif (1 == $this->getPages()) return array(1);

Убрать с _rangeBuild()?

Неактивен

#139 2012.01.18 23:00

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6593
Карма: 107
Профиль Веб-сайт

Re: Функция навигации по страницам

объясни плз на что обратить внимание и вообще.. я потерял нить что-то

Активен

#140 2012.01.18 23:34

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: Функция навигации по страницам

Данные:
1) указаны*
1.1) корректны
1.2) не корректны
2) не указаны**
- - - -
1.1: все как обычно.
1.2: определить переменные, которые должны будут расчитаны в последующем, чтоб зря не запускать методы/функции.
2: см. пункт (1.1)
- - - -
* - значит использовали методы-указатели (так их обзову).
** - были пропущены или вообще не использовались методы-указатели.
- - - -
Как-то так вот почему-то думаю.
Пост #137.
_start в принципе определить заранее тоже можно.
- - - -
А вообще нормальный пользователь сначала проверит, если записи или нет.

Код:

1
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:57)

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.017 s