Вы не зашли.
Главная » PHP » Функция навигации по страницам
#61. tipsun Off (19)
Moderator
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)
#62. Gemorroj Off (107)
Administrator
2011.12.13 23:11
что это такое? где phpDoc?
#63. tipsun Off (19)
Moderator
2011.12.14 15:03
Добавил phpDoc.
#64. tipsun Off (19)
Moderator
2011.12.14 18:06
Поправил код.
В принципе можно и в шаблоне отметить текущую страницу.
#65. tipsun Off (19)
Moderator
2011.12.15 19:07
Код:
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)
#66. tipsun Off (19)
Moderator
2011.12.15 19:07
А может быть даже просто "схитрить" smile
Чем делать в цикле лишнее условие, лучше в стиле a:active просто по-другому пометить и все smile
Вот мне и активная/текущая страница.
Отредактировано tipsun (2011.12.15 19:07)
#67. Gemorroj Off (107)
Administrator
2011.12.15 21:09
не понял. покажи)
#68. tipsun Off (19)
Moderator
2011.12.15 21:09
Ну вроде цвет активной ссылки должен меняться ведь? Если я не ошибся, то должно сработать.

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&amp;b=5&amp;page=' . $page . '">' . $page . '</a> '; }?>
Добавлено спустя   1 минуту  4 секунды:
Сейчас проверю. ~_~
Добавлено спустя   8 минут  21 секунду:
Эх, не то. Это при клике работает.
Код:
:active - при клике на ссылку
:link - не посещенная ссылка
:hover - при наведении
:visited - посещенная
Вроде чет было типа активная ссылка (на которой ты сейчас находишься) другим цветом отображается, или это я ступил?
Отредактировано tipsun (2011.12.15 21:09)
#69. tipsun Off (19)
Moderator
2011.12.16 11:11
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;?>&#160;<?php else:?><a href="?a=someValue&amp;b=5&amp;p=<?php echo $page;?>"><?php echo $page;?></a>&#160;<?php endif; endforeach;?><br/><a href="?a=someValue&amp;p=1">Begin</a> | <a href="?a=someValue&amp;p=<?php echo LAST_PAGE;?>">End</a>
- - - -
А если записей слишком мало, то как быть?
В логике сделать так, чтоб подключался шаблон без навигации?
Отредактировано tipsun (2011.12.16 11:11)
#70. Gemorroj Off (107)
Administrator
2011.12.16 11:11
<?=$page;?> - короткие теги нахуй.
&nbsp; - заменить на & #160; (без пробела)
Страниц: 15 6 7 8 916 Все
Главная
WEB
PunBB Mod v0.6.2
0.016 s