<?php
/*
* Funkcja oparta o phpBB, tworzy liste stron na podstawie parametrow
* - $base_url - URL
* - $num_items - liczba pozycji
* - $per_page - ilosc pozycji na strone
* - $start_item - pozycja poczatkowa
* - $style - nazwa klasy css dla nawigacji
* - $styleactiv - nazwa klasy dla aktywnej strony
* - $span - nazwa klasy dla separatora '..'
* - $add_prevnext_text - czy wyswietlać etykiety nastepny, poprzedni (TODO: obsluga tegoz parametru)
* - autor: nieznany, poprawki: djkrc dla forum.php.pl
*/
function pagination($base_url, $num_items, $per_page, $start, $style, $styleactive, $span, $add_prevnext_text = true)
{
$start_item = $start * $per_page; // mnożymy stronę
$seperator = '';
$total_pages = ceil($num_items/$per_page); // ilość stron
$amp = strpos($base_url, '?') !== false ?
'?' : '&'; // czy łączyć "?" czy "&" //w przypadku mod rewrite, np. tak jak u mnie, gatunek.php?gat=xxx&str=1 zapisane jest gatunek,xxx,1 - jeżeli jako znak separujący stosujemy ukośnik lub inny znak, podmienić przecinek
//$amp = strpos($base_url, ',') !== false ? ',' : ','; //jeśli korzystamy z mod rewrite zamienić na inny znak separujący jak w linku, np. / lub ,
if ($total_pages == 1 || !$num_items) // ilość elementów = 1?
{
if ($start_item % $per_page == 0)
{
return '<span class="'.$styleactive.'">1</apan>'; // 1 strona bez linka
}
else
{
return ($add_prevnext_text? '<a class="'.$style.'" href="'. $base_url . $amp . '0"><<</a>' . $seperator:'') . '<span class="pagenav">1</span>'; // 1 strona z linkiem do poczatku (<<)- zaczeto nierówno z iloscia postow na strone (1 user ma 10/str, inny ma 15 i daje linka temu pierwszemu)
}
}
$on_page = floor($start_item / $per_page); // ilosc na strone $page_string = ($add_prevnext_text && $on_page!=1
|| $start_item % $per_page != 0) ?
'<a class="'.$style.'" href="'. $base_url . $amp . '' . max(0
,($on_page-1)). '"><<</a>'.$seperator : ''; // poczatkowy << (o ile jestesmy dalej niz na 1 stronie)
if ($total_pages>10) // wiecej niz 10 stron
{
for($i = 1; $i <= 3; $i++) // poczatkowe 3 strony wyswietlane zawsze
{
$page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i. '">' . $i . '</a>';
$page_string .= $seperator;
}
$start1=max(4
,floor($on_page/2
)-1
); // ustalenie poczatku i konca 2 czesci ( 3 ... [tutaj] ... srodek ... ... koniec)
$start2=max($end1+1
,min($total_pages-6
,max(2
,$on_page-2
))); // ustalenie poczatku i konca 3 czesci ( 3 ... ... ... [tutaj] ... ... koniec) $end2=max(2
,min($total_pages-3
,$on_page+2
));
$start3=max($end2+1
,min($total_pages-3
,floor($on_page+($total_pages-$on_page)/2
)-2
)); // ustalenie poczatku i konca 4 czesci ( 3 ... ... ... ... ... [tutaj] ... koniec) $end3=min($total_pages-3
,max(4
,floor($on_page+($total_pages-$on_page)/2
)));
if ($start1>4)
{
$page_string .= '<span class="'.$span.'">..</span>' . $seperator; // jesli 2 czesc sie zaczyna dalej niz na 4 stronie
}
if ($start2>=$end1) // jesli 2 czesc w ogole istnieje
for($i = $start1; $i <= $end1; $i++)
{
$page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
$page_string .= $seperator;
}
if ($start2-$end1>1) // jesli 2 czesc jest przynajmniej o 1 odlegla od nastepnej
{
$page_string .= '<span class="'.$span.'">..</span>' . $seperator;
}
for($i = $start2; $i <= $end2; $i++) // srodkowa czesc
{
$page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
$page_string .= $seperator;
}
if ($start3-$end2>1) // jesli 4 czesc jest przynajmniej o 1 odlegla od nastepnej
{
$page_string .= '<span class="'.$span.'">..</span>' . $seperator;
}
for($i = $start3; $i <= $end3; $i++) // 4 czesc
{
$page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
$page_string .= $seperator;
}
if ($end2<$total_pages-3) // jesli ostatnia czesc jest konczy sie na wiecej niz 3 strony od konca
{
$page_string .= '<span class="'.$span.'">..</span>' . $seperator;
}
for($i = $total_pages-2; $i <= $total_pages; $i++) // koncowe strony
{
$page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
if ($i < $total_pages)
{
$page_string .= $seperator;
}
}
}
else // mniej niz 10 sttron - wyswietlamy cala liste
{
for($i = 1; $i <= $total_pages; $i++)
{
$page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
if ($i < $total_pages)
{
$page_string .= $seperator;
}
}
} // dodanie koncowej >>, jesli nie jestesmy na ostatniej stronie
$page_string .= ($on_page == $total_pages || !$add_prevnext_text) ?'': $seperator.'<a class="'.$style.'" href="'. $base_url . $amp . ''.($on_page + 1) . '">>></a>';
return $page_string;
}
/*
//wywołanie paginacji, w każdym pliku osobno gdzie chcemy ją uruchomic wstawiamy:
//przyłączam plik
include "includes/pagination.php";
//przypisujemy 10 plików na stronę
$nastrone = 10;
//w moim przypadku 'download', podkategorie oddzielane przecinkami, strona na końcu np. 'download,1'
//bez mod rewrite będzie 'download.php' i odpowiednio 'download.php?str=1'
$page = 'download'; // tu podać adres który ma znaleźć się w paginacji
if(isset($_GET['str'])){
$str = $_GET['str'];
}else{
$str = 1;
}
//poniższe działanie zapewni prawidłowe wywołanie z bazy
//strona nie ma wartości zero, więc by wywołać prawidłowo rekordy z bazy
//należy zawsze odejmować 1
//np. gdy strona 1 i 10 rekordów na stronę to: 1*10=10,
//na stronie pierwszej musimy zacząć od zera, więc prawidłowo
//strona 1 i 10 rekordów czyli: (1-1)*10=0
//strona 2 czyli start od 10: (2-1)*10=10
//dzięki temu nie tracimy dostępu do 10 najnowszych rekordów lecz zaczynamy zawsze od początku
$start = ($str - 1) * $nastrone;
$ile = 100; //tutaj podajemy wartość całkowitej liczby obliczonych rekordów przed podziałem na strony
//wyświetlamy paginację i przypisujemy jej 10 plików na strone czyli w przypadku 100 plików 10 stron
echo pagination($page, $ile, $nastrone, $str, 'pagenav', 'pagenavactive', 'span');
//paginacja działa na stronach z mod rewrite i bez, korzystam z niej też przy wyszukiwarce
*/
?>