Своя постраничка

149
.
lazyproger
brainhub
Вообщем решил разобратся как работает постраничка которая используется на джоне, но тк ничего не описанно, и нет комментариев, решил что проще написать свою. Вот что получилось:

/*
pagenav_a
$url - url страницы
$on_page - Количество на странице
$total - Количество данных всего
$start - №Показываемой страницы
$around - Сколько цифр показывать вокруг выбранной страницы (четное число)

pagenav_link
Используется pagenav_a
*/

function pagenav_link($url, $start, $accept){
if($accept == $start)
return '<b>'.$start.'</b> ';
else
return '<a href="'.$url.$start.'">'.$start.'</a> ';
}

function pagenav_display($url, $on_page, $total, $start, $around = 2){
//Инициализация переменных
$link = '';
$i = '';
$start = (!empty($start) ? $start : 1);
$before = 0;
$ending = 0;
$around_half = $around / 2;
$max_page = ceil($total / $on_page);
$array = array();
//Логика
//Если start больше max_page, то ставим что выбрана страница 1
if($start > $max_page){
$start = 1;
}
//Если выводимых данных на страницу, чем в вообщем, то не выводить постраничную навигацию
if(!($on_page >= $total)){
//Если страниц меньше чем 1 + округление вокруг выбранного, то вывести все страницы сразу
if($max_page < (1 + $around)){
for($i = 1; $i <= $max_page; $i++){
$link .= pagenav_link($url, $i, $start);
}
}else{
//Проверяем достает ли до начала
if(($start - $around_half) <= 1){
$before = 1;
}
//Проверяем достает ли до конца
if(($start + $around_half) >= $max_page){
$ending = 1;
}
//Если касается только начало
if($before == 1){
for($i = 1; $i <= $start + $around_half; $i++){
$link .= pagenav_link($url, $i, $start);
}
if(($start + $around_half + 1) != $max_page){
$link .= '...';
$link .= pagenav_link($url, $max_page, $start);
}else{
$link .= pagenav_link($url, $max_page, $start);
}
//Если касается только конец
}elseif($ending == 1){
if(($start - $around_half - 1) != 1){
$link .= pagenav_link($url, 1, $start);
$link .= '...';

}else{
$link .= pagenav_link($url, 1, $start);
}
for($i = $max_page - $around_half - 1; $i <= $max_page; $i++){
$link .= pagenav_link($url, $i, $start);
}
//Если цифра не касается начала и конца
}else{
if(($start - $around_half) != (1 + $around_half)){
$link .= pagenav_link($url, 1, $start);
$link .= '...';
}else{
$link .= pagenav_link($url, 1, $start);
}
for($i = $start - $around_half; $i <= $start + $around_half; $i++){
$link .= pagenav_link($url, $i, $start);
}
if(($start + $around_half) != ($max_page - $around_half)){
$link .= '...';
$link .= pagenav_link($url, $max_page, $start);
}else{
$link .= pagenav_link($url, $max_page, $start);
}
}
}
//Выводим результат
return 
'<div class="menu-navigation">'.($start == 1 ? '' : '<a href="'.$url.($start - 1).'"><<</a> ').
$link.
($start == $max_page ? '' : '<a href="'.$url.($start + 1).'">>></a>').'</div>';
}else{
return '';
}
}


Что дает? возможно будет избавится от ссылок типа start=5 можно будет использовать page=2
Есть проверка на такое http://johncms.com/guestbook/i ... e=650
Вывод ссылок все в двух местах, что позволяет легко откредактировать вывод и сделать его к примеру тач.

PS пока писал понял что на в 5 джоне перешли на page, так что start давай досвидания
PSS немного быстрее той навигации что использовалась в 4,3,2
.
Поверь в мечту!
Интересно) над будет глянуть)
.
brainhub
zumak (08.01.2013 / 03:14)
Интересно) над будет глянуть)
Посмотри) думаю этот код будет понятен чем тот что там.
Всего: 3