Вы не зашли.
Главная » PHP » Функция навигации по страницам
#111. tipsun Off (19)
Moderator
2012.01.06 11:11
Код:
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private static $instance; private $_count = 0, $_page = null, $_tmpPage = 1, $_items = 10, $_pages = null, $_start = null; public function __construct() { } /** * Singleton * @link http://php.net/manual/en/language.oop5.patterns.php */ public static function singleton() { if (! isset(self::$instance)) { self::$instance = new PageMan; } return self::$instance; } public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } public function __wakeup() { trigger_error('Unserializing is not allowed.', E_USER_ERROR); } /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ public 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; } /** * Расчет общего кол-ва страниц. * @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($range=null) { if (1 == $this->getPages()) return array(1); $range = $this->isNatural($range) ? (int)$range : DEFAULT_RANGE; $prev = $this->getPage() - $range; $next = $this->_page + $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.06 11:11)
#112. tipsun Off (19)
Moderator
2012.01.06 11:11
Может __clone() и __wakeup() переназвачить на:

Код:
span style="color: #0000BB"><?php/** * Singleton * @link http://php.net/manual/en/language.oop5.patterns.php */ public static function singleton() { if (! isset(self::$instance)) { self::$instance = new PageMan; } return self::$instance; } public function __clone() { return singleton(); } public function __wakeup() { return singleton(); }
#113. Gemorroj Off (107)
Administrator
2012.01.06 12:12
нет. обычно их делают приватными просто. так же как и конструктор.
и назови метод не singleton, а getInstance.
вообще, я тут подумал, может это и плохая идея сингелтон для пагинатора. т.к. на странице может быть несколько разных пагинаций, и в случае с сингелтоном реализовать их будет не оч удобно, т.к. мы будем работать с 1 объектом.
#114. tipsun Off (19)
Moderator
2012.01.06 21:09
Ок, конструктор приватным сделаю.
Снесу синглтон.
Код:
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private $_count = 0, $_page = null, $_tmpPage = 1, $_items = 10, $_pages = null, $_start = null; private function __construct() {} /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ public 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; } /** * Расчет общего кол-ва страниц. * @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($range=null) { if (1 == $this->getPages()) return array(1); $range = $this->isNatural($range) ? (int)$range : DEFAULT_RANGE; $prev = $this->getPage() - $range; $next = $this->_page + $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.06 21:09)
#115. Akdmeh Off (9)
Участник
2012.01.06 21:09
Да прекрати ты использовать наконец $_pages = null, $_start = null;, это глупо!
Я же говорил, просто назови их, да дело в шляпе: private $_pages, $_start.
Или я не прав?
Желание стать программистом из-за того, что вам нравляться компьютерные игры-это все равно, что желание стать гинекологом из-за того, что вам нравиться сексwink
#116. tipsun Off (19)
Moderator
2012.01.06 21:09
Код:
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private $_count = 0, $_page = false, $_tmpPage = 1, $_items = 10, $_pages = false, $_start = false; private function __construct() {} /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ public 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; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (false === $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 (false === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (false === $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($range='') { if (1 == $this->getPages()) return array(1); $range = $this->isNatural($range) ? (int)$range : DEFAULT_RANGE; $prev = $this->getPage() - $range; $next = $this->_page + $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.06 22:10)
#117. Gemorroj Off (107)
Administrator
2012.01.07 10:10
Akdmeh, да пофик на самом деле. И так, и так переменная будет со значением null. Если мы явно это указываем, мб, так нагляднее, если не указываем - экономим несколько символов кода)
tipsun, false - это худший вариант.
isNatural сделай приватным или защищенным.
getPageRange($range='') не документирован параметр $range.
$range = $this->isNatural($range) ? (int)$range : DEFAULT_RANGE; не верно. вместо DEFAULT_RANGE нужно self::DEFAULT_RANGE.
сам DEFAULT_RANGE тоже документируй.
думаю, параметр $range лучше в объявлении метода указать так public function getPageRange($range = PageMan::DEFAULT_RANGE).
Да и вообще, константу лучше переназвать как минимум RANGE_DEFAULT. Чтобы если добавятся новые RANGE_* у них был один префикс.
#118. tipsun Off (19)
Moderator
2012.01.07 10:10
Ок. Но я думал, что задав getPageRange($range='')
'' - это уже (string).
(-хотя это не совсем то, наверно false лучше или тот же null-)
При проверке на натуральность первая проверка даст ошибку, второе условие даже не будет проверяться.
Значит и само условие даст ошибку. И обойдемся без (int), которое тоже вроде время забирает. Хотя по умолчанию (RANGE_DEFAULT) у нас и так (int). Сделаю без = null;
ну так: private $var1, $var2;
Отредактировано tipsun (2012.01.07 10:10)
#119. Gemorroj Off (107)
Administrator
2012.01.07 10:10
tipsun написал:
Ок. Но я думал, что задав getPageRange($range='') '' - это уже (string).
да стринг, но человека использующего твой код этот стринг введет в замешательство. Если тебя так беспокоит явное приведение к инту, то можешь его убрать вообще, isNatural уже говорит о том, что использование переменной будет безопасным.
#120. tipsun Off (19)
Moderator
2012.01.07 17:05
Код:
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 getRange() { 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; }}
Страниц: 110 11 12 13 1416 Все
Главная
WEB
PunBB Mod v0.6.2
0.015 s