Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pager (stronicowanie), klasa, php4 i php5
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




info
pobierz

Hejka, prezentuję klasę Pager. Umożliwia ona wygenerowanie pager'a oraz pobranie aktualnych indexów rekordów.

Użycie jest proste:

  1. <?php
  2.    $pager = new Pager('idPagera');
  3.    //okreslenie liczby wszystkich rekordów na 500
  4.    $pager->SetTotalRecords(500);
  5.    echo $pager->Render();//wyswietlenie pagera
  6. ?>


Polączenie pagera z pobieraniem rekordów z bazy:
  1. <?php
  2.    $sql = 'select count(*) from TABLE';
  3.    $result = mysql_query($sql);
  4.    $row = mysql_fetch_array($result);
  5.    $recordsCount = $row[0];//pobranie liczby rekordów
  6.    $pager = new Pager('idPagera');
  7.    $pager->SetTotalRecords($recordsCount);//ustawienie liczby rekordów
  8.    //wygenerowanie pagera i zapamietanie go w zmiennej w celu
  9.    //pozniejszego wyswietlenia
  10.    $renderPager = $pager->Render();
  11.    $start = $pager->GetIndexRecordStart();//pobranie indexu rekordu początkowego
  12.    $end = $pager->GetIndexRecordEnd();//pobranie indexu rekordu koncowego
  13.    //zapytanie z uwzglenieniem stronicowania
  14.    $sql = 'select * from TABLE limit '.$start.','.($end - $start + 1);
  15.    //...pobranie wyników i ich wyswietlenie
  16.    echo $renderPager; //wyswietlenie pager'a
  17. ?>

(edit: te przyklady od wersji 2.5 troche inaczej beda wygladac. poprawne kody w paczce)

W podanym przykladzie brakuje oczywiscie sprawdzania, czy dane zapytanie wykonalo sie poprawnie itp. Nie podawałem tego jednak po to, by nie zaciemniać kodu.


Klasa generuje unikalne dla każdego pagera (poprzez idPager'a) zmienne, dzięki czemu na stronie może byc kilka pagerów do różnych tabel. Dodatkow, jesli korzystacie z sesji, klasa pamieta strony w sesji, dzięki czemu nie tracone są informacje o aktualnej stronie przy odwiedzaniu innych linków


Klasa ma 3 sposoby przechodzenia do kolejnych stron:
1) generuje własny wewnetrzny formularz i go submituje
Konstruktor tylko z pierwszym argumentem
2) korzysta z zewnetrznego formularza i musi byc w nim zawarta
Konstruktor z pierwszym i trzecim argumentem. Jako trzeci argument należy podać
idFormularza zawnętrznego
3) poprzez linki. Należy wówczas określić drugi parametr w konstruktorze, który będzie linkiem podstawowym. Do niego dodany będzie parametr odnosnie strony. Ten sposób generuje ogólne zmienne dla pagera, przez co lepiej żeby dla niego na stronie byl tylko jeden pager. Sposób ten może być wykorzystywany przy wyszukiwarkach.

To chyba wszystko. Wszelkiego rodzaju uwagi, sugestie bądź wynalezione błędy proszę zgłaszać. Wysłucham każdej (IMG:style_emoticons/default/smile.gif)

Aha, sposób implemetncji klasy dostosowany do php4. Klasa nie korzysta z żadnych dziwnych funkcji, więc można łatwo dostosować ją do php5. Należy tylko metody i zmienne deklarować w sposób odpowiedni dla php5.

Wszystkie metody i zmienne zaczynajace się na podkreslenie (_) oznaczają, iż są to metody i zmienne prywatne.

A oto przykladowy widok pager'a:
Cytat
|<  <<  <  21  22  23  24  25  26  27  28  29  30  z 200  >  >>  >|

oczywiscie wszystko to linki oprócz aktualnej strony.

Pager jest łatwo konfigurowalny. MOżecie sami okreslic liczbe rekordów na stronie, liczbę stron w pagerze itp.

A pozatym niech wam dobrze służy (IMG:style_emoticons/default/smile.gif)

edit (2006-04-03)
W związku z licznymi uwagami, by klasa nie generowala linkow co x, tylko pare linków przed stroną i parę linków po, wprowadzilem lekkie modyfikacje. Sposób uzywania klasy nie uległ zmianie (jest kompatybilna wstecz (IMG:style_emoticons/default/smile.gif) ). Chcąc użyc nowej metody generowania linków, wystarczy wywołać metodę render() z parametrem true:
  1. <?php
  2. echo $pager->Render(true);
  3. ?>

Mam nadzieję, że w ten sposób usatysfakcjonowałem parę osób (IMG:style_emoticons/default/winksmiley.jpg)

edit (2006-06-13)
Dawno nic nie pisalem. Czas zmienic. A wiec jest wersja 2.0
Główne zmiany:
1) odejscie od przesylania pagera formularzem
2) zapisywanie Pagera do tablicy, z której mozna samemu wygenerowac kod html Pager'a
3) PLucie wyjatkami (IMG:style_emoticons/default/smile.gif)
4) no i obecna wersja jest pod php5. Niedlugo dorobie tez wersje pod php4.

Zapraszam do sciagania i testowania.
W paczce jest kilka przykaldow, min. jak nalezy doczepic generowanie wlasnego kodu html.

Jesli zrobicie swoja funkcje generujaca kod html i bedziecie chcieli sie nia podzielic, wyslijcie mi a ja upublikuje wersje demo z wasza funkcja i wygladem pagera.

edit: 2.0 jest juz i pod php4

edit (2006-08-22)
Wersja 2.01:
- dorobilem na szybko ten link. teraz w konstruktorze, jesli podamy drugi parametr i bedzie w nim ciag:
#PAGE# to link ten zostanie niezmieniony, czyli bedzie tak jak user podal, za wyjatkiem #PAGE#, ktore zostanie zamienione na numer strony
Czyli dla przykladu co podal AxZx powinno byc:
  1. <?php
  2. $pager = new Pager('idPagera', 'wszystkie_numery_#PAGE#');
  3. ?>


- metoda Render moze zwracac teraz tablicę pagera zamiast kodu html. Należy ustawic na true jej trzeci parametr

edit (2007-07-26)
Wersja 2.5. Więcej info tu: http://nospor.pl/pager-2.5.html
Go to the top of the page
+Quote Post
12 Stron V  « < 2 3 4 5 6 > »   
Start new topic
Odpowiedzi (60 - 79)
AxZx
post
Post #61





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


kiedy mozna (czy wogole mozna) spodziewac sie tej klasy dla php 4?
Go to the top of the page
+Quote Post
nospor
post
Post #62





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ups.... zupelnie o tym zapomnialem.
W nastepnym tygodniu ide na urlop, to postaram sie wowczas to przepisac.

edit:
W zasadzie przeróbek nie bylo duzo i zrobilem to teraz. Tak wiec wersja dla php4 jest juz dostępna. Link w pierwszym poscie topicu i/lub w moim podpisie.
Go to the top of the page
+Quote Post
hugonot
post
Post #63





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 12.08.2006

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


Mam problem, uzylam kodu tak jak w przykladzie, wszystko dziala ale tylko jesli biore wszystkie rekordy z bazy, jesli wstawie wczesniej forme pytaniem i przekaze zmienna do wyszukiwania przez post to na 1 stronie jest OK, a na kolejnych zmienna ograniczajaca wyszukiwanie jest kasowana (ilosc stron sie zmienia automatycznie i mam wszystkie rekordy z bazy...) (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Co mam zrobic? Pomocy!!!
Joanna
Go to the top of the page
+Quote Post
nospor
post
Post #64





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Problem jako taki nie jest związany z moją klasą.
Dzieje sie tak, gdyz przechadząc do nastepnej strony, tracone sa dane z posta z poprzedniego żadania.

Rozwiązanie:
gdy wyslesz formularz, zapisz jego wynik (w sensie pol jakie przeslalas) do sesji. Nastepnym razem sprawdzaj czy wyslano formularz. Jesli nie wyslano, pobieraj dane wyszukiwania z sesji. Jesli znowu wyslano formularz, nadpisz dane w sesji.

Jesli nadal nie wiesz jak to zrobic, zaloz topic w dziale php. Twoj problem jak pisalem nie jest związany z moją klasą a z logiką Twojej aplikacji.

edit po poscie nizej:
zaloz topic w dziale php i tam opisz sprawe. Nie wykluczone ze sie tam odezwe. chodzi oto, by tu nie zasmiecac topicu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

edit: widze ze topic juz zalozylas. Posta ponizej wiec usuwam
Go to the top of the page
+Quote Post
AxZx
post
Post #65





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


dzieki za klase w wersji dla php4

mam problem jak ladnie polaczyc ja z moim serwisem
korzystam z mod_rewrite
mam podstrone wszystkie_numery
teraz chcialbym zeby link wygladal tak:
wszystkie_numery_7

da sie to jakos ladnie ustawic czy trzeba pisac swoja klase, albo ingerowac w ta?
Go to the top of the page
+Quote Post
nospor
post
Post #66





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@AxZx nie bede sciemnial. mod_rewrite to dla mnie wielka tajemnica....
A konkretnie rzecz mowiac nie mialem jeszcze okazji sie tym zajac, wiec nie wiem co musisz zrobic.
Go to the top of the page
+Quote Post
AxZx
post
Post #67





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


hmm chcialbym moc wprowadzic jak ma wygladac url

  1. <?php
  2. $url = 'wszystkie_numery_';
  3. ?>


chcialbym tez ustawic z jakiej zmiennej $_GET ma pobierac na ktorej stronie wlasnie jest

  1. <?php
  2. $get = $_GET['page'];
  3. ?>


wiem ze niektore opcje mozna ustawic, ale troche pogmatwane to
i jeszcze ten = przeszkadza w generowaniu adresu
Go to the top of the page
+Quote Post
nospor
post
Post #68





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@AxZx z racji ze szerzych po różnych topicach nieprawdziwe plotki to pisze tutaj (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
U mnie tez mozesz ustawic sobie jak ma wygladac link. W wersji 2.0 mozesz albo dziedziczyc po klasie, albo do klasy zapodac funkcje, ktora generuje Pager i tym samym, ktora generuje linki.

Zczytywanie strony skad chcesz tez nie jest problemem. Zczytujesz sobie strone sam, a potem wywolujesz metody klasy: SetActualPage()

I juz wszystko jest.
Go to the top of the page
+Quote Post
nasty
post
Post #69





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


nospor: a co ty powiesz na taki pomysl (moze w wersji 2.1?), ze masz w klasie zmienna co wyglada tak: /path_costam<page_id>_<cos_tam_innego>, i regexami bedziesz ustalal jak ma wygladac link, mysle ze nie kazdemu bedzie sie chcialo dziedziczyc klase i sie za duzo bawic.

Ja to jak juz tu wspomnialem, musialem sobie zrobic (i zrobilem (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) link co wyglada tak: "java script:doNavigateToPage(<page-id>);".

Mysle ze zalapiesz o co mi chodzi.
Pozdrawiam
Go to the top of the page
+Quote Post
AxZx
post
Post #70





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


chyba chodzi ci o to samo o co mnie:)
balon wlasnie cos takiego zrobil w swojej klasie
Go to the top of the page
+Quote Post
nospor
post
Post #71





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




co za lenie.... (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Dobra, leniwy klient nasz Pan. Sie dorobi. To zaden problem.
Go to the top of the page
+Quote Post
bigZbig
post
Post #72





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


@nospor jak widzisz problem wizualizacji linkow powraca. Ja we wczesniejszej wypowiedzi zaproponowalem zaprzegniecie do tego celu wzorca strategii tzn. proces generowania linka wyrzucic do osobnej wyspecjalizowanej klasy, nasty_psycho proponuje uzycie wyrazen regularnych. O ile moja propozycja wydaje mie sie bardziej profesjonalna (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) o tyle propozycja nasty_psycho bardziej przyjazna dla uzytkownika.
Go to the top of the page
+Quote Post
nospor
post
Post #73





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@bigZbig jak tak sie dluzej nad tym zastanawiam to faktycznie to ma sens. Chyba pojde na "kompromis": zrobie i tak i tak. czyli po nasty_psychowemu i po Twojemu (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Dodatkowo po Twojemu to mysle by dorobic w interfejsie metode do pobierania numeru aktualnej strony. Skoro ktos buduje wlasny link, to i pewnie w specyficzny sposob bedzie pobieral ten numer

edit:
No to jest wersja 2.01
Zmiany:
- dorobilem na szybko ten link. teraz w konstruktorze, jesli podamy drugi parametr i bedzie w nim ciag:
#PAGE# to link ten zostanie niezmieniony, czyli bedzie tak jak user podal, za wyjatkiem #PAGE#, ktore zostanie zamienione na numer strony
Czyli dla przykladu co podal AxZx powinno byc:
  1. <?php
  2. $pager = new Pager('idPagera', 'wszystkie_numery_#PAGE#');
  3. ?>


- metoda Render moze zwracac teraz tablicę pagera zamiast kodu html. Należy ustawic na true jej trzeci parametr
Go to the top of the page
+Quote Post
AxZx
post
Post #74





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


fantastycznie:)
coraz lepsza klasa

a nie lepiej zrobic metode do ktorej wrzucamy parametr ktory bedzie wlasnie tym URLem ?

cos jak
  1. <?php
  2. $pager->SetUrl('wszystkie_strony_#PAGE#');
  3. ?>
Go to the top of the page
+Quote Post
nospor
post
Post #75





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No ale teraz to ustawiasz w konstruktorze. Co za roznica czy w metodzie oddzielnej czy od razu? Tak mialem od wersji 1.0 i tak zostalo (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
nasty
post
Post #76





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat
O ile moja propozycja wydaje mie sie bardziej profesjonalna winksmiley.jpg o tyle propozycja nasty_psycho bardziej przyjazna dla uzytkownika.

Mi sie wydaje ze w tym wypadku uzycia stratego byloby przerostem formy nad trescia, i to bardzo. bo tu niema bardzo skomplikowanych czy wyspecjalizowanych konfiguracji jak np. ta klasa log-ow co byla tu kilka dni temu (SimpleLog).
Go to the top of the page
+Quote Post
bigZbig
post
Post #77





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


@nasty_psycho - wzorzec strategi jest bardzo latwy do realizacji i osobiscie nie uwazam, aby oplacalnosc jego stosowania rezerwowac jedynie dla bardzo skomplikowanych mechanizmow. Trzeba jedynie rozumiec idee OOP i umiec pisac do interfejsu.
Go to the top of the page
+Quote Post
AxZx
post
Post #78





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


gdzie mozna nauczyc sie takiego fachu ?(IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nasty
post
Post #79





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat(bigZbig @ 24.08.2006, 11:34 ) *
@nasty_psycho - wzorzec strategi jest bardzo latwy do realizacji i osobiscie nie uwazam, aby oplacalnosc jego stosowania rezerwowac jedynie dla bardzo skomplikowanych mechanizmow. Trzeba jedynie rozumiec idee OOP i umiec pisac do interfejsu.


Ok, ale przecietny uzytkownik tej klasy, (w mojej opinji), nie bedzie chcial/umiec pisac klasy implementujace ten interface. I dalem przyklad SimpleLog, bo tam sie ustala format pisania loga, czyli nieda sie jedna opcja ustalic czy to bedze text, xml czy moze arkusz exela, ale w klasie Pager, jest tylko jedna konfiguracja ktora sie podaje w postaci stringu, myslac o interfajsie, jakie beda tak funkcje? np. get format, czyli zwracanie stringa z formatek linku. A po nosporowemu ( (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) oko za oko ~nospor (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ), to sobie idziesz na skruty, i tylko podajesz stringa, bo funkcja generujaca ten link juz jest zrobiona.



Cytat
gdzie mozna nauczyc sie takiego fachu ? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


O co ci chodzi ? bo nie bardzo lapie ? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)







Pozdrawiam
Go to the top of the page
+Quote Post
Lee
post
Post #80





Grupa: Zarejestrowani
Postów: 319
Pomógł: 0
Dołączył: 11.04.2006
Skąd: Chojnów

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


Nie mam zielonego pojęcia jak to ze smarty połączyć (IMG:http://forum.php.pl/style_emoticons/default/sadsmiley02.gif) i wogóle jak to działa, przeczytałem dwie strony i pod kilkoma odnośnikami byłem ale nie mogę tego ugryźć :| W ogóle nie kapuje stronicowania (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Go to the top of the page
+Quote Post

12 Stron V  « < 2 3 4 5 6 > » 
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: 4.09.2025 - 02:22