Oto masz gotowy [napisany przeze mnie] skrypt, który służy do tego celu. Zapewniam, że ZAWSZE działa, przy czym, jak linków jest za dużo, wyświetla tylko końcowy, początkowy, oraz linki wokół tego, który jest aktualnie wyświetlany.
Kod
function x($link, $num, $page){
if(strpos($link, "?") == 0){
return " <a href="".$link."?from=".$num."">".$page."</a> ";
}else{
return " <a href="".$link."&from=".$num."">".$page."</a> ";
}
}
function GetPagesCount($options, $per_page){
$mod = $options % $per_page;
$a = $options - $mod;
$b = $a / $per_page;
if($mod > 0){
$c = 1;
}else{
$c = 0;
}
return $b + $c;
}
function StartLastPage($options, $per_page){
$mod = $options % $per_page;
$a = $options - $mod;
$b = $a / $per_page;
if($mod > 0){
return $a + 1;
}else{
return $a - ($per_page-1);
}
}
function MakePages($options, $per_page, $active, $link){
$mod = $options % $per_page;
$a = $options - $mod;
$b = $a / $per_page;
if($mod > 0){
$c = 1;
}else{
$c = 0;
}
$rt[0] = $b + $c;
if($b+$c > 5){
$b = $b-1;
$links = x($link, 1, 1);
if($active > 3){
$links .= "... ";
$links .= x($link, $per_page*($active-1), $active-1);
$links .= x($link, $per_page*$active, $active);
if($active < $b + $c){
$links .= x($link, $per_page*(1+$active), $active+1);
}
}else{
$links .= x($link, $per_page, 2);
$links .= x($link, $per_page*2, 3);
$links .= x($link, $per_page*3, 4);
}
if($active < $b + $c-1){
$links .= "... ";
$links .= x($link, $per_page * ($b + $c), $b + $c);
}
}else{
for($i = 1; $i <= $b+$c; $i++){
$link_num = $per_page*($i-1);
if($i == 1){
$link_num++;
}else{
$link_num++;
}
$links .= x($link, $link_num, $i);
}
}
$rt[1] = $links;
return $rt;
}
Funkcja X jest wewnętrzną funkcją, lecz umieściłem ją na zewnątrz, bo w przeciwnym wypadku, gdy 2 razy wywołałeś tę funkcję, to wywalało błąd.
Pozostałe funkcje:
GetPagesCount - wylicza, ile jest stron wyników. Jako pierwszy parametr podajesz ilość wyników, a jako drugi ilość wyników na stronę.
StartLastPage - Podaje numer pierwszego wyniku na ostatniej stronie. Parametry te same.
MakePages - Przygotowuje listę stron wyników. Jako parametry pobiera kolejno: options - Ilość wyników; per_page - ilość wyników na stronę; active - nie pamiętam dokładnie, ale najprawdopodobniej oznacza to aktualna stronę. Jeśli nie, to pierwszy wynik na danej stronie; link - Wygląd linka, do którego ma prowadzić każda strona. Jeśli np podamy "index.php?action=show", to zostanie do niego dołączony parametr from=numer_pozycji_od_ktorego_ma_zaczac_wyswietlac_aktualna_strone.
I jeszcze: jak określić, od którego wyniku do którego ma wyświetlać wyniki (to wstawiamy do skryptu, który ma wyświetlić wyniki):
Kod
$cnt = count($tablica_wynikow);
$buf = $cnt;
if(!isset($from)){
$from = 1;
}
if($cnt > $tpp){
$limit = $cnt - $from;
if($limit > $tpp){
$limit = $tpp;
}elseif($limit < $tpp){
$limit++;
}
}else{
$limit = $cnt;
}
/* A potem wywołanie pętli FOR wyświetlającej wyniki, jeśli pierwszy element tabeli wyników ma indeks 1: */
if($cnt > 0){
// Gdy są jakieś wyniki
for($i = $from; $i <= $from+$limit-1; $i++){
// Kod wyświetlający wyniki
}
}else{
// Gdy nie ma wyników
}
Mam nadzieję, że to powinno pomóc.