Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

12 Stron V   1 2 3 > »   
Reply to this topicStart new topic
> Pager (stronicowanie), klasa, php4 i php5
nospor
post 15.09.2005, 09:18:52
Post #1





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 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 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 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 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 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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bakus
post 15.09.2005, 15:51:32
Post #2


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


Rozwiązanie bez wątpienia warte uwagi, ale po sesjach widać, że nie pracujesz na E_ALL - gdy nie zostanie wywołana sesja (session_start) wszelkie odwołania do $_SESSION będą powodować błąd E_NOTICE.
Poza tym powinieneś dać możliwość wyłączenia tej funkcji.

Poza tym co w przypoadku, gdy skrypt będzie działał przez mod_rewrite (np. na stronie: ./get-art-143.xml => ./index.php?act=get&co=art&id=143) przy założeniu, że JS został wyłączony?


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
nospor
post 15.09.2005, 16:03:53
Post #3





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




@Bakus
Widzę że kod przeanalizowales dokladnie smile.gif. Dziękuję za zainteresowanie i cenne uwagi. Faktycznie, system obslugi bledów mam inny i E_NOTICE nie widze.
Problem z brakiem sesji juz rozwiązałem i przeedytowalem klasę.

Co do możliwości wyłączenia zapisu w sesji - już jest smile.gif

Co do js to zapomnialem dodać, iż jest wymagane smile.gif Oczywiscie w przypadku gdy pager korzystać będzie z formualrza. Gdy z linków to js nie jest potrzebne.

mod_rewrite: hmmm. Nie używalem Pagera do tego typu metod, wiec nie myslalem nad rozwiązaniem. Może w wolnej chwili.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bakus
post 18.09.2005, 18:59:50
Post #4


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


Przydał by się jeszcze jeden mały bajer: "połamanie linii"... by kod nie przenosił się do następnych linijek (powoduje to błędy w numerowaniu linii)


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
nospor
post 19.09.2005, 08:54:33
Post #5





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




mówisz - masz smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bakus
post 21.09.2005, 15:19:08
Post #6


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


cudo biggrin.gif


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
Balas
post 21.09.2005, 18:11:30
Post #7





Grupa: Zarejestrowani
Postów: 347
Pomógł: 0
Dołączył: 27.08.2005
Skąd: Inowrocław

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


Mam kod ktory pobiera dane z bazy mysql (w tablicy) i wyswietla (while), jak to podpiac do tego questionmark.gif snitch.gif
(jestem poczatkujacy i nie kumam ocb tongue.gif znaczy jakj to zrobic :])

Ten post edytował OnE.Killer 21.09.2005, 18:13:15


--------------------
Go to the top of the page
+Quote Post
NuLL
post 21.09.2005, 18:54:16
Post #8





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Masz wszystko przecież jak wół napisane.


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
AxZx
post 21.09.2005, 19:56:17
Post #9





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

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


wydaje mi sie ze klasa generuje kod HTMl niezgodny ze standardem,

powinno byc &amp; zamiast &


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nospor
post 22.09.2005, 08:09:56
Post #10





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




@OnE.Killer odpowiedzialem tutaj:
http://forum.php.pl/index.php?act=ST&f=27&...t=0#entry202136

@AxZx hmm, szczerze powiedziawszy nie wiem czy to zgodne ze standardem czy nie. Ale to przecież zaden problem podmienić & na &amp; . Występuje to tylko w jednym miejscu (linia 114)
Ale dzięki za info smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
AxZx
post 22.09.2005, 13:04:25
Post #11





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

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


wiem ze mozna samemu sobie zmienic, ale czemu ty nie mozesz tego zrobic? zeby ten kto bedzie uzywal od razu mial gotowa elegancko klase w ktorej nic nie trzeba zmieniac:)
wiadomo - twoja wola.

a mam takie pytanie
czy nie lepiej by bylo gdyby np przy 10 podstronie widoczne byly linki do stron nastepnych i poprzednich?
np 5 poprzednich i 5 nastepnych, bo teraz jest tak ze jest 10 stron i koniec, tylko strzalki w prawo sa.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nospor
post 22.09.2005, 13:27:31
Post #12





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
wiem ze mozna samemu sobie zmienic, ale czemu ty nie mozesz tego zrobic? zeby ten kto bedzie uzywal od razu mial gotowa elegancko klase w ktorej nic nie trzeba zmieniac:)
wiadomo - twoja wola.
Dobra, zamieniam. Dzięki za cynk smile.gif

Cytat
a mam takie pytanie
czy nie lepiej by bylo gdyby np przy 10 podstronie widoczne byly linki do stron nastepnych i poprzednich?
np 5 poprzednich i 5 nastepnych, bo teraz jest tak ze jest 10 stron i koniec, tylko strzalki w prawo sa.
A tutaj to chyba cię nie rozumiem.
Są trzy rodzaje linków
<,> - poprzednia/nastepna strona
<<, >> poprzednie/nastepne dziesieć (liczbę tę można regulowac) to jest chyba to oco ci chodzi, czyli kolejne x stron
|<, >| pierwsza/ostatnia strona

Kazdy z tych linków sie pojawia, jezeli ma do czego przeniesc, jesli nie ma do czego przenieśc to sie nie pojawiają. Oto ci chodziło? Bo za bardzo nie widzę problemu w twoim przedstawieniu sprawy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
AxZx
post 22.09.2005, 13:35:39
Post #13





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

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


http://www.w3.org/

sprawdz strony z Twoim stronicowaniem w walidatorze, wyswirtli error w miejscu &


a co do linkow to chodzi mi o cyfry

teraz jest
Kod
|< << < 1 2 3 4 5 6 7 8 9 |10| > >> >|

gdzie |10| to aktualna strona

a ja zapytalem czy nie moze to sie przesuwac
np.
Kod
|< << < 5 6 7 8 9 |10| 11 12 13 14 15 > >> >|


moze takie cos juz jest ?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nospor
post 22.09.2005, 13:41:23
Post #14





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




aha, już czaję o co ci chodzi. Chcesz by aktualna strona była po środu wyswietlanych. Nie, teraz tego nie ma. Leci pakietami czyli co 10 (domyślnie, można regulować dlugosc tego "pakietu" ). W sumie funkcjonalność ciekawa. Być może dorobie w wolnej chwili. Będzie wówczas się mówiło czy chce się tak, czy inaczej.
Dzięki za sugestie, jak pisałem mile widziane są smile.gif

Co do & to juz poprawiłem smile.gif.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
AxZx
post 23.09.2005, 14:00:53
Post #15





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

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


a jeszcze mam takie pytanie, chociaz nie wiem czy jest to mozliwe bo w swojej klasie nie udalo mi sie tego osiagnac

chodzi o mod_rewrite:)

jak juz ktos wspominal, czy daloby sie to zrobic?

mam np branza.1
i teraz chcialbym branza.1.1
branza.1.2
itd
to w czym to mam zrobic?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nospor
post 23.09.2005, 14:25:27
Post #16





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




he? Czy Twoje pytanie ma związek z Pager'em? Bo ja ni w ząb nie kumam. Co to ma byc te branża.1, branza.1.1, branza.1.2 ?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
AxZx
post 23.09.2005, 14:28:28
Post #17





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

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


branza.1.2

1 to numer branzy
a 2 to numer strony:)

chcialbym aby wlasnie taki link generowal pager, i dlatego pytam sie czy da sie to jakos rozwiazac.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
nospor
post 23.09.2005, 14:34:39
Post #18





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
Dołączył: 27.12.2004




O, i nie można było tak od razu ? smile.gif
Teraz wszystko kumam smile.gif
Link da sie wygenerować po bardzo małej przeróbce. Gorzej z odebraniem danych z linku.
Teraz jestem dość mocno zajęty i nie mam czasu by pobawić sie mod rewrite. W wolnej chwili uwzględnie to w pagerze, ale naprawde nie wiem kiedy będzie ta wolna chwila sad.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
dr_bonzo
post 23.09.2005, 15:10:15
Post #19





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


A moze dodac dodatkowa klase do generowania linku: podajesz jej numer strony, liczbe stron (+inne) i za jej pomoca generujesz dowonle linki, z mod_rewrite czy bez.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
AxZx
post 23.09.2005, 15:12:28
Post #20





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

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


dobry pomysl

tylko nie kazdy jest takim geniuszem i nie kazdy wie jaka funkcjonalnosc powinna miec taka klasa.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post

12 Stron V   1 2 3 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 05:09