Вы не зашли.
#1.
tipsun
Off
(19)
Moderator
2011.03.23 22:10
Код:
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.27 23:11)
#2.
tipsun
Off
(19)
Moderator
2011.03.23 23:11
Код:
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:11)
#3.
tipsun
Off
(19)
Moderator
2011.03.27 23:11
ГовноКод?
#2 можно форму по человечески в принципе сделать (сделал), эт я под разметку делал себе.
Отредактировано tipsun (2011.03.27 23:11)
ну да... не очень) намешано все в кучу. нет разделения логики и представления.
#5.
tipsun
Off
(19)
Moderator
2011.08.21 17:05
Вот попытался под разделение логики сделать.
Еще вот че интересно:
Разумно ли сделать, чтоб функция использовала define(); ?
Мне кажется это будет для пользователя (или посто меня
) удобней.
Код:
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 17:05)
#6.
tipsun
Off
(19)
Moderator
2011.08.21 20:08
>_> Что, опять говнокод?
Отредактировано tipsun (2011.08.21 20:08)
#8.
tipsun
Off
(19)
Moderator
2011.08.21 21:09
Ухаха: testMarkingOneSessionObjectImmutableShouldMarkOtherInstancesImmutable
- - - -
Там все есть что-ли?
А че тогда делать в PHP вообще?
- - - -
И еще главное все так аккуратно написано и с cache
Отредактировано tipsun (2011.08.21 21:09)
#9.
tipsun
Off
(19)
Moderator
2011.10.28 21:09
Не оставляю надежды написать толковый навигатор по страницам.
Код:
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();?> |
Отредактировано tipsun (2011.10.28 23:11)
Дык сыро еще же, не?
Или надо описать код/переменные/мое_восприятие_кода?
- - - -
Понял, описать код надо...
- - - -
Описал, поймите меня правильно
Отредактировано tipsun (2011.10.28 23:11)
есть стандартизованный стиль описания кода. называется phpDoc... )
Ок, буду знать.
Хотя я и так еле описал код. Сам код понимаю, а вот описать сложно.
Есть замечания по классу моему?
- - - -
Я еще думаю может через static тоже принимать/отдавать значения.
Код:
span style="color: #0000BB"><?phppager::setItems(10);pager::setMethod('array');//или так путаница будет? типа лишнее??> |
Отредактировано tipsun (2011.10.30 22:10)
tipsun, сделай документацию в phpDoc стиле. Ориентироваться по ней проще будет для анализа.
Код:
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.06 20:08)
Такое ощущение появилось, что я давно уже изобретаю велосипед (
Zend Paginator).
А честно говоря зато я весь этот код теперь понимаю, хоть какой-то толк есть...
Код:
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; } }/**/?> |
Отредактировано tipsun (2011.11.09 21:09)
ну так да.. это главная цель велосипедов)
Сделал через:
Код:
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.10 21:09)
Какой способ лучше?
Отредактировано tipsun (2011.11.11 15:03)
мне кажется 2, просто из-за того, что при расширении класса, не нужно будет следить за массивом доступных методов
СПС.
Ну для этого и переписал.
Ошибка. По невнимательности.
Код:
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:10)
И надо было указывать в условии
is_numeric(), чтоб с типами не возиться. А при занесении в свойство
= (int).
Отредактировано tipsun (2011.11.23 22:10)
Код:
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
Наверно лучше циклом или вложенной функцией.
Отредактировано tipsun (2011.12.11 13:01)
Еще надо это все: 1 .. 3 4 5 [6] 7 8 9 .. 15; в массиве возвращать, чтоб потом, например в шаблоне, все это удобно можно было вытащить и сделать ссылки.
у тебя не описано какие методы статические, а какие нет. будет кидать strict ошибки.
Или сделать функцию такую, чтоб пользователь в шаблоне через цикл сразу задавал свои страницы, а функция их обрабатывала.
Как-то так наверно.
Код:
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) или чего в коде не так?
Отредактировано tipsun (2011.12.11 14:02)
private function countPages() {
private static function countPages() {
и еще, если метод или свойство приватное или защищенное, название должно начинаться с подчеркивания.
Ок. Понял. СПС.
Хотя не совсем понял, в гугле посмотрю...
Отредактировано tipsun (2011.12.11 14:02)
Вот насчет этого вроде понял, типа:
Код:
span style="color: #0000BB"><?phpself::countPages();//если будешь так использовать, значит надо эту функцию пометить как static?> |
Отредактировано tipsun (2011.12.11 15:03)
Private, protected переменную называть: $_name;
А я думал в phpdoc комментарии просто @param mixed _$var;
- - - -
Так теперь надо это все дело сделать...
Отредактировано tipsun (2011.12.11 16:04)
да, phpDoc - это просто комментарии. А Private, protected - это базовый ООП.
Код:
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 16:04)
Gemorroj написал:
А Private, protected - это базовый ООП.
В курсе
Иначе я бы не применял все это.
Насколько я знаю...
protected/
private - это если указать, то действует только в самом классе.
Код:
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 18:06)
Бле... Чет я не то сделал.
Там же при static нельзя $this использовать...
Gemorroj, А где надо было static ставить?
До этого разве все правильно не было?
Отредактировано tipsun (2011.12.11 21:09)
либо вызывай метод как динамический, либо делай его статическим.
Gemorroj, ты про такой вызов?
Код:
span style="color: #0000BB"><?phppublic function getPages() { return self::_countPages(); }?> |
И его надо переделать под это?
Код:
span style="color: #0000BB"><?phppublic function getPages() { return call_user_method('_countPages', $this); }?> |
А под статический придется и переменные все переделать под self::
Отредактировано tipsun (2011.12.11 21:09)
Да блять.
смотри свой код из 25 поста.
Код:
public function getPages() { |
|
return self::countPages(); |
} |
отсюда следует, что метод countPages у тебя должен быть статическим.
если ты не хочешь делать его статическим, то вызывай его не как статический, а динамический. Т.е. $this->countPages();
Так бы сразу. Спс.
Добавлено спустя 6 минут 26 секунд: Я уже и забыл, что так метод вызвать можно
Мда, жестко я туплю...
Отредактировано tipsun (2011.12.11 22:10)
Код:
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::
Код:
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 16:04)
Еще чтоб в холостую циклы не гонять, можно заранее наверно расчитать количество повторений.
Отредактировано tipsun (2011.12.12 19:07)
Сам интерфейс класса не нравится.
* @param mixed $method
* @param mixed $count
* @param mixed $page
* @param mixed $items
new pageMan('array', 1768, $pageNum);
откуда я узнаю что 1 параметром нужно передать строку array ? O_o
и так же про остальные параметры.
Продумай сначала как внешне твой класс будет работать.
Например, удобно было бы как-то так:
Код:
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(); |
Ойбле
А мануал для чего?
- - - -
Ладно, переделаю.
Так еще надо будет следить ввел ли вообще пользователь параметр или нет.
- - - -
Код:
span style="color: #0000BB"><?phpecho $obj->setPage(1)->setItems(10)->getTable();//это вроде не проблема.//надо в методе:return $this;?> |
Отредактировано tipsun (2011.12.12 20:08)
Осталось теперь отслеживать ввод данных.
Код:
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'?> |
Отредактировано tipsun (2011.12.12 21:09)
#47.
Gemor
Гость
2011.12.12 21:09
вынеси свои параметры для setMethod в константы класса хотябы. а вообще я не вижу в setMethod вообще необходимости.
и проверять не надо, используй дефолтовые значения.
А, типа как ты показал getArray()/getTable().
Но там тогда надо будет массивом возвращать.
- - - -
Т.к. у меня там getStart точка отсчета.
Знач если getStop не будет, то просто все в одном вернуть и все.
Отредактировано tipsun (2011.12.12 22:10)
вот в зависимости от get* возвращай как просят.
Набросок.
Бле там за данными не уследишь.Код:
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:11)
Хотя в принципе там только за count следить надо
почему у тебя _items объявлена статическим свойством, а работаешь ты с ним как с динамическим?
Оу! Да действительно.
Надо константу объявить.
Код:
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; }?> |
Отредактировано tipsun (2011.12.13 12:12)
а переопределять ты ее тогда как собираешься?
Код:
span style="color: #0000BB"><?phpconst ITEMS = 10; //это как дефолтное значение, можно тупо без нее 10 написать и все, если пользователь не указал ниче.private $_items = null; //там есть =)?> |
Добавлено спустя 3 минуты 2 секунды: Еще если условию 0 < не удовлетворяет, то надо опять присвоить из константы
Отредактировано tipsun (2011.12.13 12:12)
почему бы просто не работать с динамическим свойством?
Код:
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 18:06)
* pageMan::getPages()
* Расчет общего кол-ва страниц.
* @return float, а не int...
Отредактировано tipsun (2011.12.13 22:10)
Вот еще заметил. Зачем 2 раза к методу обращаться, если свойство с 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:11)
Набросок.
Код:
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); }?> |
Отредактировано tipsun (2011.12.14 18:06)
что это такое? где phpDoc?
Поправил код.
В принципе можно и в шаблоне отметить текущую страницу.
Код:
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:07)
А может быть даже просто "схитрить"
Чем делать в цикле лишнее условие, лучше в стиле
a:active просто по-другому пометить и все
Вот мне и активная/текущая страница.
Отредактировано tipsun (2011.12.15 19:07)
Ну вроде цвет активной ссылки должен меняться ведь? Если я не ошибся, то должно сработать.
CSS
Код:
a { color: #000; } |
a:active { color: #888; } |
PHP
Код:
span style="color: #0000BB"><?php//run class, insert data...$links = $obj->getPageRange(3);foreach ($links as $page) { echo '<a href="?a=1&b=5&page=' . $page . '">' . $page . '</a> '; }?> |
Добавлено спустя 1 минуту 4 секунды: Сейчас проверю. ~_~
Добавлено спустя 8 минут 21 секунду: Эх, не то. Это при клике работает.
Код:
:active - при клике на ссылку |
:link - не посещенная ссылка |
:hover - при наведении |
:visited - посещенная |
Вроде чет было типа активная ссылка (на которой ты сейчас находишься) другим цветом отображается, или это я ступил?
Отредактировано tipsun (2011.12.15 21:09)
PHP file
Код:
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
Код:
span style="color: #0000BB"><?php foreach ($links = $pg->getPageRange(3) as $page):?><?php if (NOW_PAGE == $page):?><?php echo $page;?> <?php else:?><a href="?a=someValue&b=5&p=<?php echo $page;?>"><?php echo $page;?></a> <?php endif; endforeach;?><br/><a href="?a=someValue&p=1">Begin</a> | <a href="?a=someValue&p=<?php echo LAST_PAGE;?>">End</a> |
- - - -
А если записей слишком мало, то как быть?
В логике сделать так, чтоб подключался шаблон без навигации?
Отредактировано tipsun (2011.12.16 11:11)
<?=$page;?> - короткие теги нахуй.
- заменить на & #160; (без пробела)
Пытаюсь сделать типа если недостает ранжировка до (2 * $range + 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.16 18:06)
Кажется получилось!!!
Смотрел при 10-100 записях (10 записей = 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); }?> |
Отредактировано tipsun (2011.12.17 12:12)
без каментов ничего не понимаю =ь
а так с ходу видно, что 4 нужно в настройки вынести.
Ну это предназначалось для перекидывания значений между начальной и конечной точкой.
Т.е. вместо:
- 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.
В принципе это все не так уж необходимо.
- - - -
Еще думаю добавить начальную и конечную страницу,
но при этом нарушается
плавность.
Отредактировано tipsun (2011.12.18 22:10)
Получилось!
Строго 7 элементов/квадратиков с номерами страниц, при использовании -2/+2 ранжировки.
Код:
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 (2012.01.05 13:01)
В
ZF надо посмотреть есть ли такой же метод ранжировки. Скорее всего конечно же есть. И наверно проще сделано.
Отредактировано tipsun (2011.12.20 11:11)
phpDoc не совсем верные
@return object замени на @return pageMan
@param mixed $count на @param integer $count
и тд. так же убери pageMan::getTable() и проч, как будто ты описываешь статические методы.
а так, не вдаваясь в подробности выглядит норм.
Математика у меня в pageMan::pageRange() неправильная, мне кажется.
Хотя там все работает верно.
Если расчитать все четко не получится, то увы. Будет как есть.
Отредактировано tipsun (2011.12.20 23:11)
#82.
Nu3oN
Off
(11)
Moderator
2011.12.21 09:09
Я с телефона, и половины темы не осилил! Код обрезает ппц! Убери для вап версии, в стиле (забыл как называеется) скроулинг
Я буду лучше голоден, но между креслом и рулем и на дороге.
Нет, чет лучше и проще никак не могу придумать.
Отредактировано tipsun (2011.12.23 16:04)
Единственное, что в голову приходит - это оптимизация.
Сейчас поправки внесу и выложу.
Вот. (Этот гребаный виндовс завирусованный, после восстановления мои архивы пропали! >_<)
Код:
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 (2011.12.23 20:08)
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; даже не знал.
Отредактировано tipsun (2012.01.04 11:11)
Gemorroj, ок. Спс.
С телефона не комфортно читать... Потом с компа еще раз прочту.
Gemorroj написал:
phpDoc не совсем верные
@return object замени на @return pageMan
@param mixed $count на @param integer $count
и тд. так же убери pageMan::getTable() и проч, как будто ты описываешь статические методы.
а так, не вдаваясь в подробности выглядит норм.
Сделано.
Отредактировано tipsun (2012.01.04 19:07)
а зачем ты пишешь в доках название метода а потом описание?
по правилам сначала короткое описание, а потом развернутое. дублировать название метода не надо
Добавлено спустя 55 секунд: Код:
/** |
* getPageRange() |
* Получение ближайшего отрезка номеров страниц для создания навигации вида: (10 11 [12] 13 14). |
* @return array |
*/ |
public function getPageRange($range=null) |
@param нету
А точно, вчера же тоже читал про это.
Сейчас.
Мдэ...
2011.10.28 21:52 - первый вид класса навигации моего... и до сих пор мучаюсь
Отредактировано tipsun (2012.01.05 15:03)
Чет никак.
Может как тогда сделать, через
__construct($count, $page, $items)Сделать параметры обязательными, и убрать все эти setCount(), и т.д.
Тогда и ошибки ловить не надо будет.
Я вообще их ловить не умею, ну через try/catch
Ну ловить тоже че,
Код:
span style="color: #0000BB"><?phptry { throw new Exception('about error');} catch(Exception $e) { echo $e->getMessage(); } |
Это понятно, а как в коде, куда это все.
Код:
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:06)
__construct() и типа рефакторинг. Все вытекающие последствия.
Если чего тут (в теме) архив есть, с него заново начну.
Код:
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; } |
Отредактировано tipsun (2012.01.05 19:07)
это полный ахтунг! весь смысл конструктора просто катится в говно)
зачем ты в getArray делаешь такую проверку? if (null === $this->_count) {
что мешает делать ее в сеттере, а по дефолту задать нормальные значения?
Ну так если пользователь ниче не введет, то с чем работать? >_>
Фух, вот как бы.
Код:
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; }//продолжение следует...} |
Отредактировано tipsun (2012.01.05 23:11)
убери из конструктора передачу параметров и мб сделай класс сингелтоном.
так же исправь вызовы isNatural
сам isNatural можно сделать таким:
return (is_numeric($var) and 0 < $var);
Gemorroj написал:
сам isNatural можно сделать таким:
return (is_numeric($var) and 0 < $var);
Круто. Тоже true/false возвращает.
Gemorroj написал:
так же исправь вызовы isNatural
ты запускал свой класс вообще?)
Неа
Я все редактиру, да редактирую.
Сейчас. Секунду.
- - - -
Синглтон (Singleton) тоже посмотрел, завтра добавлю, надеюсь.
Отредактировано tipsun (2012.01.05 23:11)
Хмм, я её даже переименовал, все. Все равно ошибку дает.
Fatal error: Call to undefined function kakaxa() in /usr/home/tipsun/ext/pageman/index.php on line 44
Если её убрать. То на следующий вызов так же говорит.
Чудеса и только...
Отредактировано tipsun (2012.01.05 23:11)
Ой. Совсем уже!!! $this->isNatural()
Добавлено спустя 2 минуты 55 секунд: Ща фишку тоже напишу и спать срочно.
Отредактировано tipsun (2012.01.05 23:11)
Все написал фишку #103, связана с
$this->_page и
$this->getPage()Не хотел использовать $_tmpPage
Расчитана на повторное использование getPage() чтоб лишний раз лишние функции не трогать
Оригинальный дебилизм
Все таки $_tmpPage проще намного. Потом переделаю.
Отредактировано tipsun (2012.01.05 23:11)
Код:
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private static $instance; private $_count = 0, $_page = null, $_tmpPage = 1, $_items = 10, $_pages = null, $_start = null; public function __construct() { } /** * Singleton * @link http://php.net/manual/en/language.oop5.patterns.php */ public static function singleton() { if (! isset(self::$instance)) { self::$instance = new PageMan; } return self::$instance; } public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } public function __wakeup() { trigger_error('Unserializing is not allowed.', E_USER_ERROR); } /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ public function isNatural($var) { return (is_numeric($var) and 0 < $var); } /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->isNatural($count)) { $this->_count = (int)$count; } return $this; } /** * Регистрация текущей страницы. * @param integer $page * @return pageMan */ public function setPage($page) { if ($this->isNatural($page)) { $this->_tmpPage = (int)$page; } return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $items * @return pageMan */ public function setItems($items) { if ($this->isNatural($items)) { $this->_items = (int)$items; } else if($this->_count) { $this->_items = $this->_count; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { $this->_pages = (int)ceil($this->_count / $this->_items); if (0 == $this->_pages) $this->_pages += 1; } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->getPage() - 1) * $this->_items; } return $this->_start; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArray() { return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count)); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } /** * Получение ближайшего отрезка номеров страниц для создания навигации * вида: (1 p-2 p-1 [p] p+1 p+2 N). * @return array */ public function getPageRange($range=null) { if (1 == $this->getPages()) return array(1); $range = $this->isNatural($range) ? (int)$range : DEFAULT_RANGE; $prev = $this->getPage() - $range; $next = $this->_page + $range; $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start -= $this->_pages <= $stop ? 1 : 0; $stop += 1 >= $start ? 1 : 0; $start = 1 < $start ? $start : 1; $stop = $this->_pages > $stop ? $stop : $this->_pages; $array = range($start, $stop); if (1 < $start) { array_unshift($array, 1); } if ($this->_pages > $stop) { $array[] = $this->_pages; } return $array; }} |
Отредактировано tipsun (2012.01.06 11:11)
Может __clone() и __wakeup() переназвачить на:
Код:
span style="color: #0000BB"><?php/** * Singleton * @link http://php.net/manual/en/language.oop5.patterns.php */ public static function singleton() { if (! isset(self::$instance)) { self::$instance = new PageMan; } return self::$instance; } public function __clone() { return singleton(); } public function __wakeup() { return singleton(); } |
нет. обычно их делают приватными просто. так же как и конструктор.
и назови метод не singleton, а getInstance.
вообще, я тут подумал, может это и плохая идея сингелтон для пагинатора. т.к. на странице может быть несколько разных пагинаций, и в случае с сингелтоном реализовать их будет не оч удобно, т.к. мы будем работать с 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; }} |
Отредактировано tipsun (2012.01.06 21:09)
Да прекрати ты использовать наконец $_pages = null, $_start = null;, это глупо!
Я же говорил, просто назови их, да дело в шляпе: private $_pages, $_start.
Или я не прав?
Желание стать программистом из-за того, что вам нравляться компьютерные игры-это все равно, что желание стать гинекологом из-за того, что вам нравиться секс
Код:
span style="color: #0000BB"><?phpclass PageMan{ const DEFAULT_RANGE = 3; private $_count = 0, $_page = false, $_tmpPage = 1, $_items = 10, $_pages = false, $_start = false; private function __construct() {} /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ public function isNatural($var) { return (is_numeric($var) and 0 < $var); } /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->isNatural($count)) { $this->_count = (int)$count; } return $this; } /** * Регистрация текущей страницы. * @param integer $page * @return pageMan */ public function setPage($page) { if ($this->isNatural($page)) { $this->_tmpPage = (int)$page; } return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $items * @return pageMan */ public function setItems($items) { if ($this->isNatural($items)) { $this->_items = (int)$items; } else if($this->_count) { $this->_items = $this->_count; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (false === $this->_pages) { $this->_pages = (int)ceil($this->_count / $this->_items); if (0 == $this->_pages) $this->_pages += 1; } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (false === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (false === $this->_start) { $this->_start = ($this->getPage() - 1) * $this->_items; } return $this->_start; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArray() { return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count)); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } /** * Получение ближайшего отрезка номеров страниц для создания навигации * вида: (1 p-2 p-1 [p] p+1 p+2 N). * @return array */ public function getPageRange($range='') { if (1 == $this->getPages()) return array(1); $range = $this->isNatural($range) ? (int)$range : DEFAULT_RANGE; $prev = $this->getPage() - $range; $next = $this->_page + $range; $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start -= $this->_pages <= $stop ? 1 : 0; $stop += 1 >= $start ? 1 : 0; $start = 1 < $start ? $start : 1; $stop = $this->_pages > $stop ? $stop : $this->_pages; $array = range($start, $stop); if (1 < $start) array_unshift($array, 1); if ($this->_pages > $stop) $array[] = $this->_pages; return $array; }} |
Отредактировано tipsun (2012.01.06 22:10)
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_* у них был один префикс.
Ок. Но я думал, что задав getPageRange($range='')
'' - это уже (string).
(-хотя это не совсем то, наверно false лучше или тот же null-)
При проверке на натуральность первая проверка даст ошибку, второе условие даже не будет проверяться.
Значит и само условие даст ошибку. И обойдемся без (int), которое тоже вроде время забирает. Хотя по умолчанию (RANGE_DEFAULT) у нас и так (int). Сделаю без = null;
ну так: private $var1, $var2;
Отредактировано tipsun (2012.01.07 10:10)
tipsun написал:
Ок. Но я думал, что задав getPageRange($range='') '' - это уже (string).
да стринг, но человека использующего твой код этот стринг введет в замешательство. Если тебя так беспокоит явное приведение к инту, то можешь его убрать вообще, isNatural уже говорит о том, что использование переменной будет безопасным.
Код:
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; }} |
наверное, метод getRange лучше переименовать, т.к. он не является геттером переменной range (сеттер setRange).
Не проблема. Сейчас.
Код:
span style="color: #0000BB"><?phpclass PageMan{ private $_count = 0, $_tmpPage = 1, $_items = 10, $_range = 2, $_page, $_pages, $_start; private function __construct() {} /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ private function _isNatural($var) { return (is_numeric($var) and 0 < $var); } /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->_isNatural($count)) { $this->_count = (int)$count; } return $this; } /** * Регистрация текущей страницы. * @param integer $page * @return pageMan */ public function setPage($page) { if ($this->_isNatural($page)) { $this->_tmpPage = (int)$page; } return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $items * @return pageMan */ public function setItems($items) { if ($this->_isNatural($items)) { $this->_items = (int)$items; } else if($this->_count) { $this->_items = $this->_count; } return $this; } /** * Регистрация масштаба ранжировки. * @param integer $range * @return pageMan */ public function setRange($range) { if ($this->_isNatural($range)) { $this->_range = (int)$range; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { $this->_pages = (int)ceil($this->_count / $this->_items); if (0 == $this->_pages) $this->_pages += 1; } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->getPage() - 1) * $this->_items; } return $this->_start; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArray() { return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count)); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } /** * Получение ближайшего отрезка номеров страниц для создания навигации * вида: (1 p-2 p-1 [p] p+1 p+2 N). * @return array */ public function getPageRange() { if (1 == $this->getPages()) return array(1); $prev = $this->getPage() - $this->_range; $next = $this->_page + $this->_range; $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start -= $this->_pages <= $stop ? 1 : 0; $stop += 1 >= $start ? 1 : 0; $start = 1 < $start ? $start : 1; $stop = $this->_pages > $stop ? $stop : $this->_pages; $array = range($start, $stop); if (1 < $start) array_unshift($array, 1); if ($this->_pages > $stop) $array[] = $this->_pages; return $array; }} |
Отредактировано tipsun (2012.01.07 22:10)
Happy End?
Или еще чего осталось?
Отредактировано tipsun (2012.01.07 22:10)
ну по архитектуре, вроде норм)
то, что получается на выходе мне оценивать сложно. нужно, наверное, простые экзамплы с примерами реально работающей пагинации.
Ура!
Код:
Fatal error: Call to private PageMan::__construct() from invalid context in L:\home\tt.php\www\PageMan.php on line 187 |
Надо конструкт публичным сделать.
Отредактировано tipsun (2012.01.08 02:02)
Код:
span style="color: #0000BB"><?phppublic function getPageRange(){ if (1 == $this->getPages()) return array(1); $prev = $this->getPage() - $this->_range; $next = $this->_page + $this->_range; //+сделаю отдельный метод может $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; $start -= $this->_pages <= $stop ? 1 : 0; $stop += 1 >= $start ? 1 : 0; //-сделаю отдельный метод может if(1 >= $start) $start = 1; else $array[] = 1; if($stop > $this->_pages) $stop = $this->_pages; for ($i=$start; $i<=$stop; $i++) { $array[] = $i; } if ($stop < $this->_pages) $array[] = $this->_pages; return $array;} |
Отредактировано tipsun (2012.01.08 02:02)
tipsun написал:
Надо конструкт публичным сделать.
так да. закрывали его для синглтона же)
Код:
span style="color: #0000BB"><?php/** * Как бы будет сразу 2 метода в 1. * При вызове getPageRange() будет расчитываться простая ранжировка. * При вызове getPageRange(1)/getPageRange(true) будет расчитываться сложная ранжировка. */public function getPageRange($complex=null){ if (1 == $this->getPages()) return array(1); $prev = $this->getPage() - $this->_range; $next = $this->_page + $this->_range; if ($complex) { $start = $this->_pages < $next ? $this->_pages - $next + $prev : $prev; $stop = 1 > $prev ? $next - $prev + 1 : $next; if ($this->_pages <= $stop) $start -= 1; if (1 >= $start) $stop += 1; } else { $start = $prev; $stop = $next; } if(1 >= $start) $start = 1; else $array[] = 1; if($stop > $this->_pages) $stop = $this->_pages; for ($i=$start; $i<=$stop; $i++) { $array[] = $i; } if ($stop < $this->_pages) $array[] = $this->_pages; return $array;} |
Отредактировано tipsun (2012.01.08 08:08)
tipsun написал:
Как бы будет сразу 2 метода в 1.
никогда так не делай
Тогда getPageRange()
надо сделать управляющим.
В нем вызывать определенные методы со своими расчетами/математикой.
После устранять неточности и строить ранжировку.
- - - -
Или сделать _buildRange();
В котором так же устраняются неточности.
Отредактировано tipsun (2012.01.08 09:09)
так да. типовая ситуация. в самом простом случае, делается 2 публичных метода с отличающимся кодом и 1 приватный с общим для этих 2-х методов.
Gemorroj написал:
так да. типовая ситуация. в самом простом случае, делается 2 публичных метода с отличающимся кодом и 1 приватный с общим для этих 2-х методов.
Как ты говорил, так, в итоге, и вышло все таки
Код:
span style="color: #0000BB"><?php//Часто повторяетсяif (1 == $this->getPages()) return array(1);//Может его только в методе: _buildRange() оставить? |
Код:
span style="color: #0000BB"><?phpclass PageMan{ private $_count = 0, $_tmpPage = 1, $_items = 10, $_range = 2, $_page, $_pages, $_start; private function __construct() {} /** * Проверка числа на принадлежность к множеству натуральных. * @param integer $var * @return bool */ private function _isNatural($var) { return (is_numeric($var) and 0 < $var); } /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->_isNatural($count)) { $this->_count = (int)$count; } return $this; } /** * Регистрация текущей страницы. * @param integer $page * @return pageMan */ public function setPage($page) { if ($this->_isNatural($page)) { $this->_tmpPage = (int)$page; } return $this; } /** * Регистрация кол-ва записей на страницу. * @param integer $items * @return pageMan */ public function setItems($items) { if ($this->_isNatural($items)) { $this->_items = (int)$items; } else if($this->_count) { $this->_items = $this->_count; } return $this; } /** * Регистрация масштаба ранжировки. * @param integer $range * @return pageMan */ public function setRange($range) { if ($this->_isNatural($range)) { $this->_range = (int)$range; } return $this; } /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { $this->_pages = (int)ceil($this->_count / $this->_items); if (0 == $this->_pages) { $this->_pages = 1; } } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->getPages()); } return $this->_page; } /** * Расчет начальной точки отсчета показа записей в вашем цикле. * @return integer */ private function _setStart() { if (null === $this->_start) { $this->_start = ($this->getPage() - 1) * $this->_items; } return $this->_start; } /** * Расчет конечной точки отсчета показа записей в цикле для массива данных. * @return array */ public function getArray() { return array( 'start' => $this->_setStart(), 'stop' => min(($this->_start + $this->_items), $this->_count)); } /** * Расчет конечной точки отсчета показа записей в цикле для данных * в таблице (DB). * @return array */ public function getTable() { return array( 'start' => $this->_setStart(), 'stop' => $this->_items); } /** * Построение ряда. * @param integer $lower * @param integer $upper * @return array */ private function _rangeBuild($lower, $upper) { if (1 == $this->getPages()) return array(1); $array = array(); if (1 >= $lower) { $lower = 1; } else { $array[] = 1; } if ($this->_pages < $upper) { $upper = $this->_pages; } for ($i = $lower; $i <= $upper; $i++) { $array[] = $i; } if ($this->_pages > $upper) { $array[] = $this->_pages; } return $array; } public function getPageRangeSimple() { if (1 == $this->getPages()) return array(1); $lower = $this->getPage() - $this->_range; $upper = $this->_page + $this->_range; return $this->_rangeBuild($lower, $upper); } public function getPageRangeComplex() { if (1 == $this->getPages()) return array(1); $lower = $this->getPage() - $this->_range; $upper = $this->_page + $this->_range; $lower = $this->getPages() < $upper ? $this->_pages - $upper + $lower : $lower; $upper = 1 > $lower ? $upper - $lower + 1 : $upper; if ($this->_pages <= $upper) $lower -= 1; if (1 >= $lower) $upper += 1; return $this->_rangeBuild($lower, $upper); }} |
Отредактировано tipsun (2012.01.08 21:09)
Хмм. Зачем так далеко было идти?
Просто надо было в setCount сделать так:
Код:
span style="color: #0000BB"><?php /** * Регистрация общего кол-ва записей. * @param integer $count * @return pageMan */ public function setCount($count) { if ($this->_isNatural($count)) { $this->_count = (int)$count; } else { $this->pages = $this->page = 1; } return $this; } |
А если так, то можно убрать лишнее:
Код:
span style="color: #0000BB"><?php /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { $this->_pages = (int)ceil($this->_count / $this->_items); //if (0 == $this->_pages) { // // $this->_pages = 1; //} } return $this->_pages; } |
Отредактировано tipsun (2012.01.10 14:02)
Все, правку у себя тоже делаю сейчас.
Добавлено спустя 4 минуты 44 секунды: Нет. Ошибаюсь.
А если метод вообще не будет вызван, а? Ну я Петросян.
Расскоментировать надо закомментированное.
Отредактировано tipsun (2012.01.10 15:03)
Еще можно в конструкте сделать так:
Или метод сделать такой.
Код:
span style="color: #0000BB"><?php//privatepublic function __construct($array){ if ($array['count']) $this->setCount($array['count']); if ($array['page']) $this->setPage($array['page']); if ($array['items']) $this->setItems($array['items']); if ($array['range']) $this->setRange($array['range']);} |
А еще так можно.
Код:
span style="color: #0000BB"><?php /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { if (0 == $this->count) { $this->_pages = 1; } else { $this->_pages = (int)ceil($this->_count / $this->_items); } } return $this->_pages; } |
Отредактировано tipsun (2012.01.18 00:12)
Код:
span style="color: #0000BB"><?php /** * Расчет общего кол-ва страниц. * @return integer */ public function getPages() { if (null === $this->_pages) { //++++ if (0 == $this->_count) { $this->_pages = $this->_page = 1; } else { $this->_pages = (int)ceil($this->_count / $this->_items); } } return $this->_pages; } /** * Получение номера корректной текущей страницы. * @return integer */ public function getPage() { $this->getPages(); if (null === $this->_page) { $this->_page = min($this->_tmpPage, $this->_pages); } return $this->_page; } |
Отредактировано tipsun (2012.01.18 11:11)
В правильном направлении хоть?
_rangeBuild() оставить как есть?
Код:
span style="color: #0000BB"><?phpif (1 == $this->getPages()) return array(1); |
Убрать с _rangeBuild()?
объясни плз на что обратить внимание и вообще.. я потерял нить что-то
Данные:
1) указаны*
1.1) корректны
1.2) не корректны
2) не указаны**
- - - -
1.1: все как обычно.
1.2: определить переменные, которые должны будут расчитаны в последующем, чтоб зря не запускать методы/функции.
2: см. пункт (1.1)
- - - -
* - значит использовали методы-указатели (так их обзову).
** - были пропущены или вообще не использовались методы-указатели.
- - - -
Как-то так вот почему-то думаю.
Пост #137.
_start в принципе определить заранее тоже можно.
- - - -
А вообще нормальный пользователь сначала проверит, если записи или нет.
Код:
span style="color: #0000BB"><?php$count =//query SELECT COUNT(1/*) ...If ($count)//run PageMan and query SELECT 'rows' FROM 'table' LIMIT <put from PageMan>;else echo 'Empty'; |
Отредактировано tipsun (2012.01.18 23:11)
Код:
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;?>&count=<?php echo COUNT;?>"><?php echo $page;?></a></span> <?php endif; endforeach;?> </body> </html> |
Ну как-то так.
Код:
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>'; } |
Отредактировано tipsun (2012.01.19 15:03)
в методе getTable нужно документировать выходные параметры.
и примеры упростить сильно.
Код:
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; ?>&count=<?php echo $allItems; ?>"><?php echo $page; ?></a></span><?php endif; endforeach; ?> |
PageMan.zip {Пароль: 745963}
Отредактировано tipsun (2012.01.23 18:06)
ты сам проверял?) приватный коструктор нужен для синглтона только был
Я не проверил. СПС, исправил.
Я в другом архиве видимо держал код. Я исправлял вроде эту ошибку.
PageMan.zip {Пароль: 78963}
Отредактировано tipsun (2012.01.23 21:09)
Мне кажется, что ты слишком много времени убиваешь на эту пагинацию, займись чем-то еще, потом возвратишься.
Основная проблема - нету нормального конструктора.
Завтра еще подробнее посмотрю.
Желание стать программистом из-за того, что вам нравляться компьютерные игры-это все равно, что желание стать гинекологом из-за того, что вам нравиться секс
Код:
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; }} |
Код:
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;} |
Отредактировано tipsun (2013.02.01 22:10)
"Не прошло и года" (с) совсем чуть-чуть осталось)
Письмо из центpа до Штиpлица не дошло...
Он пpочитал его еще pаз. Опять не дошло...
Пpишлось читать в тpетий pаз.
Добавлено спустя 5 минут 19 секунд: Akdmeh за весь год не нашел времени посмотреть мою говновигацию.
Добавлено спустя 5 минут 45 секунд: А так с первого поста уже почти 2 года.
Код:
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 . '&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 . '&page=' . $i . '">' . $i . '</a> '; } } } if ($i <= $pages) { if ($asd2 < $all) { echo ' ... <a href="index.php?id=' . $id . '&page=' . $pages . '">' . $pages . '</a>'; } } |
Это код постраничной навигации sea downloads 2. Подскажите пожалуйста ,как сделать чтобы отображались только первая, последняя, текущая, следующая и предыдущая страницы. Надо исключить ссылки на две страницы, которая перед предыдущей и которая за следующей. Голову сломал, не знаю как сделать.
Пример подобной постраничной навигации в в движке этого форума http://wapinet.ru/forum/wap/viewtopic.php?id=1281&p=12 . Нужно исключить десятую и четырнадцатую страницу.
Отредактировано Merzavetz (2013.01.22 14:02)
Merzavetz можешь просто выпилить ее и заменить на другую. такой код, действительно, трудно править)
Gemorroj написал:
"Не прошло и года" (с) совсем чуть-чуть осталось)
Как всегда, ты прав.
Поправил функцию: paginationRange();
Пост
#150Добавлено спустя 2 минуты 18 секунд: А вообще я сам честно говоря бы делал все очень просто, через форму.
Отредактировано tipsun (2013.02.01 23:11)
Переделал
private _isNatural() на
protected static _isNatural().
Еще одна, на мой взгляд, уместная поправка. Сравнить можно этот и пост
#150.
Код:
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; }} |
Страниц:
1 …
14 15 16 Все