Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Paginacja xD
Forum PHP.pl > Forum > Przedszkole
plej
Bo chodzi o to:D że mam kod paginacji ale jak będzie np. 100stron to na dole będzie od 1-100 a to nie ładnie będzie wyglądać
i chciałbym to ograniczyć żeby tylko było widać ograniczona ilość wiem że był taki temat tu ale nie mogę znaleźć bo szukałem było tam właśnie jak ograniczyć to a więc to kod:
  1. <?php
  2. $subpage = $_GET['page'];
  3. $perPage = 15;
  4. if (!empty($_GET['subpage']) && (is_numeric($_GET['subpage'])))
  5. {
  6. $subpage = (int) $_GET['subpage'];
  7. }
  8. if ($subpage < 1)
  9. {
  10. $subpage = 1;
  11. }
  12. $start = ($subpage - 1) * $perPage;
  13. $zapytanie = 'SELECT * FROM wszystko ORDER BY id DESC LIMIT '.$start.', '.$perPage.'';
  14. $idzapytania = mysql_query($zapytanie);
  15. $max = "SELECT COUNT(*) as max FROM wszystko";
  16. $max_query = mysql_query($max);
  17. $maxrecords = mysql_fetch_array($max_query);
  18.  
  19. if(mysql_real_escape_string((!isset($_GET['id'])) or empty($_GET['id'])))
  20. {
  21.  
  22. while ($wiersz = mysql_fetch_array($idzapytania))
  23. {
  24. // zawartość strony ;p
  25. }
  26.  
  27. }
  28. $prev = $subpage - 1;
  29. $next = $subpage + 1;
  30. $prevLink = 'index.php?page='.$prev;
  31. $nextLink = 'index.php?page='.$next;
  32. $ilosc_wierszy = $maxrecords['max'];
  33. if($subpage > 1)
  34. echo'<center><a style="text-decoration: none;" href="'.$prevLink.'">Poprzednia strona </a>';
  35. $stron=ceil($ilosc_wierszy/$perPage);
  36. for($i=1; $i<=$stron; ++$i)
  37. {
  38. if($i==$subpage)
  39. echo '<b>'.$i.'</b> ';
  40. else
  41. echo '<a style="text-decoration: none;" href="index.php?page='.$i.'">'.$i.' </a>';
  42. }
  43. if($subpage < $stron)
  44. echo '<a style="text-decoration: none;" href="'.$nextLink.'"> Następna strona</a>';
  45.  
  46. ?>

Wiem że chyba trzeba warunki dopisać? nie wiem :/

z góry thx.smile.gif
peter13135
może daj po prostu listę rozwijaną tongue.gif
djkrc
Jeśli chcesz, dam Ci gotową paginację przebudowaną przeze mnie, musisz jednak poczekać, aż wrócę ze szkoły;p
Przy 100 stronach powinno wyglądać tak: 1 2 3 ... 24 25 26 ... 65 66 67 ... 98 99 100 do tego strzałki na początku i końcu, można je wyłączyć, niestety mogę podać dopiero dziś po 16
thek
Na tym forum taka forma paginacji o jakiej myślisz przewinęła się ze kilkadziesiąt razy najmniej wink.gif Naprawdę warto użyć wyszukiwarki zanim zada się pytanie.
Hpsi
Ja cie przekierunkuje tylko do jednej rzeczy:
Klasy: Pager (stronicowanie) (by nospor) - http://nospor.pl/pager.html
trudno tego nie było wyszukać, klasa gotowa dobrze działa smile.gif
plej
djkrc możesz dać:]

thek szukałem i nie znalazłem wiem ze tylko warunki chyba na koncu trzeba dopisać a nie wiem jak...

Hpsi+ nie znam jeszcze obiektowego:] czekam na książke:) a że mieszkam za granicą jeszcze to musze poczekać troche:)
thek
To Ci podpowiem jak...
Tworzysz sobie "zakres stron" z obu względem strony aktualnej... Potem tylko sprawdzasz czy $page-$zakres > 0 (lub 1 zależy odkąd startujesz) i jeśli tak to jest to Twoim początkiem, a jeśli nie to startem jest 0 (lub 1). Analogicznie dla końca. Jeśli $page+$zakres > $ilość stron to $koniec jest równy $ilość stron, a jeśli nie, to jest to wspomniana suma. Potem tylko pętla od $start do $koniec i to wszystko. Dodatkowo walisz jeszcze link do pierwszej i poprzedniej jeśli jesteś na innej stronie niż pierwsza oraz link do kolejnej i ostatniej jeśli jesteś na innej niż ostatnia. To jest cała idea stojąca za paginatorem o jakim piszesz. A skąd wiem że tak? Bo nawet na tym forum kilka razy dalem kod gotowy tego i zwyczajnie nie mam ochoty po raz kolejny tego pisać wink.gif
djkrc
W razie problemów pisać, opisałem wszystko jak umiałem, na końcu masz instrukcję jak uruchamiać ;p

  1. <?php
  2. /*
  3.   * Funkcja oparta o phpBB, tworzy liste stron na podstawie parametrow
  4.   * - $base_url - URL
  5.   * - $num_items - liczba pozycji
  6.   * - $per_page - ilosc pozycji na strone
  7.   * - $start_item - pozycja poczatkowa
  8.   * - $style - nazwa klasy css dla nawigacji
  9.   * - $styleactiv - nazwa klasy dla aktywnej strony
  10.   * - $span - nazwa klasy dla separatora '..'
  11.   * - $add_prevnext_text - czy wyswietlać etykiety nastepny, poprzedni (TODO: obsluga tegoz parametru)
  12.   * - autor: nieznany, poprawki: djkrc dla forum.php.pl
  13. */
  14. function pagination($base_url, $num_items, $per_page, $start, $style, $styleactive, $span, $add_prevnext_text = true)
  15. {
  16. $start_item = $start * $per_page; // mnożymy stronę
  17.  
  18. $seperator = '';
  19.  
  20. $total_pages = ceil($num_items/$per_page); // ilość stron
  21.  
  22. $amp = strpos($base_url, '?') !== false ? '?' : '&'; // czy łączyć "?" czy "&"
  23. //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
  24. //$amp = strpos($base_url, ',') !== false ? ',' : ','; //jeśli korzystamy z mod rewrite zamienić na inny znak separujący jak w linku, np. / lub ,
  25.  
  26. if ($total_pages == 1 || !$num_items) // ilość elementów = 1?
  27. {
  28. if ($start_item % $per_page == 0)
  29. {
  30. return '<span class="'.$styleactive.'">1</apan>'; // 1 strona bez linka
  31. }
  32. else
  33. {
  34. 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)
  35. }
  36. }
  37.  
  38. $on_page = floor($start_item / $per_page); // ilosc na strone
  39. $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)
  40.  
  41. if ($total_pages>10) // wiecej niz 10 stron
  42. {
  43. for($i = 1; $i <= 3; $i++) // poczatkowe 3 strony wyswietlane zawsze
  44. {
  45. $page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i. '">' . $i . '</a>';
  46. $page_string .= $seperator;
  47. }
  48.  
  49. $start1=max(4,floor($on_page/2)-1); // ustalenie poczatku i konca 2 czesci ( 3 ... [tutaj] ... srodek ... ... koniec)
  50. $end1=max(4,min($total_pages-3,floor($on_page/2)+1));
  51.  
  52. $start2=max($end1+1,min($total_pages-6,max(2,$on_page-2))); // ustalenie poczatku i konca 3 czesci ( 3 ... ... ... [tutaj] ... ... koniec)
  53. $end2=max(2,min($total_pages-3,$on_page+2));
  54.  
  55. $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)
  56. $end3=min($total_pages-3,max(4,floor($on_page+($total_pages-$on_page)/2)));
  57.  
  58. if ($start1>4)
  59. {
  60. $page_string .= '<span class="'.$span.'">..</span>' . $seperator; // jesli 2 czesc sie zaczyna dalej niz na 4 stronie
  61. }
  62. if ($start2>=$end1) // jesli 2 czesc w ogole istnieje
  63. for($i = $start1; $i <= $end1; $i++)
  64. {
  65. $page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
  66. $page_string .= $seperator;
  67. }
  68. if ($start2-$end1>1) // jesli 2 czesc jest przynajmniej o 1 odlegla od nastepnej
  69. {
  70. $page_string .= '<span class="'.$span.'">..</span>' . $seperator;
  71. }
  72. for($i = $start2; $i <= $end2; $i++) // srodkowa czesc
  73. {
  74. $page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
  75. $page_string .= $seperator;
  76. }
  77.  
  78. if ($start3-$end2>1) // jesli 4 czesc jest przynajmniej o 1 odlegla od nastepnej
  79. {
  80. $page_string .= '<span class="'.$span.'">..</span>' . $seperator;
  81. }
  82. for($i = $start3; $i <= $end3; $i++) // 4 czesc
  83. {
  84. $page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
  85. $page_string .= $seperator;
  86. }
  87.  
  88. if ($end2<$total_pages-3) // jesli ostatnia czesc jest konczy sie na wiecej niz 3 strony od konca
  89. {
  90. $page_string .= '<span class="'.$span.'">..</span>' . $seperator;
  91. }
  92.  
  93. for($i = $total_pages-2; $i <= $total_pages; $i++) // koncowe strony
  94. {
  95. $page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
  96. if ($i < $total_pages)
  97. {
  98. $page_string .= $seperator;
  99. }
  100. }
  101. }
  102. else // mniej niz 10 sttron - wyswietlamy cala liste
  103. {
  104. for($i = 1; $i <= $total_pages; $i++)
  105. {
  106. $page_string .= ($i == $on_page) ? '<span class="'.$styleactive.'">' . $i . '</span>' : '<a class="'.$style.'" href="' . $base_url . $amp . "" . $i . '">' . $i . '</a>';
  107. if ($i < $total_pages)
  108. {
  109. $page_string .= $seperator;
  110. }
  111. }
  112. } // dodanie koncowej >>, jesli nie jestesmy na ostatniej stronie
  113. $page_string .= ($on_page == $total_pages || !$add_prevnext_text) ?'': $seperator.'<a class="'.$style.'" href="'. $base_url . $amp . ''.($on_page + 1) . '">>></a>';
  114.  
  115. return $page_string;
  116. }
  117. /*
  118. //wywołanie paginacji, w każdym pliku osobno gdzie chcemy ją uruchomic wstawiamy:
  119. //przyłączam plik
  120. include "includes/pagination.php";
  121. //przypisujemy 10 plików na stronę
  122. $nastrone = 10;
  123. //w moim przypadku 'download', podkategorie oddzielane przecinkami, strona na końcu np. 'download,1'
  124. //bez mod rewrite będzie 'download.php' i odpowiednio 'download.php?str=1'
  125. $page = 'download'; // tu podać adres który ma znaleźć się w paginacji
  126.  
  127. if(isset($_GET['str'])){
  128. $str = $_GET['str'];
  129. }else{
  130. $str = 1;
  131. }
  132. //poniższe działanie zapewni prawidłowe wywołanie z bazy
  133. //strona nie ma wartości zero, więc by wywołać prawidłowo rekordy z bazy
  134. //należy zawsze odejmować 1
  135. //np. gdy strona 1 i 10 rekordów na stronę to: 1*10=10,
  136. //na stronie pierwszej musimy zacząć od zera, więc prawidłowo
  137. //strona 1 i 10 rekordów czyli: (1-1)*10=0
  138. //strona 2 czyli start od 10: (2-1)*10=10
  139. //dzięki temu nie tracimy dostępu do 10 najnowszych rekordów lecz zaczynamy zawsze od początku
  140. $start = ($str - 1) * $nastrone;
  141. $ile = 100; //tutaj podajemy wartość całkowitej liczby obliczonych rekordów przed podziałem na strony
  142. //wyświetlamy paginację i przypisujemy jej 10 plików na strone czyli w przypadku 100 plików 10 stron
  143. echo pagination($page, $ile, $nastrone, $str, 'pagenav', 'pagenavactive', 'span');
  144. //paginacja działa na stronach z mod rewrite i bez, korzystam z niej też przy wyszukiwarce
  145. */
  146. ?>


przy 122 stronach wygląda to tak:





thek
Ale zamotali...
Aby ominąć cyrki z mod_rewrite jako parametr podaj... wzorzec linka, który potem tylko podmienisz przy uzyciu str_replace choćby:
function paginacja( $all, $page = 0, $num_per_pages = 10, $side = 5, $pattern = '?page=[page_number]')
A czemu tak? Bo poza liczbą wszystkich pozycji, każda inna wartość jest opcjonalna tak naprawdę wink.gif Pierwsza strona - niepotrzebne $page. 10 wyników na stronę? Niepotrzebne $num_per_pages smile.gif Domyślnie po 5 stron z obu stron od aktywnej obecnie. A wzorzec domyślny dla większości przypadków stron bez mod rewrite to
?page=[numer_strony], gdzie [numer_strony] będziemy sobie w locie zamieniali na konkretną wartość. Jedynie sobie do całości zdefiniujemy jakieś klasy ładnie, bo kod jaki w teorii powinno generować się powinien mieć postać choćby dla strony 3 na 10:
  1. <ul class="pagination">
  2. <li><a href='?page=1'>Pierwsza</a></li>
  3. <li><a href='?page=2'>Poprzednia</li>
  4. <li><a href='?page=1'>1</li>
  5. <li><a href='?page=2'>2</li>
  6. <li><a href='' class="chosen">3</li>
  7. <li><a href='?page=4'>4</li>
  8. <li><a href='?page=5'>5</li>
  9. <li><a href='?page=6'>6</li>
  10. <li><a href='?page=7'>7</li>
  11. <li><a href='?page=8'>8</li>
  12. <li><a href='?page=4'>Następna</li>
  13. <li><a href='?page=10'>Ostatnia</li>
  14. </ul>

a więc minimum jakie powinieneś posiadać w CSS to
  1. ul.pagination {}
  2. ul.pagination > li {}
  3. ul.pagination > li > a {}
  4. ul.pagination > li > a.chosen {}

Nie piszę JAK to zrobić, bo od gotowego kodu w html jaki masz wyżej ciutkę do tego w jaki sposób go stworzyć jest naprawdę odrobinka myślenia jedynie. Przynajmniej mając deklarację funkcji jaką Ci powyżej z parametrami podałem. Możesz jedynie kombinować góra z faktem w jakiej formie/stylu wyświetlać i to Ci będzie ważyło na wyniku końcowym html, ale jak wspomniałem... Na podstawie kodu wynikowego da się w miarę prosto powiedzieć jak kod ma wyglądać wewnętrznie.
djkrc
Nie ja pisałem powyższy skrypt, po prosty wprowadziłem kilka zmian, dodałem możliwość wybierania stylu css jaki ma zostać użyty przy wyświetlaniu, sam nie wiem kto ten skrypt napisał, ale działa jak najlepiej, a to, że jakiś idiota może zmienić w linku strona 122 na 1222 to już sprawa odpowiednich if'ów w kodzie strony...

zabawa z mod_rewrite jest opisana, jeśli ktoś oddziela parametry separatorem / lub jak w moim przypadku , to należy go podać,
jeśli go nie stosujemy link może wyglądać np tak: download.php?kat=1&dat=2 i skąd teraz ma wiedzieć czy na końcu ma się znaleźć & czy ?

oczywiście możemy podać we wzorcu linka cały link pobrany z adresu, oprócz hosta, i na końcu dodać nasz separator, ale to wymaga zmian w kodzie, jak ktoś chce niech się bawi, w sumie wystarczy wszędzie wywalić $amp i podawać we wzorcu, kilka małych zmian i skracamy kod, jak dla mnie kod jest ok...
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.