Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pager - stronnicowanie
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Balon
Klasa nie jest taka świetna jak tak klasa nospora ale kiedys moze mu dorownam winksmiley.jpg zauwazylem ze ludzie pisza o problemie z mod rewrite i roznymi linkami, tak wiec pomyslalem ze do skryptu ktory aktualnie pisze dodam klase z pagerem o walsnie takiej mozliwosci winksmiley.jpg

  1. <?php
  2. /**
  3.  * Klasa pagera
  4.  * 
  5.  * @author Krzysztof 'Balon' Jagiełło < balonyo@gmail.com >
  6.  * 
  7.  * ( pager::text['separ'] - separator odzdzielajacy linki do stron )
  8.  * ( pager::url - sposob wyswietlania urli )
  9.  *
  10.  */
  11. class pager
  12. {
  13. var $ileMax = 10; # ileMax na strone
  14. var $actPage; # aktualna strona
  15. var $ilePages; # ile stron (wynik pager::ileStron)
  16. var $pagerMax = 3;
  17. var $text = array( 'PREV' => '<< Poprzednia ::', 'NEXT' => ':: Następna >>', 'T_PREV' => 'Poprzednia strona', 'T_NEXT' => 'Następna strona', 'SEPAR' => ' ', 'ZILU' => 'z % stron' );
  18. var $url = '<a href="linki.php?p=%">%</a>';
  19. var $link;
  20.  
  21. /**
  22.  * Konstruktor klasy
  23.  *
  24.  * @param integer $actPage aktualny numer strony
  25.  */
  26. function pager( $actPage, $num, $limit = 10 )
  27. {
  28. $this->actPage = $actPage;
  29. $this->ilePages = $this->ileStron( $num );
  30. $this->ileMax = $limit;
  31. }
  32. /**
  33.  * Pager
  34.  *
  35.  */
  36. function showPager()
  37. {
  38. $this->prev();
  39. $this->addSep();
  40. for( $i = ( $this->actPage / $this->ileMax ) - $this->pagerMax; $i <= ( $this->actPage / $this->ileMax ) + $this->pagerMax; $i++ )
  41. {
  42. if( $i >= 0 && $i < $this->ilePages )
  43. {
  44. $this->page( $i );
  45. $this->addSep();
  46. }
  47. }
  48. $this->addzIlu( $this->ilePages );
  49. $this->next();
  50. return $this->link;
  51. }
  52. /**
  53.  * Poprzednia strona
  54.  *
  55.  */
  56. function prev()
  57. {
  58. if( ( $this->actPage / $this->ileMax ) == 0 )
  59. {
  60. $this->link = $this->text['PREV'];
  61. }
  62. else 
  63. {
  64. $this->link = $this->url( $this->actPage / $this->ileMax, '', 'minus' );
  65. }
  66. }
  67. /**
  68.  * Nastepna strona
  69.  *
  70.  */
  71. function next()
  72. {
  73. if( $this->actPage < ( ( $this->ilePages * $this->ileMax ) - $this->ileMax ) )
  74. {
  75. $this->link .= $this->url( $this->actPage / $this->ileMax, '', 'plus' );
  76. }
  77. else 
  78. {
  79. $this->link .= $this->text['NEXT'];
  80. }
  81. }
  82. /**
  83.  * wyswietlanie linku do strony
  84.  *
  85.  * @param integer $i numer strony
  86.  */
  87. function page( $i )
  88. {
  89. if( $this->actPage == $i * $this->ileMax )
  90. {
  91. $this->link .= $this->url( $i , 't' );
  92. }
  93. else 
  94. {
  95. $this->link .= $this->url( $i );
  96. }
  97. }
  98. /**
  99.  * Obliczanie ilosci stron
  100.  *
  101.  * @param integer $num liczba wpisow(mysql_num_rows)
  102.  * @return $ilePages
  103.  */
  104. function ileStron( $num )
  105. {
  106. return ceil( $num / $this->ileMax );
  107. }
  108.  
  109. /**
  110.  * Tworzenie urli, do $this->link podajemy juz <a href="(...)
  111.  * a miejsce na numer strony oznaczamy jako %
  112.  *
  113.  * @param integer $i
  114.  * @param string $bold
  115.  * @return $link
  116.  */
  117. function url( $i, $bold = null, $mod = null )
  118. {
  119. if( $mod == null )
  120. {
  121. if( $bold == 't' )
  122. {
  123. $link = str_replace( '>%<', '><b>'.( $i + 1 ).'</b><', $this->url );
  124. $link = str_replace( '%', $i * $this->ileMax, $link );
  125. }
  126. else 
  127. {
  128. $link = str_replace( '>%<', '>'.( $i + 1 ).'<', $this->url );
  129. $link = str_replace( '%', $i * $this->ileMax, $link );
  130. }
  131. }
  132. else 
  133. {
  134. if( $mod == 'plus' )
  135. {
  136. $link = str_replace( '>%<', ' title="'.$this->text['T_NEXT'].'">'.$this->text['NEXT'].'<', $this->url );
  137. $link = str_replace( '%', ( $i * $this->ileMax ) + $this->ileMax, $link );
  138. }
  139. else if( $mod == 'minus' )
  140. {
  141. $link = str_replace( '>%<', ' title="'.$this->text['T_PREV'].'">'.$this->text['PREV'].'<', $this->url );
  142. $link = str_replace( '%', ( $i * $this->ileMax ) - $this->ileMax, $link );
  143. }
  144. }
  145. return $link;
  146. }
  147. /**
  148.  * Dodawanie separatora
  149.  *
  150.  */
  151. function addSep()
  152. {
  153. $this->link .= $this->text['SEPAR'];
  154. }
  155. /**
  156.  * " (...) ze 100 "
  157.  */
  158. function addzIlu( $i )
  159. {
  160. $this->link .= str_replace( '%', $i, $this->text['ZILU'] );
  161. $this->addSep();
  162. }
  163. }
  164. ?>


Przyklad uzycia

  1. <?php
  2. if( isset( $_GET['p'] ) && is_numeric( $_GET['p'] ) )
  3. {
  4. $p = $_GET['p'];
  5. }
  6. else 
  7. {
  8. $p = 0;
  9. }
  10.  
  11. $sql->sql_query( 'SELECT id FROM LINKS WHERE zatw = "tak"' );
  12. $num = $sql->sql_num_rows();
  13.  
  14. $pager = new pager( $p, $num );
  15.  
  16. echo $pager->showPager();
  17. ?>


pozdrawiam

ZEZWALAM NA WSZELKI UZYTEK wiem ze klasa porazkowa, ale to byla klasa na poczatku mojej przygody z php. teraz napisze cos lepszego winksmiley.jpg
AxZx
bardzo mi sie podoba to ze mozna swodobnie podac adres strony na ktora ma przekierowywac

mam kilka propozycji;)

gdyby kod

  1. <?php
  2. if( isset( $_GET['page'] ) && is_numeric( $_GET['page'] ) ){
  3. $p = $_GET['page'];
  4. }else {
  5. $p = 0;
  6. }
  7. ?>


wrzucic do klasy to byloby lepiej, mozna dac mozliwosc podania skad klasa ma brac info ktora podstrona jest aktualnie wyswietlana
  1. <?php
  2. //np
  3. $pager->setPage = $_GET['page']
  4. //albo
  5. $pager->setPage = $_POST['page']
  6. ?>


mozna by dac jeszcze mozliwosc ustawienia ile linkow ma byc wyswietlanych

a gdzie jest metoda ktora wyrzuca LIMIT do zapytania SQL ?

a gdyby tak zrobic metody dzieki ktorym mozna ustawic wszystkie parametry?
np ilosc wszystkich wierszy w bazie, ilosc wyswietlanych wierszy na jednej podstronie
zamiast podawac to w argumentach metody pager
Seth
Cytat
NIE ZEZWALAM NA UZYTEK KOMERCYJNY

Cool, ale po co w takim razie to tutaj dajesz?
Dla zabawy, szpanu... ?
Marusz
Cytat
NIE ZEZWALAM NA UZYTEK KOMERCYJNY

Klasa posiada bledy. Poza tym nospor zaproponowal lepsze rozwiazanie i opatrzyl ludzka licencja. Jesli chcesz mu kiedys dorownac, to na poczatku zmien mentalnosc...
AxZx
nospor moze zrobil lepsza klase ale nie ma tak fajnej funkcjonalnosci jak ta smile.gif
mozna ustawiac wlasny adres
Balon troche przerobi klase i bedzie cacy:)

No przeciez u mnie tez mozna ustawic wlasny link.... /~nospor/
sf
Cytat(Seth @ 21.08.2006, 13:11 ) *
Cool, ale po co w takim razie to tutaj dajesz?
Dla zabawy, szpanu... ?


Bo ma na to ochotę, jego sprawa na jakiej zasadzie udostępnia skrypt.

Co do skryptu... to beznadziejny jak każdy inny podany tutaj jak chodzi o stronicowanie. IMO kod klasy powinien być niezależny od HTML.
nasty
Cytat
NIE ZEZWALAM NA UZYTEK KOMERCYJNY

ok, a masz jakis powod? czy poprostu cierpisz na syndrom zbuntowanego 15 latka walczacego z M$ i ratujacym Open-Source winksmiley.jpg niema sensu, daj na GNU/GPL i bedzie gitara.

a klasa jako klasa, nic specjalnego
pozdrawiam
Balon
spadac od mojego wieku winksmiley.jpg oczywiscie zezwalam na uzytek do jakichkolwiek celow. napisalem to tak bo mialem problemy z kradzieza skryptow w ktorych wykorzystywana byla ta klasa i musialem miec jakis argument. klase mam zamiar od nowa odpisac winksmiley.jpg

pzodrawiam
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.