Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Stronicowanie
Forum PHP.pl > Forum > Przedszkole
marcin0077
Witam

Mam mały problem ze stronicowaniem. Stronicowanie pokazuje wszystkie strony (numerki) od razu a chciałbym zrobić zeby pokazywało np 15 (7 stron po lewej, 1 strona aktualna i 7 stron po prawej )

Mam taki kod:

  1. <?php
  2. if($_GET[page]>0){
  3. echo '<li><a class="nl" href="get_defual_p' . ($_GET[ 'page' ]-1) . '.html">Poprzednia strona </a></li>';}
  4.  
  5. if($_GET['page']>=($pages+10)){
  6. echo '<li><a class=\"nl" . $addClass . "\" href=/>1</a></li>... ';
  7. }
  8.  
  9. $query = $db->query_first("SELECT COUNT(*) AS activeItems FROM items WHERE isWaiting = '0'");
  10. $pages = $query["activeItems"]/$showPerPage;
  11.  
  12. for($i=0;$i<$pages;++$i) {
  13. if($_GET["page"] == $i) {
  14. $addClass = " selo";
  15. } else {
  16. $addClass = "";
  17. }
  18. echo "<li><a class=\"nl" . $addClass . "\" href=\"./get_default_p" . $i . ".html\">" . ($i+1) . "</a></li>\n";
  19. }
  20. $ii = $i-1;
  21. if($_GET['page']<=($pages-10)){
  22. echo "... <li><a class=\"nl" . $addClass . "\" href=\"./get_default_p" . $ii . ".html\">" . $i . "</a></li>\n";
  23. }
  24.  
  25.  
  26. if($_GET['page']<floor($pages-1)){
  27. echo '<li><a class="nl" href="get_defual_p' . ($_GET[ 'page' ]+1) . '.html">Następna strona </a></li>';
  28. }
  29. ?>


Czy da się coś z tym zrobić?

nie da rady?
thek
Da się... musisz określić na starcie "szerokość zakresu". Ja robię to tak, że kod obejmuję w pętlę która ma zakres <obecna_strona - promień, obecna_strona + promień >
Jeśli w pętli strona jest poniżej pierwszej lub większa niż ostatnia to robię continue smile.gif Efekt? taki winksmiley.jpg
  1. $promien = 4;
  2. $obecna = 3;
  3. $max = ceil( $wyników/$ile_na_strone );
  4. for( $i=$obecna-$promien; $i<$obecna-$promien; $i++) {
  5. if( $i < 0 || $i > $max )
  6. continue;
  7. //a tutaj normalna paginacja
  8. }
To jest oczywiście zależne od tego jak liczysz strony... Czy od 0 czy od 1 jako pierwszej, ale to już minimalnie wpływa na skrypt. Jedynie musisz odpowiednio zmodyfikować nierówności i start pętli. Popatrz na to, przeanalizuj i zastosuj. W podanym przykładzie zacznie od -1 (bo 3-4=-1), ale oleje ten krok poprzez continue smile.gif

EDIT: Można to optymalizować gdy jest ogrom stron poprzez i gdy $i przekroczy $max to zwyczajnie zrobi break co zakończy pętlę. Można sprawdzać na starcie początek ($obecna-promień) i ustawiać $i na 0 lub określoną wartość wyliczoną. To już kwestia optymalizacji. Ja podałem Ci podstawowe rozwiązanie, ktore możesz modyfikować.
marcin0077
niby rozumiem o co chodzi ale coś nie działa hmm

  1. <?php
  2.  
  3.  
  4.  
  5.  
  6. $query = $db->query_first("SELECT COUNT(*) AS activeItems FROM items WHERE isWaiting = '0'");
  7. $pages = $query["activeItems"]/$showPerPage;
  8.  
  9. $promien = 4;
  10. $obecna = 4;
  11. $max = ceil( $query["activeItems"]/$showPerPage );
  12. for( $i=$obecna-$promien; $i<$obecna-$promien; $i++) {
  13. if( $i < 0 || $i > $max )
  14. continue;
  15. for($i=0;$i<$pages;++$i) {
  16. if($_GET["page"] == $i) {
  17. $addClass = " selo";
  18. } else {
  19. $addClass = "";
  20. }
  21. echo "<li><a class=\"nl" . $addClass . "\" href=\"./get_default_p" . $i . ".html\">" . ($i+1) . "</a></li>\n";
  22. }
  23.  
  24. }
  25. ?>


strony u mnie zaczyna od 0
thek
Ech... $obecna = $_GET['page'] czy coś w ten deseń... Nie kopiuj bezmyślnie tylko dopasuj poprawnie do swojego skryptu...
marcin0077
dopasowuję już 2 godzinę to i nic ;/

  1. <?php
  2.  
  3.  
  4.  
  5.  
  6. $query = $db->query_first("SELECT COUNT(*) AS activeItems FROM items WHERE isWaiting = '0'");
  7. $pages = $query["activeItems"]/$showPerPage;
  8.  
  9. $promien = 4;
  10. $obecna = $_GET["page"];
  11. $max = ceil($pages);
  12. for( $i=$obecna-$promien; $i<$obecna-$promien; $i++) {
  13. if( $i = 0 || $i < $max )
  14. continue;
  15. for($i=0;$i<$pages;++$i) {
  16. if($_GET["page"] == $i) {
  17. $addClass = " selo";
  18. } else {
  19. $addClass = "";
  20. }
  21. echo "<li><a class=\"nl" . $addClass . "\" href=\"./get_default_p" . $i . ".html\">" . ($i+1) . "</a></li>\n";
  22. }
  23.  
  24. }
  25. ?>
thek
No tak... Opisałem problem, ale w kod wkradła się literówka... Zauważ, że w opisie problemu mam
Cytat
<obecna_strona - promień, obecna_strona + promień >

Ale w kodzie jest:
  1. for( $i=$obecna-$promien; $i<$obecna-$promien; $i++) {

a powinno być:
  1. for( $i=$obecna-$promien; $i<$obecna+$promien; $i++) {
Zwróć uwagę, że wrzuciło mi - zamiast + przy limicie górnym pętli. Stąd nigdy nie ruszała nawet pętla i nic nie wyświetlało smile.gif

Można więc powiedzieć, że skopiowałeś kod, ale nie czytałeś opisu zamiast się zastanowić ciut winksmiley.jpg Ja zaś owej literówki nie zauważyłem od razu.
marcin0077
opis czytałem z 5 razy ale nie zauważyłem że tam akurat minus jest haha.gif
kilka drobnych zmian + usunięcie starego for'a i działa smile.gif
dzięki bardzo
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.