Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem ze stronicowaniem
Forum PHP.pl > Forum > Przedszkole
lobopol
Od wczoraj męczę się nad zrobieniem prostego stronicowania. Celem moim jest wyświetlanie stron w formie:
łącznie stron = 9:
|<< poprzednia 1 2 3 4 5 następna >>| tu wybrana strona 3 link nieaktywny (nieaktywny link dla ułatwienia oznaczam pogrubieniem+podkreśleniem)
|<< poprzednia 1 2 3 4 5 6 7 8 9 następna >>| tu wybrana strona 3
|<< poprzednia 1 2 3 4 5 6 7 8 9 następna >>| tu wybrana strona 6
|<< poprzednia 1 2 3 4 5 następna >>| tu wybrana strona 1
|<< poprzednia 1 2 3 4 5 6 7 8 9 następna >>|

stron > 10
|<< poprzednia 2 3 4 5 6 7 8 9 10 11 następna >>| tu wybrana strona 6
|<< poprzednia 3 4 5 6 7 8 9 10 11 12 następna >>| tu wybrana strona 7
|<< poprzednia 5 6 7 8 9 10 11 12 13 14 następna >>| tu wybrana strona 9

stron = 15
|<< poprzednia 1 2 3 4 5 6 7 8 9 10 następna >>| tu wybrana strona 4
|<< poprzednia 3 4 5 6 7 8 9 10 11 12 następna >>| tu wybrana strona 7
|<< poprzednia 5 6 7 8 9 10 11 12 13 14 następna >>| tu wybrana strona 9
|<< poprzednia 6 7 8 9 10 11 12 13 14 15 następna >>| tu wybrana strona 14
|<< poprzednia 6 7 8 9 10 11 12 13 14 15 następna >>| tu wybrana strona 15

Wiem, że najprościej byłoby użyć klasy nospora, ale ona jest gigantyczna i jednak wolałbym rozwiązanie które łatwiej by było ogarnąć .
erix
To pokaż, jak próbujesz.
john_doe
obadaj sobie takie zapytanie

  1. $SELECT_NEWS = "SELECT SQL_CALC_FOUND_ROWS *
  2. FROM tabela
  3. LIMIT " . mysql_escape_string((int)$_GET['page']*ILOSC_WYNIKOW_NA_STRONIE).",".ILOSC_WYNIKOW_NA_STRONIE;


potem na stronie

  1.  
  2. define('ILOSC_WYNIKOW_NA_STRONIE', 4);
  3.  
  4. $resultPager = connect( $SELECT_COUNT_ROWS ); // łączysz się i pytasz bazę ile zwraca wyników zapytanie które wykonujesz
  5.  
  6. $returnedRecords = mysql_result( $resultPager, 0 );
  7.  
  8. if( $_GET['page'] > 0 )
  9. {
  10. //print previous page link
  11. print '<a href="?page='.( $_GET['page'] - 1 ).'">Poprzednia</a> ';
  12. }
  13.  
  14. for( $i = 0 ; $i < ceil( $returnedRecords / ILOSC_WYNIKOW_NA_STRONIE ) ; $i++ )
  15. {
  16. if( $i == $_GET['page'] )
  17. {
  18. print '<a href="?page='.( $i ).'"><b>[ '.( $i + 1 ).' ]</b></a> ';
  19. }else print '<a href="?page='.( $i ).'">[ '.( $i + 1 ).' ]</a> ';
  20. }
  21. //if we aren`t on the last page
  22. if( $_GET['page'] + 1 < ceil( ( $returnedRecords / ILOSC_WYNIKOW_NA_STRONIE ) ) )
  23. {
  24. //print next page link
  25. print '<a href="?page='.( $_GET['page'] + 1 ).'">Następna</a>';
  26. }
  27.  


powinno Ci to pomóc. 100% działa
lobopol
Niezbyt oto mi chodziło, ale już prawie sobie poradziłem, strukturalnie już stworzyłem teraz staram się ładną klasę z tego zrobić.
thek
Tak na baaaardzo szybko smile.gif Używam z powodzeniem w wielu projektach z małymi modyfikacjami tyczącymi SEO-friendly url. I jedna uwaga... Ja mam zrobione t tak, że strona pierwsza to 1, nie jak zazwyczaj 0 smile.gif Tak by user nawet wpisując z palca mi numery stron miał to logiczne a więc strona pierwsza to 1, druga to 2 a nie, że pierwsza to 0, a druga to 1. oczywiście pominąłem kompletnie tutaj zabezpieczenie przed wpisaniem numeru większego niż $pages oraz mniejszego niż 1. Sam obczaj co zrobić winksmiley.jpg To tylko prosty if smile.gif
  1. $sql = 'SELECT SQL_CALC_FOUND_ROWS różnee_bla_bla FROM tabela WHERE warunki LIMIT start i koniec'; //zapytanie główne z wynikami... zauważ sql_calc.. po nim nie ma przecinka. jest BONUSEM
  2. //tu sobie leci strona a paginacja zaczyna się tutaj
  3. $pagin_where = '?page='; //tutaj jest wrzucany link jaki ma być widoczny w paginatorze. Może być cokolwiek w stylu /strona/kategoria/ byle htaccess obsłużył
  4. //paginacja
  5. $ile = mysql_result( mysql_query('SELECT FOUND_ROWS() AS ile'), 0, 0); //na szybko wystarczy ale możesz zabezpieczać bardziej :)
  6. $row_per_page = 10; //ilość wyników na stronę;
  7. $pages = ceil( $ile/$row_per_page );
  8. $side = 3; //tutaj podany jest "zakres" stron po lewej i prawej stronie od obecnej a więc po max 3 z każdej strony. maksymalnie więc 3 z lewej, obecna, 3 z prawej
  9. if( $pages > 1 ) { //czy paginator ma własciwie być widoczny czy nie? jeśli wyniki na 1 stronie to olej
  10. echo '<div id="paginator">'; //ja mam id i potem klasy by sobie ostylować wedle upodobań :)
  11. if( $page > 1 ) { //jesli inna strona niż pierwsza to dodaj linki "pierwsza" i "poprzednia"
  12. echo '<a href="'.$pagin_where.'1">Pierwsza</a><a href="'.$pagin_where.($page-1).'">Poprzednia</a>';
  13. }
  14. for( $i=$page-$side; $i<=$page+$side; $i++ ) { //tu jest cały środek ze stronami
  15. if( $i<1 OR $i>$pages ) { //to dla stron "spoza zakresu", a więc typu -1 czy większych niż ilość stron
  16. continue;
  17. } elseif( $i == $page ) {
  18. echo '<a class="now" href="">'.$i.'</a>'; //obecna strona
  19. } else
  20. echo '<a href="'.$pagin_where.$i.'">'.$i.'</a>'; //a to dla znajdujących się w zakresie i możliwych do wyświetlenia
  21. }
  22. if( $page < $pages ) { //dla stron innych niż ostatnia linki "następna" i "ostatnia"
  23. echo '<a href="'.$pagin_where.($page+1).'">Następna</a><a href="'.$pagin_where.$pages.'">Ostatnia</a>';
  24. }
  25. echo '</div>';
  26. }


EDIT: Zrobienie z tego klasy lub funkcji to banał. Jako parametry wchodzą numer strony, liczba stron i link oraz zakres... W zasadzie to masz wtedy jedynie w klasie kawałek od if( $pages > 1 ) do końca, bo cała reszta wchodzi jako parametry.
lobopol
Umieścił bym kod, jaki usmażyłem, ale to ponad 120 linii i wywala, że post za długi, jak go nieco poprawie to wrzucę 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.