Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [klasa] Pager - prościutka klasa pagera, napisana z myślą o MVC
phpion
post
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Witam,
właśnie na własne potrzeby napisałem prościutką klasę pagera. Nie posiada metody generującej kod HTML - ten element wykonywany jest już w samym widoku. Klasa lekka, a co za tym idzie szybka.
Do konkstruktora przekazujemy aktualnie wyświetlaną stronę oraz liczbę wszystkich stron.

// EDIT:
dodałem statyczną metodę (calculateTotal()) obliczającą liczbę stron potrzebnych do paginacji

  1. <?php
  2. class Pager {
  3. protected $_current = 0;
  4. protected $_total = 0;
  5. protected $_first = false;
  6. protected $_previous = false;
  7. protected $_next = false;
  8. protected $_last = false;
  9.  
  10. public function __construct($current, $total) {
  11. $this->_current = (int)$current;
  12. $this->_total = (int)$total;
  13.  
  14. // check if $current is >= 1
  15. if ($this->_current < 1) {
  16. $this->_current = 1;
  17. }
  18. // ...or is not out of the $total range
  19. else if ($this->_current > $this->_total) {
  20. $this->_current = $this->_total;
  21. }
  22.  
  23. // set the first, previous...
  24. if ($this->_current > 1) {
  25. $this->_first = $this->_previous = true;
  26. }
  27. // ...and next, last
  28. if ($this->_current < $this->_total) {
  29. $this->_next = $this->_last = true;
  30. }
  31. }
  32.  
  33. static public function calculateTotal($count, $perPage) {
  34. return ceil($count/$perPage);
  35. }
  36.  
  37. public function getCurrent() {
  38. return $this->_current;
  39. }
  40.  
  41. public function getTotal() {
  42. return $this->_total;
  43. }
  44.  
  45. public function getFirst() {
  46. return $this->_first;
  47. }
  48.  
  49. public function getPrevious() {
  50. return $this->_previous;
  51. }
  52.  
  53. public function getNext() {
  54. return $this->_next;
  55. }
  56.  
  57. public function getLast() {
  58. return $this->_last;
  59. }
  60. }
  61. ?>

oraz przykład zastosowania.
W kontrolerze:
  1. <?php
  2. // jawne okreslenie liczby stron
  3. $view->p = new Pager((isset($_GET['page']) ? $_GET['page'] : 1), 10);
  4. // obliczenie liczby stron potrzebnych do paginacji
  5. $view->p = new Pager((isset($_GET['page']) ? $_GET['page'] : 1), Pager::calculateTotal(101, 10));
  6. ?>

W widoku:
  1. <ul>
  2. <li>
  3. <?php if ($p->getFirst() === true): ?>
  4. <a href="./pager.php?page=1">&laquo;</a>
  5. <?php else: ?>
  6. &laquo;
  7. <?php endif; ?>
  8. </li>
  9.  
  10. <li>
  11. <?php if ($p->getPrevious() === true): ?>
  12. <a href="./pager.php?page=<?php echo $p->getCurrent()-1; ?>">&lsaquo;</a>
  13. <?php else: ?>
  14. &lsaquo;
  15. <?php endif; ?>
  16. </li>
  17.  
  18. <?php for($i=1; $i<=$p->getTotal(); $i++): ?>
  19. <li>
  20. <?php if ($i != $p->getCurrent()): ?>
  21. <a href="./pager.php?page=<?php echo $i; ?>"><?php echo $i; ?></a>
  22. <?php else: ?>
  23. <?php echo $i; ?>
  24. <?php endif; ?>
  25. </li>
  26. <?php endfor; ?>
  27.  
  28. <li>
  29. <?php if ($p->getNext() === true): ?>
  30. <a href="./pager.php?page=<?php echo $p->getCurrent()+1; ?>">&raquo;</a>
  31. <?php else: ?>
  32. &raquo;
  33. <?php endif; ?>
  34. </li>
  35.  
  36. <li>
  37. <?php if ($p->getLast() === true): ?>
  38. <a href="./pager.php?page=<?php echo $p->getTotal(); ?>">&rsaquo;</a>
  39. <?php else: ?>
  40. &rsaquo;
  41. <?php endif; ?>
  42. </li>
  43. </ul>


Ten post edytował phpion.com 30.12.2007, 10:33:54
Go to the top of the page
+Quote Post
nrm
post
Post #2





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


mało przejrzyste, mało elastyczne, widok to już porażka (przynajmniej helpera z tego zróB).


--------------------
Go to the top of the page
+Quote Post
phpion
post
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(normanos @ 29.12.2007, 22:50:18 ) *
mało przejrzyste

Tzn?

Cytat(normanos @ 29.12.2007, 22:50:18 ) *
mało elastyczne

Przecież można dziedziczyć po tej klasie i tworzyć inne pagery.

Cytat(normanos @ 29.12.2007, 22:50:18 ) *
widok to już porażka (przynajmniej helpera z tego zróB).

W zamyśle widok dla pagera ma być wczytywany w innych widokach. Co z nim takiego porażkowego?
Go to the top of the page
+Quote Post
kicaj
post
Post #4





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

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


Nie wnosi nic nowego jak pozostalem klasy paginacji...

@normanos: Jak ty widzisz tutaj zachowanie helpera?


--------------------
PHP Developer

"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(kicaj @ 30.12.2007, 04:24:49 ) *
Nie wnosi nic nowego jak pozostalem klasy paginacji...

No a niby co ma wnosić? Nie posiada nic poza konstruktorem i getterami. Mi w zupełności taka klasa wystarcza.

Cytat(kicaj @ 30.12.2007, 04:24:49 ) *
@normanos: Jak ty widzisz tutaj zachowanie helpera?

No pewnie na podobnej zasadzie jak przedstawiony widok. Helper po prostu by generował podobny kod. Ja jednak pozostanę przy obecnej wersji tj. dołączaniu powyższego kodu jako widoku. Naprawdę nie wiem co z nim jest takiego "be".
Go to the top of the page
+Quote Post
sticker
post
Post #6





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


ale dobrze by było udowodnić dlaczego uważasz że nie jest ble jakie ma zalety i co go odróznia od tego co tu można było znaleźć na forum wiele razy


--------------------
Go to the top of the page
+Quote Post
phpion
post
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie twierdzę, że wszystko jest mega pro. Po prostu takiej funkcjonalności potrzebowałem, taką klasę napisałem i taką wrzuciłem na forum. Jeżeli macie jakieś zarzuty to chciałbym poznać jakieś konkrety aby nanieść modyfikacje.
Go to the top of the page
+Quote Post
acztery
post
Post #8





Grupa: Zarejestrowani
Postów: 945
Pomógł: 7
Dołączył: 15.03.2005
Skąd: katowice

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


chyba nie dokońca wiesz co to jest widok.
Go to the top of the page
+Quote Post
phpion
post
Post #9





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(acztery @ 18.01.2008, 19:06:18 ) *
chyba nie dokońca wiesz co to jest widok.

Czy mógłbyś w takim razie mnie olśnić? Do tej pory myślałem, że widok odpowiada za odpowiednie wyświetlanie surowych danych.
Go to the top of the page
+Quote Post
nrm
post
Post #10





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


@phpion: wybacz moją pośpieszną ocenę. nie jest tak źle jak szybko rzucając na to okiem przyjąłem. rozumiem, że cały widok nawigatora przekazujesz sobie jedną zmienną?


--------------------
Go to the top of the page
+Quote Post
Daimos
post
Post #11





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


jak dla mnie klasa przyjemna, prosta i o to chodzi, szczegolnie jak ktos robi stronicowanie na prostej stronie i nie potrzeba mu wielkich kombajnow
a wszystko nadaje sie swietnie do rozbudowy na wlasne potrzeby winksmiley.jpg

Ten post edytował my salsa 18.01.2008, 21:40:52


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
phpion
post
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(normanos @ 18.01.2008, 23:26:50 ) *
@phpion: wybacz moją pośpieszną ocenę. nie jest tak źle jak szybko rzucając na to okiem przyjąłem. rozumiem, że cały widok nawigatora przekazujesz sobie jedną zmienną?

Wybaczam winksmiley.jpg hehe. Coprawda nie do końca rozumiem Twoje pytanie ale może opiszę jak to widzę. W kontrolerze tworzę obiekt typu Pager i przekazuję go do głównego widoku. W głównym widoku natomiast wczytuję "podwidok" (mały szablonik winksmiley.jpg ) do którego przekazuję powyższy obiekt. To właśnie ten "podwidok" zawiera kod opakowujący obiekt Pager w znaczniki HTML. Sam obiekt Pager'a zawiera tylko niezbędne dane nt. samego siebie - nic więcej. Dokładnie to chciałem osiągnąć.

Cytat(my salsa @ 18.01.2008, 23:40:28 ) *
jak dla mnie klasa przyjemna, prosta i o to chodzi, szczegolnie jak ktos robi stronicowanie na prostej stronie i nie potrzeba mu wielkich kombajnow
a wszystko nadaje sie swietnie do rozbudowy na wlasne potrzeby winksmiley.jpg

Dokładnie to chciałem osiągnąć (powtarzam się winksmiley.jpg )! Potrzebowałem prosty pager, który mógłbym dowolnie zinterpretować w widoku. Żadnego generowania kodu, żadnego $pager->display().
Go to the top of the page
+Quote Post
Daimos
post
Post #13





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Cytat(phpion @ 18.01.2008, 22:00:46 ) *
Żadnego generowania kodu, żadnego $pager->display().

no i tak jest najlepiej, zaloze sie ze 80% osob, ktore korzystaly z gotowych pagerow, musialo i tak po swojemu modyfikowac (albo pisac od nowa) funkcje display winksmiley.jpg


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
nrm
post
Post #14





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


$pagination->display('typ'); jest dobre zakładając, że np. formatujesz sobie widok nawigatora wg. jakiś tam (różnych szablonów).


--------------------
Go to the top of the page
+Quote Post
phpion
post
Post #15





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(normanos @ 19.01.2008, 13:58:50 ) *
$pagination->display('typ'); jest dobre zakładając, że np. formatujesz sobie widok nawigatora wg. jakiś tam (różnych szablonów).

Rozumiem, że na podstawie parametru 'typ' określasz jaki widok ma zostać załadowany - tak? W sumie rozwiązanie niezgorsze winksmiley.jpg ale już wg mnie nieco ograniczone. W różnych systemach widoki ładuje się inaczej więc wyniknęłaby pewna niespójność. Należałoby odpowiednio przeładowywać metodę display() czego właśnie chciałem uniknąć.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #16





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Wg mnie takie rozwiązanie widoku, jakie jest w jednym z pierwszych postów jest najlepsze. Z tym 'ale', że to moim zdaniem powinien realizować odpowiedni obiekt przyjmujący obiekt klasy Pager. Sama klas Pager ma dobry interfejs i nic więcej w tym obiekcie nie powinno być.

Implementacje mogą już być różne smile.gif
  1. <?php
  2. class pagerView
  3. {
  4. private $pager;
  5.  
  6. function __construct(Pager $pager)
  7. {
  8. $this->pager=$pager;
  9. }
  10. }
  11. ?>


Pozdrawiam


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
nrm
post
Post #17





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


phpion: tak, chodzi o różny rodzaj nawigatora. oczywiście każdy z nas ma jakis swój ideał i tylko go stosuje (np.ja winksmiley.jpg ) ale zdarzają się czasami potrzeby innego widoku paginacji ale oczywiście w ramach jednego projektu to czasami człowiek coś szybciej ręcznie poprawi. moja uwaga sie raczej odnosila do jakis ogolnych systemow dla mas.

np.
http://svn.kohanaphp.com/trunk/system/libr.../Pagination.php
http://svn.kohanaphp.com/trunk/system/views/pagination/


--------------------
Go to the top of the page
+Quote Post
phpion
post
Post #18





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@Cysiaczek & @normanos
Fakt, klasa generująca odpowiedni widok na podstawie otrzmanego obiektu Pager jest najrozsądniejszym rozwiązaniem. Odbiegając nieco od tematu to chciałbym zauważyć, że w większości pozycji książkowych dotyczących PHP obiekty same się generują. Przykładowy obiekt Pager posiada metodę display() aby wygenerować samego siebie w formie HTML. Nie wiem jak Wy ale ja uważam, że takie podejście jest nieco nielogiczne. Moim zdaniem takie zadanie powinno spoczywać na klasie np. Generator_Pager, która otrzymywałaby obiekt do oprawienia. Mnie osobiście takiego typu przykłady rażą.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #19





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Chyba, że...

  1. <?php
  2. class Pager
  3. {
  4. function display()
  5. {
  6.  $this->view->display($this);
  7. }
  8. }
  9. ?>


Tak też można ; )


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
janusz.master
post
Post #20





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 20.05.2007

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


Temat może nie na czasie ale zobaczyłem coś dziwnego:
Może coś pominąłem ale co wyswietli twoj pager jesli jest np: 100 newsow, po 5 na stronie, w sumie 20 podstron, i włączę 10 podstronę?? Czy przypdakiem nie wyswietli first, previous, wszystkie od 1 do 20, next, last?questionmark.gif Masz tam pętlę od $i=1 do $i<=$total i ona leci przez wszystkie linki czyz nie?? a jesli bedzie 1000 podstron to bedzie ciezko. Cos chyba musisz dopisac
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 19.08.2025 - 19:28