function pagination( $actual, $all, $path = '?page=', $suff='', $per_page = 10, $width = 3 ) {
$code = '';
if( $path === null ) {
$path = '?page=';
}
if( $suff === null ) {
$suff = '';
}
$pages = ceil( $all/$per_page ); if( $pages > 1 ) {
$code .= '<div id="pagination"><ul>';
if( $actual > 1 ) {
$code .= '<li class="pgn1st"><a id="paginfirst" href="'.$path.'1'.$suff.'"><span>Pierwsza</span></a></li><li class="pgnprev"><a id="paginprev" href="'.$path.($actual-1).$suff.'"><span>Poprzednia</span></a></li>';
} else {
$code .= '<li class="pgn1st"><a id="paginfirstnone" href="'.$path.'1'.$suff.'"><span>Pierwsza</span></a></li><li class="pgnprev"><a id="paginprevnone" href="'.$path.'1'.$suff.'"><span>Poprzednia</span></a></li>';
}
for( $i=$actual-$width; $i<=$actual+$width; $i++ ) {
if( $i<1 ) {
continue;
} elseif( $i>$pages ) {
break;
} elseif( $i == $actual ) {
$code .= '<li class="num"><a class="active" href="">'.$i.'</a></li>';
} else
$code .= '<li class="num"><a href="'.$path.$i.$suff.'">'.$i.'</a></li>';
}
if( $actual < $pages ) {
$code .= '<li class="pgnnext"><a id="paginnext" href="'.$path.($actual+1).$suff.'"><span>Następna</span></a></li><li class="pgnlast"><a id="paginlast" href="'.$path.$pages.$suff.'"><span>Ostatnia</span></a></li>';
} else {
$code .= '<li class="pgnnext"><a id="paginnextnone" href="'.$path.$pages.$suff.'"><span>Następna</span></a></li><li class="pgnlast"><a id="paginlastnone" href="'.$path.$pages.$suff.'"><span>Ostatnia</span></a></li>';
}
$code .= '</ul></div>';
}
return $code;
};
To "coś" generuje cały kod paginacji. Co za parametry?
$actual - obecna strona,
$all - wszystkie rekordy,
$path - to co w linku przed numerem strony,
$suffix - to co za numerem strony
$per_page -ilość rekordów na stronie,
$width - ilość podstron w lewo i w prawo w odniesieniu do obecnej.
$path i $suffix przydają się podczas tworzenia linków SEO-friendly. Jedyne czym można niby wzbogacić (ale można to sprawdzać jeszcze przed wywołaniem funkcji i ja tak robię) to czy ktoś nie wyskoczył w $actual z numerem strony poniżej pierwszej albo powyżej ostatniej i wtedy na pałę wpisać albo pierwszą albo ostatnią.
Jedynie musisz zadbać o definicję w CSS paru id i klas by ładnie wyglądało. Przykładowo:
div#pagination {width:230px; margin:0 auto; padding-top:20px;}
div#pagination ul { list-style-type:none;}
div#pagination li {float:left; display:block;}
div#pagination span {display:none}
div#pagination li.num {margin-left:3px;}
div#pagination li.pgn1st {margin-right:1px;}
div#pagination li.pgnprev {margin-right:5px;}
div#pagination li.pgnnext {margin-left:8px;}
div#pagination li.pgnlast {margin-left:1px;}
div#pagination a {width:16px; height:16px; text-decoration:none; background:url(pagin/paginnum.gif) no-repeat; font:bold 9px/15px Verdana, sans-serif; color:#fefefe; text-align:center; float:left; display:block;}
div#pagination a.active {background:url(pagin/paginsctive.gif) no-repeat;}
div#pagination a#paginfirst {background:url(pagin/pagin1st.gif) no-repeat;}
div#pagination a#paginfirstnone {background:url(pagin/pagin1stnone.gif) no-repeat;}
div#pagination a#paginprev {background:url(pagin/paginprev.gif) no-repeat;}
div#pagination a#paginprevnone {background:url(pagin/paginprevnone.gif) no-repeat;}
div#pagination a#paginnext {background:url(pagin/paginnext.gif) no-repeat;}
div#pagination a#paginnextnone {background:url(pagin/paginnextnone.gif) no-repeat;}
div#pagination a#paginlast {background:url(pagin/paginlast.gif) no-repeat;}
div#pagination a#paginlastnone {background:url(pagin/paginlastnone.gif) no-repeat;}
Oczywiście obrazki możesz walnąć jako CSS Sprite i masz zmniejszony pobór na transferze. Aczkolwiek można nieco wydajniej jeszcze to mi to akurat kompletnie już nie wadzi. Tyle starcza.