tipsun » 2011.03.23 22:25

Код:

1
span style="color: #0000BB"><?php/* Навигация по страницам by TiPsun * Подходит и для базы (0) и для массива (1) * Еще надо форму для быстрой навигации, как-нибудь займусь*/function pages($all, $onpage, $page, $url=null, $array=0) { $url = htmlspecialchars(trim($url), ENT_QUOTES); $pages = ceil($all / $onpage); $page = min(max(1, (int)$page), $pages); $start = ($page - 1) * $onpage; $bar = '<div class="navbar">'; if($all > $onpage) { $bar .= 'Страницы: '; if($page > 1) { $bar .= '<a href="?'.$url.'page='.($page - 1).'">«</a>'; } else { $bar .= '«'; } $bar .= ' '.$page.'/'.$pages.' '; if($page < $pages) { $bar .= '<a href="?'.$url.'page='.($page + 1).'">»</a>'; } else { $bar .= '»'; } $bar .= '<br/>'; } $bar .= 'Записей: '.$all.'</div>'; return array($start, (($array) ? min(($start + $onpage), $all) : $onpage), $bar); }//Использование$pg = pages($count, 4, $_GET['page'], 'sort='.$_GET['sort'].'&', 1);//$pg[0] - с//$pg[1] - по//$pg[2] - ссылки для навигации?>
tipsun » 2011.03.23 23:47

Код:

1
span style="color: #0000BB"><?php /* Навигация по страницам by TiPsun * Подходит и для базы (0) и для массива (1) * Версия с формой быстрого перехода*/ function pages($all, $onpage, $page, $url=null, $array=0) { $url = htmlspecialchars(trim($url), ENT_QUOTES); $pages = ceil($all / $onpage); $page = min(max(1, (int)$page), $pages); $start = ($page - 1) * $onpage; if($pages > 4) { $bar = '<form action="?'.$url.'" method="post"> <div> <input size="3" type="text" name="page" value="'.$page.'" /> <input type="submit" value="стр." /> </div> </form>'; } $bar .= '<div class="navbar">'; if($all > $onpage) { $bar .= 'Страницы: '; if($page > 1) { $bar .= '<a href="?'.$url.'page='.($page - 1).'">«</a>'; } else { $bar .= '«'; } $bar .= ' '.$page.'/'.$pages.' '; if($page < $pages) { $bar .= '<a href="?'.$url.'page='.($page + 1).'">»</a>'; } else { $bar .= '»'; } $bar .= '<br/>'; } $bar .= 'Записей: '.$all.'</div>'; return array($start, (($array) ? min(($start + $onpage), $all) : $onpage), $bar); } //Использование$page = isset($_POST['page']) ? $_POST['page'] : $_GET['page']; //указывать всегда, чтоб форма работала$pg = pages($count, 4, $page, 'sort='.$_GET['sort'].'&', 1); //$pg[0] - с//$pg[1] - по//$pg[2] - ссылки для навигации ?>
tipsun » 2011.03.27 23:31

ГовноКод?
#2 можно форму по человечески в принципе сделать (сделал), эт я под разметку делал себе.

Gemorroj » 2011.03.28 00:17

ну да... не очень) намешано все в кучу. нет разделения логики и представления.

tipsun » 2011.08.21 17:11

Вот попытался под разделение логики сделать.

Еще вот че интересно:
Разумно ли сделать, чтоб функция использовала define(); ?
Мне кажется это будет для пользователя (или посто меня :) ) удобней.

Код:

1
span style="color: #0000BB"><?php/*/ ** Функция навигации по страницам * Автор: TiPsun * E-mail: tipsun@bk.ru * ICQ: 34142776 ** Использование * @pager(COUNT, ON_PAGE, $_REQUEST['page'], 1);/*/function pager($all=0, $onpage=7, $page=1, $array=0, $pre=0) { $all = (int)$all; $onpage = 0 < (int)$onpage ? (int)$onpage : 1; $bar = array(); $bar['pages'] = ceil($all / $onpage); //0 $bar['page'] = $page = min(max(1, (int)$page), $bar['pages']); $bar['start'] = ($page - 1) * $onpage; $bar['stop'] = ($array) ? min(($bar['start'] + $onpage), $all) : $onpage; if ($all > $onpage) { if ($page > 1) { $bar['down'] = $page-1; } else { $bar['down'] = $page; } if ($page < $bar['pages']) { $bar['up'] = $page+1; } else { $bar['up'] = $page; } } else { $bar['down'] = $bar['up'] = 1; } if(isset($pre)) { define($pre.'ALL', $bar['pages']); define($pre.'NOW', $bar['page']); define($pre.'ST', $bar['start']); define($pre.'SP', $bar['stop']); define($pre.'DWN', $bar['down']); define($pre.'UP', $bar['up']); return; } else { return $bar; } }?>
tipsun » 2011.08.21 20:28

>_> Что, опять говнокод?

Gemorroj » 2011.08.21 20:40

https://github.com/zendframework/zf2/tr … /Paginator

tipsun » 2011.08.21 21:03

:D Ухаха: testMarkingOneSessionObjectImmutableShouldMarkOtherInstancesImmutable
- - - -
Там все есть что-ли?
А че тогда делать в PHP вообще?
- - - -
И еще главное все так аккуратно написано и с cache :(

tipsun » 2011.10.28 21:52

Не оставляю надежды написать толковый навигатор по страницам. :)

Код:

1
span style="color: #0000BB"><?phpclass pager { /** * $items - кол-во элементов в массиве/таблице выводимых на страницу. * $methods - методы вычисления начальной и конечной точек при переборе элементов в массиве/таблице. Может принимать 2 значения: array или table. * $count - принимаемое классом, заранее подсчитанное вашим кодом, кол-во элементов в массиве/таблице. * $page - номер текущей страницы. * $pages - кол-во всех страниц, получаемое в результате деления $count на $items. * $start - точка начала перебора элементов. * $stop - точка конца перебора элементов. **/ private $count, $page, $pages, $start, $stop, $items = 10, $methods = array( 'array'=>0, 'table'=>0); //фукнция расчитывает общее кол-во страниц. public function __construct($count='', $page='', $items='') { if (is_numeric($count) and 0 < $count) { $this->count = $count; } else { trigger_error('Count of items is not numeric', E_USER_ERROR); } if (is_numeric($items) and 0 < $items and $this->count >= $items) { $this->items = $items; } $this->pages = ceil($this->count / $this->items); $this->page = min(max(1, (int)$page), $this->pages); } //функция вычисляющая точки начала и конца согласно указанному методу в функцию method() private function calc($method) { $this->start = ($this->page -1) * $this->items; $this->stop = 0; if('array' == $method) $this->stop = min(($this->start +$this->items), $this->count); if('table' == $method) $this->stop = $this->items; } //функция принимает указанный метод вычисления... public function method($method='undefined') { if (array_key_exists($method, $this->methods)) { self::calc($method); } else { trigger_error('Nonexistent method', E_USER_ERROR); } } //функция возвращает номер текущей страницы. public function page() { return $this->page; } //функция возвращает кол-во всех страниц. public function pages() { return $this->pages; } //функция возвращает начальную точку перебора элементов. public function start() { if ($this->start) return $this->start; else trigger_error('Missed to indicate calculation method', E_USER_ERROR); } //функция возвращает конечную точку перебора элементов. public function stop() { if ($this->stop) return $this->stop; else trigger_error('Missed to indicate calculation method', E_USER_ERROR); } //функция возвращает номер предыдущей страницы. public function down() { return 1 < $this->page ? $this->page -1 : $this->page; } //функция возвращает номер следующей страницы. public function up() { return $this->pages > $this->page ? $this->page +1 : $this->page; } }//Использование$count = 87;$page = 5;$items = 7;$pg = new pager($count, $page, $items);$pg->method('array'); //array or tableecho $pg->start() . '->' . $pg->stop();?>
Gemorroj » 2011.10.28 22:43

а документация где?

tipsun » 2011.10.28 22:47

Дык сыро еще же, не?
Или надо описать код/переменные/мое_восприятие_кода?
- - - -
Понял, описать код надо...
- - - -
Описал, поймите меня правильно :)

Gemorroj » 2011.10.28 23:24

есть стандартизованный стиль описания кода. называется phpDoc... )

tipsun » 2011.10.28 23:27

Ок, буду знать.
Хотя я и так еле описал код. Сам код понимаю, а вот описать сложно.

tipsun » 2011.10.30 21:59

Есть замечания по классу моему?
- - - -
Я еще думаю может через static тоже принимать/отдавать значения.

Код:

1
span style="color: #0000BB"><?phppager::setItems(10);pager::setMethod('array');//или так путаница будет? типа лишнее??>
Gemorroj » 2011.10.30 23:22

tipsun, сделай документацию в phpDoc стиле. Ориентироваться по ней проще будет для анализа.

tipsun » 2011.11.06 19:30

Код:

1
span style="color: #0000BB"><?php/** * pager * * @access public */class pager { private $count, $page, $pages, $start, $stop, $items = 10, $methods = array('array'=>0, 'table'=>0); /** * pager::__construct() * * @param string $count * @param string $page * @param string $items * @return null */ public function __construct($count='', $page='', $items='') { if (is_numeric($count) and 0 < $count) { $this->count = $count; } else { trigger_error('Count number of the items is not numeric', E_USER_ERROR); } if (is_numeric($items) and 0 < $items and $this->count >= $items) { $this->items = $items; } $this->pages = ceil($this->count / $this->items); $this->page = min(max(1, (int)$page), $this->pages); } /** * pager::calc() * * @param mixed $method * @return null */ private function calc($method) { $this->start = ($this->page -1) * $this->items; $this->stop = 0; if('array' == $method) $this->stop = min(($this->start +$this->items), $this->count); if('table' == $method) $this->stop = $this->items; } /** * pager::method() * * @uses function pager::calc() * * @param string $method * @return null */ public function method($method='undefined') { if (array_key_exists($method, $this->methods)) { self::calc($method); } else { trigger_error('Nonexistent method', E_USER_ERROR); } } /** * pager::page() * * @return integer param pager::page */ public function page() { return $this->page; } /** * pager::pages() * * @return integer param pager::pages */ public function pages() { return $this->pages; } /** * pager::start() * * @return integer param pager::start */ public function start() { if ($this->start) return $this->start; else trigger_error('Missing indication of method of calculation', E_USER_ERROR); } /** * pager::stop() * * @return integer param pager::stop */ public function stop() { if ($this->stop) return $this->stop; else trigger_error('Missing indication of method of calculation', E_USER_ERROR); } /** * pager::down() * * returns the number of the previous page * * @return integer */ public function down() { return 1 < $this->page ? $this->page -1 : $this->page; } /** * pager::up() * * returns the number of the next page * * @return integer */ public function up() { return $this->pages > $this->page ? $this->page +1 : $this->page; } }?>
tipsun » 2011.11.09 21:15

Такое ощущение появилось, что я давно уже изобретаю велосипед (Zend Paginator). :D
А честно говоря зато я весь этот код теперь понимаю, хоть какой-то толк есть...

Код:

1
span style="color: #0000BB"><?phpclass pageMan { private $count = null, $page = null, $tmp_page = 1, $pages = null, $start = null, $stop = null; private static $items = 10, $methods = array('array'=>0, 'table'=>0); public function __construct($method, $count, $page, $items=null) { if (array_key_exists($method, self::$methods)) { $this->$method = $method; } else { trigger_error('Nonexistent method', E_USER_ERROR); } if (is_int($count) and 0 < $count) { $this->count = $count; } else { trigger_error('Value must be integer', E_USER_ERROR); } if (is_int($page) and 0 < $page) { $this->tmp_page = $page; } if (is_int($items)) { if (0 < $items) $this->items = $items; else $this->items = $this->count; } else { $this->items = self::$items; } } private function countPages() { if (null === $this->pages) { $this->pages = $this->count / $this->items; } return $this->pages; } public function getPages() { return self::countPages(); } private function setPage() { if (null === $this->page) { $this->page = min($this->tmp_page, self::countPages()); } return $this->page; } public function getPage() { return self::setPage(); } private function setStart() { if (null === $this->start) { $this->start = (self::setPage() - 1) * $this->items; } return $this->start; } public function getStart() { return self::setStart(); } private function setStop() { if('array' == $this->method) $this->stop = min((self::setStart() + $this->items), $this->count); if('table' == $this->method) $this->stop = $this->items; return $this->stop; } public function getStop() { return self::setStop(); } public function prevPage() { if (null === $this->page) { self::setPage(); } return 1 < $this->page ? $this->page - 1 : $this->page; } public function nextPage() { if (null === $this->pages) { self::countPages(); } if (null === $this->page) { self::setPage(); } return $this->pages > $this->page ? $this->page + 1 : $this->page; } }/**/?>
Gemorroj » 2011.11.09 22:17

ну так да.. это главная цель велосипедов)

tipsun » 2011.11.10 20:58

Сделал через:

Код:

1
span style="color: #0000BB"><?php//__constructif (method_exists(__CLASS__, 'method_' . $method)) $this->method = $method;private function method_array() { /* CODE */ }private function method_table() { /* CODE */ }public function getStop() {return call_user_method($this->method, $this);}?>
tipsun » 2011.11.11 15:31

Какой способ лучше?

Gemorroj » 2011.11.12 16:20

мне кажется 2, просто из-за того, что при расширении класса, не нужно будет следить за массивом доступных методов

tipsun » 2011.11.12 22:27

СПС. :) Ну для этого и переписал. :)

tipsun » 2011.11.23 21:57

Ошибка. По невнимательности. :(

Код:

1
span style="color: #0000BB"><?phpprivate function countPages() { if (null === $this->pages) { //$this->pages = $this->count / $this->items; $this->pages = ceil($this->count / $this->items); } return $this->pages; }?>

Добавлено спустя   5 минут  26 секунд:
Хочу/пытаюсь реализовать: 1 .. 5 6 [7] 8 6 .. 100 такую фишку.

tipsun » 2011.11.23 22:45

И надо было указывать в условии is_numeric(), чтоб с типами не возиться. А при занесении в свойство = (int).

tipsun » 2011.12.11 13:06

Код:

1
span style="color: #0000BB"><?php/** * pageMan * * @package * @author TiPsun * @copyright TiPsun * @version 2011 * @access public */class pageMan { private $count = null, $page = null, $_page = 1, $pages = null, $start = null; private static $items = 10; /** * pageMan::__construct() * * @param mixed $method - метод расчета. * @param mixed $count - количество записей. * @param mixed $page - указанная/текущая страница. * @param mixed $items - кол-во записей на страницу. * * @return void */ public function __construct($method, $count, $page, $items=null) { if (method_exists(__CLASS__, 'method_' . $method)) { $this->method = 'method_' . $method; } else { trigger_error('Nonexistent method', E_USER_ERROR); } if (is_numeric($count) and 0 < $count) { $this->count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } if (is_numeric($page) and 0 < $page) { $this->_page = (int)$page; } if (is_numeric($items)) { if (0 < $items) $this->items = (int)$items; else $this->items = $this->count; } else { $this->items = self::$items; } } /** * pageMan::countPages() * * Расчет общего кол-ва страниц. * * @return integer */ private function countPages() { if (null === $this->pages) { $this->pages = ceil($this->count / $this->items); } return $this->pages; } /** * pageMan::getPages() * * Получение общего числа страниц. * * @return integer */ public function getPages() { return self::countPages(); } /** * pageMan::setPage() * * Корректировка указанной/текущей страницы. * * @return integer */ private function setPage() { if (null === $this->page) { $this->page = min($this->_page, self::countPages()); } return $this->page; } /** * pageMan::getPage() * * Получение корректной текущей страницы. * * @return integer */ public function getPage() { return self::setPage(); } /** * pageMan::setStart() * * Расчет начальной точки отсчета показа записей в вашем цикле. * * @return integer */ private function setStart() { if (null === $this->start) { $this->start = (self::setPage() - 1) * $this->items; } return $this->start; } /** * pageMan::getStart() * * Получение начальной точки отсчета показа записей в цикле. * * @return integer */ public function getStart() { return self::setStart(); } /** * pageMan::method_array() * * Расчет конечной точки отсчета показа записей в цикле для массива данных. * * @return integer */ private function method_array() { return min((self::setStart() + $this->items), $this->count); } /** * pageMan::method_table() * * Расчет конечной точки отсчета показа записей в цикле для данных в таблице (DB). * * @return integer */ private function method_table() { return $this->items; } /** * pageMan::getStop() * * Получение конечной точки отсчета показа записей в цикле. * * @return integer */ public function getStop() { return call_user_method($this->method, $this); } /** * pageMan::prevPage() * * Получение номера предыдущей страницы. * * @return integer */ public function prevPage() { if (null === $this->page) { self::setPage(); } return 1 < $this->page ? $this->page - 1 : $this->page; } /** * pageMan::nextPage() * * Получение номера следующей страницы. * * @return integer */ public function nextPage() { if (null === $this->pages) { self::countPages(); } if (null === $this->page) { self::setPage(); } return $this->pages > $this->page ? $this->page + 1 : $this->page; } }?>

tipsun написал:

Хочу/пытаюсь реализовать: 1 .. 5 6 [7] 8 6 .. 100 такую фишку.

Такой вид:
1 .. 5 [6] 7 .. 15
Можно сделать вручную, условиями.

А такой:
1 .. 3 4 5 [6] 7 8 9 .. 15
Наверно лучше циклом или вложенной функцией.

Gemorroj » 2011.12.11 13:14

без phpDoc не нужно.

tipsun » 2011.12.11 13:50

Еще надо это все: 1 .. 3 4 5 [6] 7 8 9 .. 15; в массиве возвращать, чтоб потом, например в шаблоне, все это удобно можно было вытащить и сделать ссылки.

Gemorroj » 2011.12.11 14:00

у тебя не описано какие методы статические, а какие нет. будет кидать strict ошибки.

tipsun » 2011.12.11 14:07

Или сделать функцию такую, чтоб пользователь в шаблоне через цикл сразу задавал свои страницы, а функция их обрабатывала.
Как-то так наверно.

Код:

1
span style="color: #0000BB"><?php/*pageCheck()@param mixed var@return integer*/function pageCheck($var) { if ($var == 'begin') { return 1; } if ($var == 'end') { return /* последняя страница */; } if ($begin < (int)$var and $end > (int)$var) { return $var; } }?>

Добавлено спустя   1 минуту  39 секунд:

Gemorroj написал:

у тебя не описано какие методы статические, а какие нет. будет кидать strict ошибки.

Это мне просто описать надо (phpDoc) или чего в коде не так?

Gemorroj » 2011.12.11 14:31

private function countPages() {
private static function countPages() {
и еще, если метод или свойство приватное или защищенное, название должно начинаться с подчеркивания.

tipsun » 2011.12.11 14:33

Ок. Понял. СПС.
Хотя не совсем понял, в гугле посмотрю...

tipsun » 2011.12.11 15:35

Вот насчет этого вроде понял, типа:

Код:

1
span style="color: #0000BB"><?phpself::countPages();//если будешь так использовать, значит надо эту функцию пометить как static?>
tipsun » 2011.12.11 16:27

Private, protected переменную называть: $_name;
:D А я думал в phpdoc комментарии просто @param mixed _$var;
- - - -
Так теперь надо это все дело сделать...

Gemorroj » 2011.12.11 16:33

да, phpDoc - это просто комментарии. А Private, protected - это базовый ООП.

tipsun » 2011.12.11 16:45

Код:

1
span style="color: #0000BB"><?php/** * pageMan * * @package * @author TiPsun * @copyright TiPsun * @version 2011 * @access public */class pageMan { private $_method = null, $_count = null, $_page = null, $_tmpPage = 1, $_pages = null, $_start = null; private static $_items = 10; /** * pageMan::__construct() * * @param mixed $method * @param mixed $count * @param mixed $page * @param mixed $items * * @return void */ public function __construct($method, $count, $page, $items=null) { if (method_exists(__CLASS__, '_method' . $method)) { $this->_method = '_method' . $method; } else { trigger_error('Nonexistent method', E_USER_ERROR); } if (is_numeric($count) and 0 < $count) { $this->_count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } if (is_numeric($page) and 0 < $page) { $this->_tmpPage = (int)$page; } if (is_numeric($items)) { if (0 < $items) $this->_items = (int)$items; else $this->_items = $this->_count; } else { $this->_items = self::$_items; } } /** * pageMan::_countPages() * Расчет общего кол-ва страниц. * @return integer */ private static function _countPages() { if (null === $this->_pages) { $this->_pages = ceil($this->_count / $this->_items); } return $this->_pages; } /** * pageMan::getPages() * Получение общего числа страниц. * @return integer */ public function getPages() { return self::_countPages(); } /** * pageMan::_setPage() * Коррекция указанной/текущей страницы. * @return integer */ private static function _setPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, self::_countPages()); } return $this->_page; } /** * pageMan::getPage() * Получение корректной текущей страницы. * @return integer */ public function getPage() { return self::_setPage(); } /** * pageMan::_setStart() * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private static function _setStart() { if (null === $this->_start) { $this->_start = (self::_setPage() - 1) * $this->_items; } return $this->_start; } /** * pageMan::getStart() * Получение начальной точки отсчета показа записей в цикле. * @return integer */ public function getStart() { return self::_setStart(); } /** * pageMan::_methodArray() * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return integer */ private function _methodArray() { return min((self::_setStart() + $this->_items), $this->_count); } /** * pageMan::_methodTable() * Расчет конечной точки отсчета показа записей в цикле для данных в таблице (DB). * @return integer */ private function _methodTable() { return $this->_items; } /** * pageMan::getStop() * Получение конечной точки отсчета показа записей в цикле. * @return integer */ public function getStop() { return call_user_method($this->_method, $this); } /** * pageMan::prevPage() * Получение номера предыдущей страницы. * @return integer */ public function prevPage() { if (null === $this->_page) { self::_setPage(); } return 1 < $this->_page ? $this->_page - 1 : $this->_page; } /** * pageMan::nextPage() * Получение номера следующей страницы. * @return integer */ public function nextPage() { if (null === $this->_pages) { self::_countPages(); } if (null === $this->_page) { self::_setPage(); } return $this->_pages > $this->_page ? $this->_page + 1 : $this->_page; } }?>
tipsun » 2011.12.11 18:15

Gemorroj написал:

А Private, protected - это базовый ООП.

В курсе =) Иначе я бы не применял все это.

Насколько я знаю...
protected/private - это если указать, то действует только в самом классе.

Код:

1
span style="color: #0000BB"><?php//т.е. его нельзя так вызвать:$myClass = new someClass();$myClass->myVar; //- со свойством$myClass->myMethod(); //- с методом//static типа вызывать вот так:self::myVar; //- внутри класса иmyClass::myVar; //- вне класса, если не private/protected и если $this не было использовано.self::myMethod(); //иmyClass::myMethod(); //если не private/protected и если $this не было использовано.?>
tipsun » 2011.12.11 20:51

Бле... Чет я не то сделал.
Там же при static нельзя $this использовать...

Gemorroj, А где надо было static ставить?
До этого разве все правильно не было?

Gemorroj » 2011.12.11 21:04

либо вызывай метод как динамический, либо делай его статическим.

tipsun » 2011.12.11 21:06

Gemorroj, ты про такой вызов?

Код:

1
span style="color: #0000BB"><?phppublic function getPages() { return self::_countPages(); }?>

И его надо переделать под это?

Код:

1
span style="color: #0000BB"><?phppublic function getPages() { return call_user_method('_countPages', $this); }?>

А под статический придется и переменные все переделать под self::

Gemorroj » 2011.12.11 21:53

Да блять.
смотри свой код из 25 поста.

Код:

1
2
3
4
public function getPages() {
return self::countPages();
}

отсюда следует, что метод countPages у тебя должен быть статическим.
если ты не хочешь делать его статическим, то вызывай его не как статический, а динамический. Т.е. $this->countPages();

tipsun » 2011.12.11 21:55

Так бы сразу. Спс.
Добавлено спустя   6 минут  26 секунд:
Я уже и забыл, что так метод вызвать можно :D
Мда, жестко я туплю...

tipsun » 2011.12.12 16:10

Код:

1
span style="color: #0000BB"><?phpclass pageMan { private $_method = null, $_count = null, $_page = null, $_tmpPage = 1, $_pages = null, $_start = null; private static $_items = 10; /** * pageMan::__construct() * Обработка входящих данных в класс. * @param mixed $method * @param mixed $count * @param mixed $page * @param mixed $items * * @return void */ public function __construct($method, $count, $page, $items=null) { if (method_exists(__CLASS__, '_method' . $method)) { $this->_method = '_method' . $method; } else { trigger_error('Nonexistent method', E_USER_ERROR); } if (is_numeric($count) and 0 < $count) { $this->_count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } if (is_numeric($page) and 0 < $page) { $this->_tmpPage = (int)$page; } if (is_numeric($items)) { if (0 < $items) $this->_items = (int)$items; else $this->_items = $this->_count; } else { $this->_items = self::$_items; } } /** * pageMan::_countPages() * Расчет общего кол-ва страниц. * @return integer */ private function _countPages() { if (null === $this->_pages) { $this->_pages = ceil($this->_count / $this->_items); } return $this->_pages; } /** * pageMan::getPages() * Получение общего числа страниц. * @return integer */ public function getPages() { return call_user_method('_countPages', $this); } /** * pageMan::_setPage() * Коррекция указанной/текущей страницы. * @return integer */ private function _setPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->_countPages()); } return $this->_page; } /** * pageMan::getPage() * Получение корректной текущей страницы. * @return integer */ public function getPage() { return $this->_setPage(); } /** * pageMan::_setStart() * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->_setPage() - 1) * $this->_items; } return $this->_start; } /** * pageMan::getStart() * Получение начальной точки отсчета показа записей в цикле. * @return integer */ public function getStart() { return $this->_setStart(); } /** * pageMan::_methodArray() * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return integer */ private function _methodArray() { return min(($this->_setStart() + $this->_items), $this->_count); } /** * pageMan::_methodTable() * Расчет конечной точки отсчета показа записей в цикле для данных в таблице (DB). * @return integer */ private function _methodTable() { return $this->_items; } /** * pageMan::getStop() * Получение конечной точки отсчета показа записей в цикле. * @return integer */ public function getStop() { return call_user_method($this->_method, $this); } /** * pageMan::prevPage() * Получение номера предыдущей страницы. * @return integer */ public function prevPage() { if (null === $this->_page) { $this->_setPage(); } return 1 < $this->_page ? $this->_page - 1 : $this->_page; } /** * pageMan::nextPage() * Получение номера следующей страницы. * @return integer */ public function nextPage() { if (null === $this->_pages) { $this->_countPages(); } if (null === $this->_page) { $this->_setPage(); } return $this->_pages > $this->_page ? $this->_page + 1 : $this->_page; } }?>

Вот... первые шаги к ::10 11 [12] 13 14::

Код:

1
span style="color: #0000BB"><?php$pageNum = 5;$pg = new pageMan('array', 1768, $pageNum);define('NOWPAGE', $pg->getPage());define('ALLPAGES', $pg->getPages());for ($i=-4; $i<=4; $i++) { $page = NOWPAGE + $i; if (NOWPAGE == $page) { printf('[%d] ', $page); continue; } if (1 <= $page and ALLPAGES >= $page) { printf('%d ', $page); } }?>

Наверно все-таки придется делать в классе отдельный метод и возвращать массив.
А то в шаблоне столько катать каждый раз не то.
А в шаблоне уже сделать еще foreach() цикл и закреплять там ссылки.

Хотя по идее можно было бы принять этот адрес,
обработать htmlspecialchars() и нормально, наверно.

tipsun » 2011.12.12 18:07

Еще чтоб в холостую циклы не гонять, можно заранее наверно расчитать количество повторений.

Gemorroj » 2011.12.12 19:46

Сам интерфейс класса не нравится.

* @param mixed $method
         * @param mixed $count
         * @param mixed $page
         * @param mixed $items

new pageMan('array', 1768, $pageNum);

откуда я узнаю что 1 параметром нужно передать строку array ? O_o
и так же про остальные параметры.

Продумай сначала как внешне твой класс будет работать.
Например, удобно было бы как-то так:

Код:

1
span style="color: #0000BB"><?php$obj = new pageMan();// задаем настройки$obj->setPage(1);$obj->setItems(10);// или так$obj->setPage(1)->setItems(10);// выводprint_r($obj->getArray());echo $obj->getTable();// или вообще вот такecho $obj->setPage(1)->setItems(10)->getTable();// а с php 5.4echo (new pageMan())->setPage(1)->setItems(10)->getTable();
tipsun » 2011.12.12 20:07

Ойбле =)
А мануал для чего? =)
- - - -
Ладно, переделаю.
Так еще надо будет следить ввел ли вообще пользователь параметр или нет. :(
- - - -

Код:

1
span style="color: #0000BB"><?phpecho $obj->setPage(1)->setItems(10)->getTable();//это вроде не проблема.//надо в методе:return $this;?>
tipsun » 2011.12.12 21:14

Осталось теперь отслеживать ввод данных.

Код:

1
span style="color: #0000BB"><?php//BEGIN 'New code' public function setMethod($method) { if (method_exists(__CLASS__, '_method' . $method)) { $this->_method = '_method' . $method; } else { trigger_error('Nonexistent method', E_USER_ERROR); } return $this; } public function setCount($count) { if (is_numeric($count) and 0 < $count) { $this->_count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } return $this; } public function setPage($page) { if (is_numeric($page) and 0 < $page) { $this->_tmpPage = (int)$page; } return $this; } public function setItems($items) { if (is_numeric($items)) { if (0 < $items) $this->_items = (int)$items; else $this->_items = $this->_count; } else { $this->_items = self::$_items; } return $this; } //END 'New code'?>
Gemor » 2011.12.12 21:27

вынеси свои параметры для setMethod в константы класса хотябы. а вообще я не вижу в setMethod вообще необходимости.
и проверять не надо, используй дефолтовые значения.

tipsun » 2011.12.12 21:38

А, типа как ты показал getArray()/getTable().
Но там тогда надо будет массивом возвращать.
- - - -
Т.к. у меня там getStart точка отсчета.
Знач если getStop не будет, то просто все в одном вернуть и все.

Gemorroj » 2011.12.12 22:10

вот в зависимости от get* возвращай как просят.

tipsun » 2011.12.12 22:11

И так и так короче...

tipsun » 2011.12.12 23:16

Набросок.
Бле там за данными не уследишь.

Код:

1
span style="color: #0000BB"><?phpclass pageMan { private $_count = null, $_page = null, $_tmpPage = 1, $_pages = null, $_start = null; private static $_items = 10; public function setCount($count) { if (is_numeric($count) and 0 < $count) { $this->_count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } return $this; } public function setPage($page) { if (is_numeric($page) and 0 < $page) { $this->_tmpPage = (int)$page; } return $this; } public function setItems($items) { if (is_numeric($items)) { if (0 < $items) $this->_items = (int)$items; //else $this->_items = $this->_count; } else { $this->_items = self::$_items; } return $this; } /** * pageMan::getPages() * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } if (null === $this->_pages) { $this->_pages = ceil($this->_count / $this->_items); } return $this->_pages; } /** * pageMan::_corrPage() * Коррекция указанной/текущей страницы. * @return integer */ private function _corrPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * pageMan::getPage() * Получение корректной текущей страницы. * @return integer */ public function getPage() { return $this->_corrPage(); } /** * pageMan::_setStart() * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->_corrPage() - 1) * $this->_items; } return $this->_start; } /** * pageMan::_methodArray() * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return integer */ public function getArray() { if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } return array('start'=>$this->_setStart(), 'stop'=>min(($this->_setStart() + $this->_items), $this->_count)); } /** * pageMan::_methodTable() * Расчет конечной точки отсчета показа записей в цикле для данных в таблице (DB). * @return integer */ public function getTable() { return array('start'=>$this->_setStart(), 'stop'=>$this->_items); } }?>
tipsun » 2011.12.12 23:31

Хотя в принципе там только за count следить надо :)

Gemorroj » 2011.12.13 00:29

почему у тебя _items объявлена статическим свойством, а работаешь ты с ним как с динамическим?

tipsun » 2011.12.13 12:21

Оу! Да действительно.
Надо константу объявить.

Код:

1
span style="color: #0000BB"><?php const ITEMS = 10; private $_count = null, $_page = null, $_tmpPage = 1, $_items = null, $_pages = null, $_start = null; public function setItems($items) { if (is_numeric($items)) { if (0 < $items) $this->_items = (int)$items; //else $this->_items = $this->_count; } else { $this->_items = self::ITEMS; } return $this; }?>
Gemorroj » 2011.12.13 12:26

а переопределять ты ее тогда как собираешься?

tipsun » 2011.12.13 12:28

Код:

1
span style="color: #0000BB"><?phpconst ITEMS = 10; //это как дефолтное значение, можно тупо без нее 10 написать и все, если пользователь не указал ниче.private $_items = null; //там есть =)?>

Добавлено спустя   3 минуты  2 секунды:
Еще если условию 0 < не удовлетворяет, то надо опять присвоить из константы

Gemorroj » 2011.12.13 12:35

почему бы просто не работать с динамическим свойством?

tipsun » 2011.12.13 15:09

Код:

1
span style="color: #0000BB"><?phpclass pageMan { private $_count = null, $_page = null, $_tmpPage = 1, $_items = 10, $_pages = null, $_start = null; /** * pageMan::setCount() * Регистрация общего количества записей. * @param mixed $count * @return object */ public function setCount($count) { if (is_numeric($count) and 0 < $count) { $this->_count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } return $this; } /** * pageMan::setPage() * Регистрация текущей страницы. * @param mixed $page * @return object */ public function setPage($page) { if (is_numeric($page) and 0 < $page) { $this->_tmpPage = (int)$page; } return $this; } /** * pageMan::setItems() * Регистрация количества записей на страницу. * @param mixed $items * @return object */ public function setItems($items) { if (is_numeric($items)) { if (0 < $items) { $this->_items = (int)$items; } else if ($this->_count) { $this->_items = $this->_count; } } return $this; } /** * pageMan::getPages() * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } if (null === $this->_pages) { $this->_pages = ceil($this->_count / $this->_items); } return $this->_pages; } /** * pageMan::_corrPage() * Коррекция текущей страницы. * @return integer */ private function _corrPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * pageMan::getPage() * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { return $this->_corrPage(); } /** * pageMan::_setStart() * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->_corrPage() - 1) * $this->_items; } return $this->_start; } /** * pageMan::getArray() * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return integer */ public function getArray() { if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } return array( 'start' => $this->_setStart(), 'stop' => min(($this->_setStart() + $this->_items), $this->_count)); } /** * pageMan::getTable() * Расчет конечной точки отсчета показа записей в цикле для данных в таблице (DB). * @return integer */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } }?>
tipsun » 2011.12.13 22:53

* pageMan::getPages()
* Расчет общего кол-ва страниц.
* @return float, а не int...

tipsun » 2011.12.13 23:05

Вот еще заметил. Зачем 2 раза к методу обращаться, если свойство с 1 запуска метода будет определено. :)

Код:

1
span style="color: #0000BB"><?php/*return array('start' => $this->_setStart(),'stop' => min(($this->_setStart() + $this->_items), $this->_count));*/return array('start' => $this->_setStart(),'stop' => min(($this->_start + $this->_items), $this->_count));?>
tipsun » 2011.12.13 23:29

Набросок.

Код:

1
span style="color: #0000BB"><?php /** * pageMan::getPageRange() * Получение ближайшего отрезка номеров страниц для создания навигации вида: (10 11 [12] 13 14). * @return array */ public function getPageRange() { $this->getPages(); $this->getPage(); $min = $this->_page - 4; //or user number. $min = 1 < $min ? $min : 1; $max = $this->_page + 4; //or user number. $max = $this->_pages > $max ? $max : $this->_pages; /* for ($page=$min; $page<=$max; $page++) { if ($this->_page == $page) { $range[] = '[' . $page . ']'; continue; } if (1 <= $page and $this->_pages >= $page) { $range[] = $page; } } */ return range($min, $max); }?>
Gemorroj » 2011.12.13 23:36

что это такое? где phpDoc?

tipsun » 2011.12.14 15:27

Добавил phpDoc.

tipsun » 2011.12.14 18:37

Поправил код.
В принципе можно и в шаблоне отметить текущую страницу.

tipsun » 2011.12.15 19:31

Код:

1
span style="color: #0000BB"><?php class pageMan { private $_count = null, $_page = null, $_tmpPage = 1, $_items = 10, $_pages = null, $_start = null; /** * pageMan::setCount() * Регистрация общего количества записей. * @param mixed $count * @return object */ public function setCount($count) { if (is_numeric($count) and 0 < $count) { $this->_count = (int)$count; } else { trigger_error('Value must be integer', E_USER_ERROR); } return $this; } /** * pageMan::setPage() * Регистрация текущей страницы. * @param mixed $page * @return object */ public function setPage($page) { if (is_numeric($page) and 0 < $page) { $this->_tmpPage = (int)$page; } return $this; } /** * pageMan::setItems() * Регистрация количества записей на страницу. * @param mixed $items * @return object */ public function setItems($items) { if (is_numeric($items)) { if (0 < $items) { $this->_items = (int)$items; } else if ($this->_count) { $this->_items = $this->_count; } } return $this; } /** * pageMan::getPages() * Расчет общего кол-ва страниц. * @return float */ public function getPages() { if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } if (null === $this->_pages) { $this->_pages = ceil($this->_count / $this->_items); } return $this->_pages; } /** * pageMan::_corrPage() * Коррекция текущей страницы. * @return integer */ private function _corrPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * pageMan::getPage() * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { return $this->_corrPage(); } /** * pageMan::_setStart() * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->_corrPage() - 1) * $this->_items; } return $this->_start; } /** * pageMan::getArray() * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArray() { if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count)); } /** * pageMan::getTable() * Расчет конечной точки отсчета показа записей в цикле для данных в таблице (DB). * @return array */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } /** * pageMan::getPageRange() * Получение ближайшего отрезка номеров страниц для создания навигации вида: (10 11 [12] 13 14). * @return array */ public function getPageRange($range=null) { $range = (is_numeric($range) and 0 < $range) ? (int)$range : 4; $min = $this->getPage() - $range; $max = $this->_page + $range; $min = 1 < $min ? $min : 1; $max = $this->getPages() > $max ? $max : $this->_pages; return range($min, $max); } }?>
tipsun » 2011.12.15 19:54

А может быть даже просто "схитрить" :)
Чем делать в цикле лишнее условие, лучше в стиле a:active просто по-другому пометить и все :)
Вот мне и активная/текущая страница.

Gemorroj » 2011.12.15 21:07

не понял. покажи)

tipsun » 2011.12.15 21:19

Ну вроде цвет активной ссылки должен меняться ведь? Если я не ошибся, то должно сработать.

CSS

Код:

1
2
a { color: #000; }
a:active { color: #888; }

PHP

Код:

1
span style="color: #0000BB"><?php//run class, insert data...$links = $obj->getPageRange(3);foreach ($links as $page) { echo '<a href="?a=1&amp;b=5&amp;page=' . $page . '">' . $page . '</a> '; }?>

Добавлено спустя   1 минуту  4 секунды:
Сейчас проверю. ~_~
Добавлено спустя   8 минут  21 секунду:
Эх, не то. Это при клике работает.

Код:

1
2
3
4
:active - при клике на ссылку
:link - не посещенная ссылка
:hover - при наведении
:visited - посещенная

Вроде чет было типа активная ссылка (на которой ты сейчас находишься) другим цветом отображается, или это я ступил?

tipsun » 2011.12.16 11:39

PHP file

Код:

1
span style="color: #0000BB"><?php$pg = new pageMan();$pg->setCount(1000)->setPage($_GET['p']);define('NOW_PAGE', $pg->getPage());define('LAST_PAGE', $pg->getPages());?>

TPL file

Код:

1
span style="color: #0000BB"><?php foreach ($links = $pg->getPageRange(3) as $page):?><?php if (NOW_PAGE == $page):?><?php echo $page;?>&#160;<?php else:?><a href="?a=someValue&amp;b=5&amp;p=<?php echo $page;?>"><?php echo $page;?></a>&#160;<?php endif; endforeach;?><br/><a href="?a=someValue&amp;p=1">Begin</a> | <a href="?a=someValue&amp;p=<?php echo LAST_PAGE;?>">End</a>

- - - -
А если записей слишком мало, то как быть?
В логике сделать так, чтоб подключался шаблон без навигации?

Gemorroj » 2011.12.16 11:53

<?=$page;?> - короткие теги нахуй.
&nbsp; - заменить на & #160; (без пробела)

tipsun » 2011.12.16 11:58

Исправил.

tipsun » 2011.12.16 18:13

Пытаюсь сделать типа если недостает ранжировка до (2 * $range + 1) то перебросить значения с начала в конец. И наоборот.
Пока чет не соображу.

Код:

1
span style="color: #0000BB"><?php$range = 3;/*[1] 2 3 4 5 6 73 4 5 [6] 7 8 93 4 5 6 7 8 [9]*/?>
tipsun » 2011.12.17 10:11

Кажется получилось!!!

Смотрел при 10-100 записях (10 записей = 1стр.) нормально.

Код:

1
span style="color: #0000BB"><?php public function getPageRange($range=null) { $range = (is_numeric($range) and 0 < $range) ? (int)$range : 4; $prev = $this->getPage() - $range; $next = $this->_page + $range; $start = $this->getPages() < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start = 1 < $start ? $start : 1; $stop = $this->_pages > $stop ? $stop : $this->_pages; return range($start, $stop); }?>
Gemorroj » 2011.12.18 22:01

без каментов ничего не понимаю =ь
а так с ходу видно, что 4 нужно в настройки вынести.

tipsun » 2011.12.18 22:12

Ну это предназначалось для перекидывания значений между начальной и конечной точкой.
Т.е. вместо:
- 1) [1] 2 3 4
будет:
[1] 2 3 4 5 6 7
т.е. минусовая ранжировка превратилась в плюсовую.
Для чего это?
Для плавной прокрутки.
Вместо:
- 2) 1 [2] 3 4 5
будет:
1 [2] 3 4 5 6 7
И чо?
Ну если посмотреть в пункт (1) там 4 элемента. А в (2) уже 5.
В принципе это все не так уж необходимо. :D
- - - -
Еще думаю добавить начальную и конечную страницу,
но при этом нарушается плавность.

tipsun » 2011.12.19 16:41

Получилось! http://wapinet.ru/forum/download.php?aid=949

Строго 7 элементов/квадратиков с номерами страниц, при использовании -2/+2 ранжировки.

Код:

1
span style="color: #0000BB"><?php /** * pageMan::getPageRange() * Получение ближайшего отрезка номеров страниц для создания навигации вида: (1 10 11 [12] 13 14 n). * @return array */ public function getPageRange($range=null) { if (1 == $this->getPages()) return array(1); $range = (is_numeric($range) and 0 < $range) ? (int)$range : 4; //про 4 не забыл. =) В константу её. $prev = $this->getPage() - $range; $next = $this->_page + $range; $start = $this->getPages() < $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 » 2011.12.20 09:55

В ZF надо посмотреть есть ли такой же метод ранжировки. Скорее всего конечно же есть. И наверно проще сделано. :(

tipsun » 2011.12.20 22:02

Вот, для наглядности.

Gemorroj » 2011.12.20 22:16

phpDoc не совсем верные
@return object замени на @return pageMan
@param mixed $count на @param integer $count
и тд. так же убери pageMan::getTable() и проч, как будто ты описываешь статические методы.
а так, не вдаваясь в подробности выглядит норм.

tipsun » 2011.12.20 22:24

Ок, спс.

tipsun » 2011.12.20 23:19

Математика у меня в pageMan::pageRange() неправильная, мне кажется.
Хотя там все работает верно.
Если расчитать все четко не получится, то увы. Будет как есть.

Nu3oN » 2011.12.21 09:13

Я с телефона, и половины темы не осилил! Код обрезает ппц! Убери для вап версии, в стиле (забыл как называеется) скроулинг

Gemorroj » 2011.12.21 12:02

Nu3oN, уберу

tipsun » 2011.12.23 15:54

Нет, чет лучше и проще никак не могу придумать. :(

tipsun » 2011.12.23 19:28

Единственное, что в голову приходит - это оптимизация.
Сейчас поправки внесу и выложу.

Вот. (Этот гребаный виндовс завирусованный, после восстановления мои архивы пропали! >_<)

Код:

1
span style="color: #0000BB"><?php /** * pageMan::getPageRange() * Получение ближайшего отрезка номеров страниц для создания навигации вида: (10 11 [12] 13 14). * @return array */ public function getPageRange($range=null) { if (1 == $this->getPages()) return array(1); $range = (is_numeric($range) and 0 < $range) ? (int)$range : DEF_RANGE; //CONST DEF_RANGE = 3; $prev = $this->getPage() - $range; $next = $this->_page + $range; $start = $this->getPages() < $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; //не то! ^_^ я уже лучше придумал. if ($start == $stop) return array(1); $array = range($start, $stop); if (1 < $start) { array_unshift($array, 1); } if ($this->_pages > $stop) { $array[] = $this->_pages; } return $array; }?>
tipsun » 2012.01.04 11:24

Akdmehp написал:


255, tipsun, смотрю навигацию в "живом" режиме.
Приятно, что используется
phpDoc - это плюс.
Итак, не совсем понял, зачем
делать так: $_count=null;
приравнивание переменной значению null равно её
удалению. То есть, ты
создаешь переменную, удаляя
её. Проще либо приравнивать
нулю или значениям по-
умолчанию, либо так: private $_count, $_page,
$_pages, $_start, $_tmpPage =
1, $_items = 10;
Не хватает для наглядности
примера использования.
Плохо, что нету конструктора, так было бы намного
нагляднее, советую добавить
конструктор.
Также по правилам хорошего
тона имя класса делаем с
большой. в phpDoc после * @param mixed
$count указываем что эта
переменная значит - по
правилам хорошего тона, ну и
после return указываем, что
именно возвращает. Советую использовать в
классе систему try/catch, это
будет намного логичнее, чем
генерировать ошибки.
Пример конструктора на твоем
коде, хотя я все равно бы код рефакторил:
__construct($count, $page,
$items);
Просмотрел. В принципе,
работы очень много, все можно
переделать короче и лучше, используя в два раза меньше
методов, так как это в свою
очередь запутывает код. В общем, работай дальше!

Благодаря Gemorroj'ю (насчет phpDoc) плюс заработал :)
Добавлено спустя   5 минут  51 секунду:
Я вот уже думаю насчет рефактора кода и конструктор, в принципе, добавить не проблема.
Добавлю конструктор а переменные буду обрабатывать методами, которые принимают данные.
try/catch даже не знаю че такое, придется учить.
Насчет $var = null; даже не знал.

Gemorroj » 2012.01.04 11:31

>> приравнивание переменной значению null равно её
удалению.
нет, это не так. если переменная существует (даже со значением null), под нее уже выделена память.
в остальном все так.
ссылки на стандарты кодирования
http://pear.php.net/manual/ru/standards.php
http://framework.zend.com/manual/ru/cod … ndard.html
я бы советовал придерживаться зендовских соглашений. PEAR отличается в мелочах.

tipsun » 2012.01.04 11:41

Gemorroj, ок. Спс. :)

tipsun » 2012.01.04 12:54

С телефона не комфортно читать... Потом с компа еще раз прочту.

tipsun » 2012.01.04 19:40

Gemorroj написал:

phpDoc не совсем верные
@return object замени на @return pageMan
@param mixed $count на @param integer $count
и тд. так же убери pageMan::getTable() и проч, как будто ты описываешь статические методы.
а так, не вдаваясь в подробности выглядит норм.

Сделано.

Gemorroj » 2012.01.05 12:01

а зачем ты пишешь в доках название метода а потом описание?
по правилам сначала короткое описание, а потом развернутое. дублировать название метода не надо
Добавлено спустя    55 секунд:

Код:

1
2
3
4
5
6
/**
* getPageRange()
* Получение ближайшего отрезка номеров страниц для создания навигации вида: (10 11 [12] 13 14).
* @return array
*/
public function getPageRange($range=null)

@param нету

tipsun » 2012.01.05 12:36

А точно, вчера же тоже читал про это. :( Сейчас.

tipsun » 2012.01.05 13:23

Мдэ... 2011.10.28 21:52 - первый вид класса навигации моего... и до сих пор мучаюсь :D

tipsun » 2012.01.05 17:20

Чет никак.
Может как тогда сделать, через __construct($count, $page, $items)
Сделать параметры обязательными, и убрать все эти setCount(), и т.д.
Тогда и ошибки ловить не надо будет.
Я вообще их ловить не умею, ну через try/catch

Gemorroj » 2012.01.05 18:26

я не понимаю проблемы.

tipsun » 2012.01.05 18:27

Ну ловить тоже че,

Код:

1
span style="color: #0000BB"><?phptry { throw new Exception('about error');} catch(Exception $e) { echo $e->getMessage(); }

Это понятно, а как в коде, куда это все.

Gemorroj » 2012.01.05 18:31

в каком коде?

tipsun » 2012.01.05 18:35

Код:

1
span style="color: #0000BB"><?phppublic function getArray(){ if (null === $this->_count) { trigger_error('Not enough data', E_USER_ERROR); } return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count));}
tipsun » 2012.01.05 18:55

__construct() и типа рефакторинг. Все вытекающие последствия.
Если чего тут (в теме) архив есть, с него заново начну.

Код:

1
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private $_count = 0, $_page = 1, $_items = 10, $_pages = 0, $_start = 0; /** * Проверка, является ли число натуральным. * @param integer $var * @return bool */ public function isNatural($var) { if (is_numeric($var) and 0 < $var) return true; return false; } /** * @param integer $count * @param integer $page * @param integer $items */ public function __construct($count=null, $page=null, $items=null) { if ($count and $this->isNatural($count)) $this->_count = (int)$count; if ($page and $this->isNatural($page)) $this->_page = (int)$page; if ($items and $this->isNatural($items)) $this->_items = (int)$items; } /** * Регистрация общего количества записей. * @param integer $count * @return pageMan */ public function setCount($count) { $this->__construct($count); return $this; } /** * Регистрация текущей страницы. * @param integer $page * @return pageMan */ public function setPage($page) { $this->__construct(0, $page); return $this; } /** * Регистрация количества записей на страницу. * @param integer $items * @return pageMan */ public function setItems($items) { $this->__construct(0, 0, $items); return $this; }
Gemorroj » 2012.01.05 19:27

это полный ахтунг! весь смысл конструктора просто катится в говно)
зачем ты в getArray делаешь такую проверку? if (null === $this->_count) {
что мешает делать ее в сеттере, а по дефолту задать нормальные значения?

tipsun » 2012.01.05 20:21

Ну так если пользователь ниче не введет, то с чем работать? >_>

Gemorroj » 2012.01.05 20:55

с дефолтовыми данными!

tipsun » 2012.01.05 21:36

Фух, вот как бы.

Код:

1
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private $_count = 0, $_page = 1, $_items = 10, $_pages = null, $_start = null; public 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->_page -= (int)$page + 1; } 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 (0 > $this->_page) { $this->_page = -$this->_page; if ($this->_page > $this->getPages()) { $this->_page = $this->_pages; } } return $this->_page; }//продолжение следует...}
Gemorroj » 2012.01.05 21:42

убери из конструктора передачу параметров и мб сделай класс сингелтоном.
так же исправь вызовы isNatural
сам isNatural можно сделать таким:
return (is_numeric($var) and 0 < $var);

tipsun » 2012.01.05 22:20

Gemorroj написал:


сам isNatural можно сделать таким:
return (is_numeric($var) and 0 < $var);

Круто. Тоже true/false возвращает. :)

Gemorroj » 2012.01.05 23:05

Gemorroj написал:

так же исправь вызовы isNatural

ты запускал свой класс вообще?)

tipsun » 2012.01.05 23:09

Неа :)
Я все редактиру, да редактирую.
Сейчас. Секунду.
- - - -
Синглтон (Singleton) тоже посмотрел, завтра добавлю, надеюсь.

tipsun » 2012.01.05 23:22

Хмм, я её даже переименовал, все. Все равно ошибку дает. :(
Fatal error: Call to undefined function kakaxa() in /usr/home/tipsun/ext/pageman/index.php on line 44
Если её убрать. То на следующий вызов так же говорит.
Чудеса и только...

tipsun » 2012.01.05 23:35

Ой. Совсем уже!!! $this->isNatural()
Добавлено спустя   2 минуты  55 секунд:
Ща фишку тоже напишу и спать срочно.

tipsun » 2012.01.05 23:48

Все написал фишку #103, связана с $this->_page и $this->getPage()
Не хотел использовать $_tmpPage
Расчитана на повторное использование getPage() чтоб лишний раз лишние функции не трогать
Оригинальный дебилизм :D
Все таки $_tmpPage проще намного. Потом переделаю.

tipsun » 2012.01.06 11:26

Код:

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

Может __clone() и __wakeup() переназвачить на:

Код:

1
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(); }
Gemorroj » 2012.01.06 12:02

нет. обычно их делают приватными просто. так же как и конструктор.
и назови метод не singleton, а getInstance.
вообще, я тут подумал, может это и плохая идея сингелтон для пагинатора. т.к. на странице может быть несколько разных пагинаций, и в случае с сингелтоном реализовать их будет не оч удобно, т.к. мы будем работать с 1 объектом.

tipsun » 2012.01.06 21:25

Ок, конструктор приватным сделаю.
Снесу синглтон.

Код:

1
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; }}
Akdmeh » 2012.01.06 21:39

Да прекрати ты использовать наконец $_pages = null, $_start = null;, это глупо!
Я же говорил, просто назови их, да дело в шляпе: private $_pages, $_start.
Или я не прав?

tipsun » 2012.01.06 21:44

Код:

1
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; }}
Gemorroj » 2012.01.07 10:32

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_* у них был один префикс.

tipsun » 2012.01.07 10:47

Ок. Но я думал, что задав getPageRange($range='')
'' - это уже (string).
(-хотя это не совсем то, наверно false лучше или тот же null-)
При проверке на натуральность первая проверка даст ошибку, второе условие даже не будет проверяться.
Значит и само условие даст ошибку. И обойдемся без (int), которое тоже вроде время забирает. Хотя по умолчанию (RANGE_DEFAULT) у нас и так (int). Сделаю без = null;
ну так: private $var1, $var2;

Gemorroj » 2012.01.07 10:56

tipsun написал:

Ок. Но я думал, что задав getPageRange($range='') '' - это уже (string).

да стринг, но человека использующего твой код этот стринг введет в замешательство. Если тебя так беспокоит явное приведение к инту, то можешь его убрать вообще, isNatural уже говорит о том, что использование переменной будет безопасным.

tipsun » 2012.01.07 17:21

Код:

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); } /** * Получение ближайшего отрезка номеров страниц для создания навигации * вида: (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; }}
Gemorroj » 2012.01.07 21:42

наверное, метод getRange лучше переименовать, т.к. он не является геттером переменной range (сеттер setRange).

tipsun » 2012.01.07 22:07

Не проблема. Сейчас.

Код:

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); } /** * Получение ближайшего отрезка номеров страниц для создания навигации * вида: (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:27

Happy End? :)
Или еще чего осталось?

Gemorroj » 2012.01.07 22:43

ну по архитектуре, вроде норм)
то, что получается на выходе мне оценивать сложно. нужно, наверное, простые экзамплы с примерами реально работающей пагинации.

tipsun » 2012.01.07 22:50

Ура! :)

tipsun » 2012.01.07 23:17

Код:

1
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 01:32

Код:

1
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;}
Gemorroj » 2012.01.08 04:02

tipsun написал:

Надо конструкт публичным сделать.

так да. закрывали его для синглтона же)

tipsun » 2012.01.08 08:34

Код:

1
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;}
Gemorroj » 2012.01.08 09:44

tipsun написал:

Как бы будет сразу 2 метода в 1.

никогда так не делай

tipsun » 2012.01.08 09:48

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

Gemorroj » 2012.01.08 11:35

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

tipsun » 2012.01.08 21:12

Gemorroj написал:

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

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

Код:

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.10 14:05

Хмм. Зачем так далеко было идти?
Просто надо было в 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 15:19

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

tipsun » 2012.01.10 16:22

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

Код:

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:54

Код:

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 22:57

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

Код:

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

Убрать с _rangeBuild()?

Gemorroj » 2012.01.18 23:00

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

tipsun » 2012.01.18 23:34

Данные:
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:54

Надо примеры выложить...

Gemorroj » 2012.01.19 12:38

обязательно!)

tipsun » 2012.01.19 14:10

Код:

1
span style="color: #0000BB"><?php/////Test///// $PM = new PageMan; define('COUNT', isset($_GET['count']) ? $_GET['count'] : 100); $pages = $PM->setCount(COUNT)->setPage($_GET['page'])->getPageRangeSimple(); define('NOW_PAGE', $PM->getPage()); define('LAST_PAGE', $PM->getPages()); ?> <html> <head> <title>Example</title> <style type="text/css"> a { text-decoration: none; } span.nowPage { background-color: #000; color: #fff; padding: 2px 3px 2px 3px; } span.pageRange { border: 1px dotted #000; padding: 1px 2px 1px 2px; } </style> </head> <body> <?php foreach ($pages as $page):?> <?php if (NOW_PAGE == $page):?> <span class="nowPage"><?php echo $page;?></span> <?php else:?> <span class="pageRange"><a href="?page=<?php echo $page;?>&amp;count=<?php echo COUNT;?>"><?php echo $page;?></a></span> <?php endif; endforeach;?> </body> </html>

Ну как-то так.

Код:

1
span style="color: #0000BB"><?php//$db = new PDO();define('ITEMS', 10);define('COUNT', (int)$db->query("SELECT COUNT(`news_id`) FROM `news` LIMIT 1;")->fetchColumn());if (COUNT) { $queryText = 'SELECT `news_id`, `name`, `date`, `comments` FROM `news` ORDER BY `news_id` DESC'; if (COUNT > ITEMS) { include_once 'pageMan.php'; $pg = new pageMan; $pg->setCount(COUNT)->setItems(ITEMS)->setPage($_REQUEST['page']); define('PAGES', $pg->getPages()); define('PAGE', $pg->getPage()); $points = $pg->getTable(); $queryText .= ' LIMIT '.$points['start'].', '.$points['stop']; } $queryText .= ';'; $query = $db->query($queryText); foreach ($query as $array) { echo '<div class="items">' . $array['date'] . '<br/><a href="read.php?id=' . $array['news_id'] . '">' . htmlspecialchars($array['name'], ENT_NOQUOTES) . '</a><br/>Comments: ' . $array['comments'] . '</div>'; } } else { echo '<div>Empty</div>'; }if (COUNT > ITEMS) { echo '<div class="pages"><a href="?page='.((int)PAGE-1).'">«</a> '.((int)PAGE).'/'.((int)PAGES).' <a href="?page='.((int)PAGE+1).'">»</a></div>'; }
Gemorroj » 2012.01.19 19:52

в методе getTable нужно документировать выходные параметры.
и примеры упростить сильно.

Код:

1
span style="color: #0000BB"><?php$currentPage = 1;$allItems = 100;$itemsPerPage = 10;$pg = new pageMan;$pages = $pg->setCount($allItems)->setItems($itemsPerPage)->setPage($currentPage)->getPageRangeSimple();<?php foreach ($pages as $page): ?><?php if ($currentPage == $page): ?><span class="nowPage"><?php echo $page; ?></span><?php else: ?><span class="pageRange"><a href="?page=<?php echo $page; ?>&amp;count=<?php echo $allItems; ?>"><?php echo $page; ?></a></span><?php endif; endforeach; ?>
tipsun » 2012.01.23 18:24

PageMan.zip {Пароль: 745963}

Gemorroj » 2012.01.23 20:52

ты сам проверял?) приватный коструктор нужен для синглтона только был

tipsun » 2012.01.23 21:24

Я не проверил. СПС, исправил.
Я в другом архиве видимо держал код. Я исправлял вроде эту ошибку.
PageMan.zip {Пароль: 78963}

Akdmeh » 2012.01.31 00:15

Мне кажется, что ты слишком много времени убиваешь на эту пагинацию, займись чем-то еще, потом возвратишься.
Основная проблема - нету нормального конструктора.
Завтра еще подробнее посмотрю.

Gemorroj » 2012.01.31 21:45

Akdmeh ну?)

tipsun » 2013.01.19 12:11

Код:

1
span style="color: #0000BB"><?php/** * Автор: TiPsun (tipsun91@gmail.com) * (c) 2013 * Блогодарность за помощь * в написании кода: ++ Gemorroj (http://wapinet.ru/) ++ Akdmeh (Akdmeh@gmail.com)**/class Pagination { protected // Данные $_pageCursor = 1, $_itemsCount = 0, $_itemsRange = 10, // Результат /*$_pagesCount, $_pageNumber, $_startPoint;*/ $_pagesCount = 1, $_pageNumber = 1, $_startPoint = 0; public function __construct() { } /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $number * @return bool */ protected static function _isNatural($number) { return (is_numeric($number) and 0 < $number); } /** * Регистрация общего кол-ва записей. * @param integer $arg * @return PageMan */ public function setCount($arg) { if (self::_isNatural($arg)) { $this->_itemsCount = (int) $arg; $this->_pagesCount = null; } /*else { $this->_pagesCount = $this->_pageNumber = 1; $this->_startPoint = 0; }*/ return $this; } /** * Регистрация текущей страницы. * @param integer $arg * @return pageMan */ public function setCursor($arg) { if (self::_isNatural($arg)) { $this->_pageCursor = (int) $arg; $this->_pageNumber = null; } /*else { $this->_pageNumber = 1; $this->_startPoint = 0; }*/ return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $arg * @return pageMan */ public function setItems($arg) { if (self::_isNatural($arg)) { $this->_itemsRange = (int) $arg; $this->_pagesCount = $this->_startPoint = null; } else if($this->_itemsCount) { $this->_itemsRange = $this->_itemsCount; $this->_pagesCount = $this->_startPoint = null; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pagesCount) { if ($this->_itemsCount) { $this->_pagesCount = (int) ceil($this->_itemsCount / $this->_itemsRange); } /*else { $this->_pagesCount = $this->_pageNumber = 1; $this->_startPoint = 0; }*/ } return $this->_pagesCount; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (null === $this->_pageNumber) { $this->_pageNumber = min($this->_pageCursor, $this->getPages()); } return $this->_pageNumber; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _calculateStartPoint() { if (null === $this->_startPoint) { $this->_startPoint = ($this->getPage() - 1) * $this->_itemsRange; } return $this->_startPoint; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArrayPoints() { return array( $this->_calculateStartPoint(), min(($this->_startPoint + $this->_itemsRange), $this->_itemsCount) ); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTablePoints() { return array( $this->_calculateStartPoint(), $this->_itemsRange ); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return string */ public function getTableLimit() { return 'LIMIT ' . $this->_calculateStartPoint() . ', ' . $this->_itemsRange; }}

Код:

1
span style="color: #0000BB"><?phpfunction paginationRange ($pagesCount, $pageNumber = 1, $pagesRange = 3){ // Проверка наличия необходимого кол-ва страниц для построениея ряда. if (1 >= $pagesCount) return array(1); // начальная + текущая + крайняя = 3 страницы * 2 стороны = лево + право :E if (0 >= $pagesRange || (3 + 2 * $pagesRange) >= $pagesCount) return range(1, $pagesCount); // Определяется отрезок построения if (0 >= $pageNumber) $pageNumber = 1; $lowerPoint = $pageNumber - $pagesRange; $upperPoint = $pageNumber + $pagesRange; // Перекидывание значений при: - - [1] 2 3 // Недостающее кол-во переходит на правую сторону: [1] 2 3 - - // И наоборот при: 8 9 [10=max] - - $lowerPoint = $pagesCount < $upperPoint ? $pagesCount - $upperPoint + $lowerPoint : $lowerPoint; $upperPoint = 1 > $lowerPoint ? $upperPoint - $lowerPoint + 1 : $upperPoint; // Избегаем ситуации: [1] 1 2 // Т.к. при построении будем добавлять начало и конец навигации. $lowerPoint -= $pagesCount <= $upperPoint ? 1 : 0; $upperPoint += 1 >= $lowerPoint ? 1 : 0; // Построение ряда. $range = array(); if (1 >= $lowerPoint) { $lowerPoint = 1; } else { $range[] = 1; } if ($pagesCount < $upperPoint) { $upperPoint = $pagesCount; } for ($i = $lowerPoint; $i <= $upperPoint; $i++) { $range[] = $i; } if ($pagesCount > $upperPoint) { $range[] = $pagesCount; } return $range;}
Gemorroj » 2013.01.19 12:26

"Не прошло и года" (с) совсем чуть-чуть осталось)

tipsun » 2013.01.19 12:29

Письмо из центpа до Штиpлица не дошло...
Он пpочитал его еще pаз. Опять не дошло...
Пpишлось читать в тpетий pаз. =)
Добавлено спустя   5 минут  19 секунд:
Akdmeh за весь год не нашел времени посмотреть мою говновигацию. :(
Добавлено спустя   5 минут  45 секунд:
А так с первого поста уже почти 2 года.

Merzavetz » 2013.01.22 14:20

Код:

1
span style="color: #0000BB"><?phpif ($all > 1) { echo '<div class="iblock">Страницы: '; $asd = $page - 2; $asd2 = $page + 3; if ($asd < $all && $asd > 0 && $page > 3) { echo '<a href="index.php?id=' . $id . '&amp;page=1">1</a> ... '; } for ($i = $asd; $i < $asd2; $i++) { if ($i < $all && $i > 0) { if ($i > $pages) { break; } if ($page == $i) { echo '<strong>[' . $i . ']</strong> '; } else { echo '<a href="index.php?id=' . $id . '&amp;page=' . $i . '">' . $i . '</a> '; } } } if ($i <= $pages) { if ($asd2 < $all) { echo ' ... <a href="index.php?id=' . $id . '&amp;page=' . $pages . '">' . $pages . '</a>'; } }

Это код постраничной навигации sea downloads 2. Подскажите пожалуйста ,как сделать чтобы отображались только первая, последняя, текущая, следующая и предыдущая страницы. Надо исключить ссылки на две страницы, которая перед предыдущей и которая за следующей. Голову сломал, не знаю как сделать.
Пример подобной постраничной навигации в в движке этого форума http://wapinet.ru/forum/wap/viewtopic.php?id=1281&p=12 . Нужно исключить десятую и четырнадцатую страницу.

Gemorroj » 2013.01.22 19:32

Merzavetz можешь просто выпилить ее и заменить на другую. такой код, действительно, трудно править)

tipsun » 2013.02.01 23:10

Gemorroj написал:

"Не прошло и года" (с) совсем чуть-чуть осталось)

Как всегда, ты прав.
Поправил функцию: paginationRange();
Пост #150
Добавлено спустя   2 минуты  18 секунд:
А вообще я сам честно говоря бы делал все очень просто, через форму.

Показать/Скрыть
[туда] - [сюда]
|стр. #| [ok]

tipsun » 2013.02.06 14:11

Переделал private _isNatural() на protected static _isNatural().

tipsun » 2013.02.10 16:04

Еще одна, на мой взгляд, уместная поправка. Сравнить можно этот и пост #150.

Код:

1
span style="color: #0000BB"><?php/** * Автор: TiPsun (tipsun91@gmail.com) * (c) 2013 * Блогодарность за помощь * в написании кода: ++ Gemorroj (http://wapinet.ru/) ++ Akdmeh (Akdmeh@gmail.com)**/namespace Core\Library;class Pagination { protected // Дано $_pageCursor = 1, $_itemsCount = 0, $_itemsRange = 10, // Результат $_pagesCount = 1, $_pageNumber = 1, $_startPoint = 0; public function __construct() { } /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $number * @return bool */ protected static function _isNatural($number) { return (is_numeric($number) and 0 < $number); } /** * Регистрация общего кол-ва записей. * @param integer $arg * @return PageMan */ public function setCount($arg) { if (self::_isNatural($arg)) { $this->_itemsCount = (int) $arg; $this->_pagesCount = null; } return $this; } /** * Регистрация текущей страницы. * @param integer $arg * @return pageMan */ public function setCursor($arg) { if (self::_isNatural($arg)) { $this->_pageCursor = (int) $arg; $this->_pageNumber = null; } return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $arg * @return pageMan */ public function setItems($arg) { if (self::_isNatural($arg)) { $this->_itemsRange = (int) $arg; $this->_pagesCount = null; $this->_startPoint = null; } elseif ($this->_itemsCount) { $this->_itemsRange = $this->_itemsCount; $this->_pagesCount = null; $this->_startPoint = null; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pagesCount) { if ($this->_itemsCount) { $this->_pagesCount = (int) ceil($this->_itemsCount / $this->_itemsRange); } } return $this->_pagesCount; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (null === $this->_pageNumber) { $this->_pageNumber = min($this->_pageCursor, $this->getPages()); } return $this->_pageNumber; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _calculateStartPoint() { if (null === $this->_startPoint) { $this->_startPoint = ($this->getPage() - 1) * $this->_itemsRange; } return $this->_startPoint; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArrayPoints() { return array( $this->_calculateStartPoint(), min(($this->_startPoint + $this->_itemsRange), $this->_itemsCount) ); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTablePoints() { return array( $this->_calculateStartPoint(), $this->_itemsRange ); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return string */ public function getTableLimit() { return 'LIMIT ' . $this->_calculateStartPoint() . ', ' . $this->_itemsRange; }}