Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Stronnicowanie i zgrabne linkowanie, ograniczyć linki
stein
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 5.10.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Pilsener 28.07.2010, 14:59:27
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą).
Go to the top of the page
+Quote Post
kilas88
post
Post #4





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/biggrin.gif) ) polecam posłużyć się Google. Przykładowo: pager.
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




  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.
Go to the top of the page
+Quote Post
stein
post
Post #6





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 5.10.2006

Ostrzeżenie: (0%)
-----


Dzięki za funkcje, chodź bardziej wolalbym pomoc z zmodyfikowaniem mojego kodu z początku tymniemniej funkcje są pomocne.
Go to the top of the page
+Quote Post
piotr94
post
Post #7





Grupa: Zarejestrowani
Postów: 331
Pomógł: 30
Dołączył: 11.11.2008
Skąd: Kraków

Ostrzeżenie: (0%)
-----


polecam taki skrypcik:
http://karaboz.ru/2007/11/19/paginator-300...shhego/#more-12
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 12:48