|
|
|
| Многим нужна, вопросы задаются постоянно.
Решил выложить своё решение.
1. Строится именно pagebar. Вне зависимости откуда берутся данные
2. Логика полностью отделена от шаблона
3. "Перемотки" вперёд - назад нет. Их функции выполняют крайние страницы блока.
4. Текущая страница всегда в центре, если есть возможность.
Сам код:
<?
/**
/* @param $currentPage- текущая страница
/* @param $allItems - общее количество элементов
/* @param $itemsOnPage - количество элементов на странице
/* @param $blockLength - длина блока пейджера. (сколько страниц в пределах одной прокрутки)
*/
function pager($currentPage,$allItems,$itemsOnPage,$blockLength){
// Подготовительные работы
if($blockLength%2 > 0){
$blockLength++;
}
$add = floor($blockLength/2);
$numOfPages = ceil($allItems/$itemsOnPage);
$ret = array();
// Определяем границы блока
$firstInBlock = $currentPage - $add;
$lastInBlock = $currentPage + $add;
// Строим массив пейджера
if($firstInBlock <= 1){
$firstInBlock = 1;
$lastInBlock = $blockLength;
}else{
$ret['first'] = 1;
}
if($lastInBlock>=$numOfPages){
$lastInBlock = $numOfPages;
$firstInBlock = $numOfPages - $add*2;
}else{
$ret['last'] = $numOfPages;
}
for($i=$firstInBlock;$i<=$lastInBlock;$i++){
$ret['current'][] = $i;
}
return $ret;
}
?>
|
Пример использования:
<?
$current = ((int)$_GET['page'] == 0)?1:(int)$_GET['page'];
$pager = pager($current,1200,20,10);
?>
<style>
a.current{
font-weight:bold;
color: blue;
}
</style>
<?if(isset($pager['first'])){?>
<a href="test.php?page=<?=$pager['first']?>">«</a>
<?}?>
<?foreach($pager['current'] as $p){?>
<a <?if($p == $current) echo "class='current'";?> href="test.php?page=<?=$p?>"><?=$p?></a>
<?}?>
<?if(isset($pager['last'])){?>
<a href="test.php?page=<?=$pager['last']?>">»</a>
<?}?>
|
На здоровье :) | |
|
|
|
|
|
|
|
для: Axxil
(16.11.2007 в 18:02)
| | при переходе по ссылке test.php?page=-5
не высвечивается номер текущей страницы ))
так-же ?page=45676545
скрипт наверное будет пытаться их открыть если в пример использования не добавить чего-нибудь ) | |
|
|
|
|
|
|
|
для: exp
(16.11.2007 в 18:36)
| | ну так на то он и пример использования :)
дальше уже полёт фантазии | |
|
|
|
|
|
|
|
для: Axxil
(16.11.2007 в 22:47)
| | Просто что-то. Не пробовали что-нибудь типа навигации яндекса написать - намного удобнее | |
|
|
|
|
|
|
|
для: mihdan
(18.11.2007 в 23:30)
| | Так это и есть в стиле яндекса :)
просто перемотки на N страниц вперёд-назад нет. Сразу переходы к первой и последней странице.
Мне кажется перемотка на N страниц избыточна. Обычно люди листают страницы подряд и мало кто пользуется переходом на 10 страниц вперёд.
Но при желании перемотку в этот код можно добавить за пару минут.
PS а усложнять в этом деле ничего и не надо. Из-за запутанных объяснений (когда мешают постраничный вывод из базы и построение блока навигации) у начинающих создаётся впечатление что постраничная навигация это что-то запредельно сложное. | |
|
|
|
|
|
|
|
для: Axxil
(19.11.2007 в 12:38)
| | Я раньше тож думал что перемотка не нужна пока сам не начал ее юзать. А то что сделать за пару минут - вы правы. Молодец что выложил - мож пригодиться кому-то | |
|
|
|