Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] Pager - prościutka klasa pagera
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
phpion
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>
nrm
mało przejrzyste, mało elastyczne, widok to już porażka (przynajmniej helpera z tego zróB).
phpion
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?
kicaj
Nie wnosi nic nowego jak pozostalem klasy paginacji...

@normanos: Jak ty widzisz tutaj zachowanie helpera?
phpion
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".
sticker
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
phpion
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.
acztery
chyba nie dokońca wiesz co to jest widok.
phpion
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.
nrm
@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ą?
Daimos
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
phpion
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().
Daimos
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
nrm
$pagination->display('typ'); jest dobre zakładając, że np. formatujesz sobie widok nawigatora wg. jakiś tam (różnych szablonów).
phpion
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ąć.
Cysiaczek
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
nrm
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/
phpion
@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żą.
Cysiaczek
Chyba, że...

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


Tak też można ; )
janusz.master
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
phpion
Cytat(janusz.master @ 30.01.2008, 03:05:12 ) *
Cos chyba musisz dopisac

Chyba jednak nie - nie czuję takowej potrzeby. Jeśli masz "coś" podzielone na 1000 podstron to gratuluję. Ja bym się jednak zastanowił czy taka liczba podstron pozwala użytkownikowi na szybkie dotarcie do konkretnej informacji. Może masz coś źle rozplanowane? W moim przypadku pewnie chodzi Ci o:
F P 1 2 3 ... 787 [788] 789 ... 998 999 1000 N L
Jeśli potrzebujesz takiej funckjonalności to ją sobie dopisz. W końcu jesteś janus.master winksmiley.jpg
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.