Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Stronnicowanie i zgrabne linkowanie
Forum PHP.pl > Forum > PHP
stein
Witam mam taki skrypt ktory stronnicuje księge gości dziala poprawnie i chcialbym go troche zmodyfikować w zwązku z tym proszę o pomoc, skrypt stronicuje wyswietlane rekordy do 10 po czym tworzy kolejną stronę itd. natomiast na dole tworzy linki do tych kolejnych stron czyli np 1,2,3,4,5,6 i tak bez konca będzie 100 stron to stworzy 100 linkow moje pytanie jak to przerobić tak aby pokazywal tylko 10 linkow i ostatni tak by wyświetlane byly tylko od 1 do 10 lub od 1 do 15 i ostatni oraz link do pierwszego linku, nadmieniam ze w tym skrypcie jest tez link do strony poprzedniej i następnej. Co zmienic w tym skrypcie proszę o pomoc?

  1. <?php
  2. require_once ('../gornik_connect.php');
  3.  
  4. $display = 10;
  5.  
  6. // Wyznacza liczbę stron.
  7. if (isset($_GET['np'])) { // Liczba stron już ustalona.
  8.  
  9. $num_pages = $_GET['np'];
  10.  
  11. } else { // Trzeba ją dopiero określić.
  12.  
  13. // Zlicz rekordy
  14. $query = "SELECT COUNT(*) FROM ksiega ORDER BY data ASC";
  15. $result = mysql_query ($query);
  16. $row = mysql_fetch_array ($result, MYSQL_NUM);
  17. $num_records = $row[0];
  18.  
  19. // Wyznacz liczbę stron.
  20. if ($num_records > $display) { // Więcej niż 1 strona.
  21. $num_pages = ceil ($num_records/$display);
  22. } else {
  23. $num_pages = 1;
  24. }
  25.  
  26. } // Koniec instrukcji warunkowej dla zmiennej np.
  27.  
  28. // Określ punkt początkowy wyników w bazie.
  29. if (isset($_GET['s'])) {
  30. $start = $_GET['s'];
  31. } else {
  32. $start = 0;
  33. }
  34.  
  35. tu pobieram dane z bazy itd. $query = "SELECT * FROM ksiega ORDER BY data DESC LIMIT $start, $display";
  36. a potem
  37.  
  38. if ($num_pages > 1) {
  39.  
  40. echo '<br /><p>';
  41. // Określ bieżącą stronę.
  42. $current_page = ($start/$display) + 1;
  43.  
  44. // Jeśli to nie jest pierwsza strona, utwórz łącze do poprzedniej.
  45. if ($current_page != 1) {
  46. echo '<a href="ksiega.php?s=' . ($start - $display) . '&np=' . $num_pages . '">Poprzednia</a> ';
  47. }
  48.  
  49. // Łącza do pozostałych stron.
  50. for ($i = 1; $i <= $num_pages; $i++) {
  51. if ($i != $current_page) {
  52. echo '<a href="ksiega.php?s=' . (($display * ($i - 1))) . '&np=' . $num_pages . '">' . $i . '</a> ';
  53. } else {
  54. echo $i . ' ';
  55. }
  56. }
  57.  
  58. // Jeśli to nie jest ostatnia strona, utwórz łącze do następnej.
  59. if ($current_page != $num_pages) {
  60. echo '<a href="ksiega.php?s=' . ($start + $display) . '&np=' . $num_pages . '">Następna</a>';
  61. }
  62.  
  63. echo '</p>';
  64.  
  65. } // Koniec sekcji łącz.
  66. ?>


Miało być, żeby wyświetlało linki od 1 do 10 lub od 5 do 15 czy tez od 30 do 40 itd.
Pilsener
Użyj np. takiej prostej funkcji:

  1. function tresc_pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$a) { //funkcja tworz�ca nawigacj�
  2. $l_odp_podz = intval($l_odp/$l_odp_nastronie)+1;
  3. $l_odp_podz_mod = $l_odp%$l_odp_nastronie;
  4. if($l_odp_podz_mod>0){++$l_odp_podz;}
  5. if($a>=$l_odp_podz){$a=$l_odp_podz-1;}
  6. if($a>1){$tablica['prev']=$a-1;}else {$tablica['prev']=0;}
  7. if($a<=$l_odp_napasku){$koniec=$l_odp_napasku*2+2;}else{$koniec=$a+$l_odp_napasku+1;}
  8. if($a<=$koniec-$l_odp_napasku){$star=$a-$l_odp_napasku;}
  9. if($a>=$l_odp_podz-$l_odp_napasku){$star=$l_odp_podz-$l_odp_napasku*2-1;}
  10. if($koniec>$l_odp_podz){$koniec=$l_odp_podz;}
  11. if($star<1){$star=1;}
  12. for($i=$star;$i<$koniec;++$i){
  13. if($i<$a){$tablica[]=$i;}
  14. if($i==$a){$tablica['active'] = $i;}
  15. if($i>$a){$tablica[]=$i;}
  16. }
  17. if($a<$l_odp_podz-1){$tablica['next']=$a+1;}else{$tablica['next']=0;}
  18. return $tablica;
  19. }


Funkcję tą znalazłem na tym forum i trochę ulepszyłem. Użycie jest proste, wystarczy nakarmić funkcję argumentami:
- l_odp - ilość rekordów
- l_odp_nastronie - ilość rekordów na jedną stronę
- l_odp_napasku - rozmiar paska nawigacyjnego (a konkretnie liczba linków z każdej strony bieżącego numeru)
- a - numer bieżącej strony

Funkcja zwraca posortowaną tablicę stron z zaznaczeniem aktywnej, poprzedniej oraz następnej. Wystarczy połączyć z kodem HTML i użyć.

Edit: napisałem prostej, po co do tego nie wiadomo jak wychuchana klasa? Gdy używam frameworków to korzystam z takich klas, ale tutaj nie warto dorabiać całej ideologii i dyskutować o tym, czy kod jest syfiasty i czy zawiera błędy lub o rozwoju jego (bo to ma być prosty helper i taka debata nie ma sensu), nie pisze się kodu po to, by ładnie wyglądał czy był słuszny ideologicznie.
thek
Na forum jest kilka takich kodów. Ogólnie można powiedzieć tak, że musisz zrobić zmienną odpowiedzialną za "szerokość", czy też "promień zasięgu".
Całość dotychczasowego kodu ujmujesz w pętli for, która zaczyna się od aktualna-promień i leci do aktualna+promień. Dodatkowo robisz sprawdzenie. Jeśli aktualny krok pętli ($i czy inny) jest mniejszy niż pierwsza strona, dajesz continue (to puste przebiegi, ale musimy dojść do pierwszej strony). Jeśli jest większy niż ostatnia, możesz zakończyć pętlę (bo to będą tylko puste przebiegi, które i tak nic nie zmienią).
kilas88
Cytat(Pilsener @ 28.07.2010, 09:07:19 ) *
Użyj np. takiej prostej funkcji:

  1. function tresc_pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$a) { //funkcja tworz�ca nawigacj�
  2. $l_odp_podz = intval($l_odp/$l_odp_nastronie)+1;
  3. $l_odp_podz_mod = $l_odp%$l_odp_nastronie;
  4. if($l_odp_podz_mod>0){++$l_odp_podz;}
  5. if($a>=$l_odp_podz){$a=$l_odp_podz-1;}
  6. if($a>1){$tablica['prev']=$a-1;}else {$tablica['prev']=0;}
  7. if($a<=$l_odp_napasku){$koniec=$l_odp_napasku*2+2;}else{$koniec=$a+$l_odp_napasku+1;}
  8. if($a<=$koniec-$l_odp_napasku){$star=$a-$l_odp_napasku;}
  9. if($a>=$l_odp_podz-$l_odp_napasku){$star=$l_odp_podz-$l_odp_napasku*2-1;}
  10. if($koniec>$l_odp_podz){$koniec=$l_odp_podz;}
  11. if($star<1){$star=1;}
  12. for($i=$star;$i<$koniec;++$i){
  13. if($i<$a){$tablica[]=$i;}
  14. if($i==$a){$tablica['active'] = $i;}
  15. if($i>$a){$tablica[]=$i;}
  16. }
  17. if($a<$l_odp_podz-1){$tablica['next']=$a+1;}else{$tablica['next']=0;}
  18. return $tablica;
  19. }


Funkcję tą znalazłem na tym forum i trochę ulepszyłem. Użycie jest proste, wystarczy nakarmić funkcję argumentami:
- l_odp - ilość rekordów
- l_odp_nastronie - ilość rekordów na jedną stronę
- l_odp_napasku - rozmiar paska nawigacyjnego (a konkretnie liczba linków z każdej strony bieżącego numeru)
- a - numer bieżącej strony

Funkcja zwraca posortowaną tablicę stron z zaznaczeniem aktywnej, poprzedniej oraz następnej. Wystarczy połączyć z kodem HTML i użyć.

Wstydziłbym się na publikacje i podpisywanie się pod takim brzydkim, wręcz syfiastym kodem. Powodzenia przy znajdywaniu błędów w przyszłości, lub co gorsza dalszym rozwoju tego potworka.

Do stronicowania w sieci jest mnóstwo gotowych klas, których użycie i konfiguracja jest banalnie prosta. Zamiast więc ponownie wynajdywać koło (kanciaste w dodatku biggrin.gif) polecam posłużyć się Google. Przykładowo: pager.
thek
  1. function pagination( $actual, $all, $path = '?page=', $suff='', $per_page = 10, $width = 3 ) {
  2. $code = '';
  3. if( $path === null ) {
  4. $path = '?page=';
  5. }
  6. if( $suff === null ) {
  7. $suff = '';
  8. }
  9. $pages = ceil( $all/$per_page );
  10. if( $pages > 1 ) {
  11. $code .= '<div id="pagination"><ul>';
  12. if( $actual > 1 ) {
  13. $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>';
  14. } else {
  15. $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>';
  16. }
  17. for( $i=$actual-$width; $i<=$actual+$width; $i++ ) {
  18. if( $i<1 ) {
  19. continue;
  20. } elseif( $i>$pages ) {
  21. break;
  22. } elseif( $i == $actual ) {
  23. $code .= '<li class="num"><a class="active" href="">'.$i.'</a></li>';
  24. } else
  25. $code .= '<li class="num"><a href="'.$path.$i.$suff.'">'.$i.'</a></li>';
  26. }
  27. if( $actual < $pages ) {
  28. $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>';
  29. } else {
  30. $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>';
  31. }
  32. $code .= '</ul></div>';
  33. }
  34. return $code;
  35. };
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:
  1. div#pagination {width:230px; margin:0 auto; padding-top:20px;}
  2. div#pagination ul { list-style-type:none;}
  3. div#pagination li {float:left; display:block;}
  4. div#pagination span {display:none}
  5. div#pagination li.num {margin-left:3px;}
  6. div#pagination li.pgn1st {margin-right:1px;}
  7. div#pagination li.pgnprev {margin-right:5px;}
  8. div#pagination li.pgnnext {margin-left:8px;}
  9. div#pagination li.pgnlast {margin-left:1px;}
  10. 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;}
  11. div#pagination a.active {background:url(pagin/paginsctive.gif) no-repeat;}
  12. div#pagination a#paginfirst {background:url(pagin/pagin1st.gif) no-repeat;}
  13. div#pagination a#paginfirstnone {background:url(pagin/pagin1stnone.gif) no-repeat;}
  14. div#pagination a#paginprev {background:url(pagin/paginprev.gif) no-repeat;}
  15. div#pagination a#paginprevnone {background:url(pagin/paginprevnone.gif) no-repeat;}
  16. div#pagination a#paginnext {background:url(pagin/paginnext.gif) no-repeat;}
  17. div#pagination a#paginnextnone {background:url(pagin/paginnextnone.gif) no-repeat;}
  18. div#pagination a#paginlast {background:url(pagin/paginlast.gif) no-repeat;}
  19. 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.
stein
Dzięki za funkcje, chodź bardziej wolalbym pomoc z zmodyfikowaniem mojego kodu z początku tymniemniej funkcje są pomocne.
piotr94
polecam taki skrypcik:
http://karaboz.ru/2007/11/19/paginator-300...shhego/#more-12
thek
Stein... A po co potem na każdej stronie z paginacją pisać ten sam kod?
Czy nie prościej zrobić:
  1. echo pagination( $start, $num_records, 'ksiega.php?s=', '', $display, 3 );
? I masz cały kod bez chrzanienia się z kopiuj-wklej, dopasuj do nowej strony smile.gif Sam popatrz.... Jedna linijka kontra kilkadziesiąt. Tylko ewentualnie sobie dopasuj czy skrypt ma za pierwszą stronę uznawać s=0, czy s=1. U mnie kod to drugie robi, więc jeśli ma być jak to pierwsze, to funkcje musisz minimalnie w kilku miejscach zmienić, by działała jak chcesz. To kwestia zmiany polegającej na odjęciu 1 w kilku miejscach lub wpisaniu 0 smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.