Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Uniwersalny system paginacji/stronnicowania
Forum PHP.pl > Inne > Oceny
b_chmura
By zaoszczędzić miejsca usunąłem starą funkcję (nowa w poniższych postach)
devnul
wiem że to nie oceny - ale to co napisałeś w temacie wątku to jest chyba jakiś żart w stosunku do tego co tu zobaczyłem. gdzie tu ten wspomiany uniwersalizm? ja tu widze same ograniczenia i minusy. Było Ci potrzebne - ok - fajnie - ale zanim się czymś podzielisz (tym bardziej wrzucając to w gotowe rozwiązania - bo z tąd często się "młodzi" uczą to zastanów się troche. I co to za pomysł z tym stronicowaniem na przyciskach formularza (nie mówiąc o użyciu Skryptów JS do tego celu)?

A później się dziwią że sieć wygląda jak wygląda :/
b_chmura
Cytat
gdzie tu ten wspomiany uniwersalizm?


Funkcje można zastosować między innymi przy bazie MySQL, zwykłych plikach (między innymi ponieważ nie operowałem na innych bazach i nie wykluczam ze i w nich śmiało można funkcje wykorzystać)

Cytat
I co to za pomysł z tym stronicowaniem na przyciskach formularza


Myślę ze kwestia wyglądu jest indywidualna, ja przedstawiłem w formie formularza ze względu na estetykę oraz listy wysuwanej.

Cytat
(nie mówiąc o użyciu Skryptów JS do tego celu)?


a w czym to przeszkadza?
pożądany efekt przy małej ilość kodu


Cytat
wiem że to nie oceny

Nic złego w komentowaniu "gotowego rozwiązania".

Ewentualnie poproszę o przeniesienie tematu
devnul
No muszę się poporstu odnieść do tego co napisałeś.

Cytat
Funkcje można zastosować między innymi przy bazie MySQL, zwykłych plikach (między innymi ponieważ nie operowałem na innych bazach i nie wykluczam ze i w nich śmiało można funkcje wykorzystać)

A co przepraszam paginator ma do tego jakie dane ja mu podam? jesli mam taki kaprys to moge podawać mu dane czysto losowe i też ma działać exclamation.gif
Więc Twoje wytłumaczenie o uniwersalizmie ze względu na różnorodność źródeł danych z których paginacja może dotyczyć jest niewiele warte

Cytat
Myślę ze kwestia wyglądu jest indywidualna, ja przedstawiłem w formie formularza ze względu na estetykę oraz listy wysuwanej.

skoro tak to czemu pchasz tę kwestię do kodu funkcji i każesz tym którzy chcieli by ją zmienić grzebać w tym kodzie zamiast dac możliwośći ustalenia sposobu wyświetlania jako dajmy na to parametr. Nie wspominam już nawet o fakcie że przyciski formularza nie służą do tego żeby robić z nich odniesienia do stron. Zapraszam do zapoznania się z dokumentacją W3C.
Cytat
a w czym to przeszkadza?
pożądany efekt przy małej ilość kodu

Bardziej porządany można uzyskać stosując linki - nie wszystkie agenty użytkownika (przeglądarki, czytniki ekranowe, boty indeksujące dla potrzeb wyszukiwarek) mają włączoną obsługę javascript, twoje rozwiązanie powoduje że kolejnych podstron bot przeszukujący internet (np GoogleBot) nie zindeksuje - na czym straci właściciel strony. To także utrudnienie w dostępności dla osób ktore nie korzystają ze zwykłych przeglądarek a np. czytników ekranowych (osoby niewidome i niedowidzące) lub zwyklłych przeglądarek tekstowych (lynx itp - sam też czasem z tego korzystam pracując np via ssh). I nie wiem czy małą ilością kodu można nazwać przycisk wraz z javascriptem który ma dokonać przekierowania <a href="link">X</a> to znacznie mniej kodu i zadziała WSZĘDZIE!

Nie rozumiem czesz czemu decydujesz z góry o tym z kąd pobrane zostaną informacje o stronie na której się znajdujemy ($_GET['page']) a co jeśli np będę używał mod rewrita do maskowania linków i chiciałbym żeby miały np taką postać http://www.php.pl/strona/numer_strony ?

Twój kod jest poprostu zły - możliwe że Ciebie on satysfakcjonuje - ale jak już pisałem nie dawaj złego przykładu innym. SUgeruje przepisanie go na nowo - tym razem - po dłuższym przemyśleniu
phpion
Cytat(b_chmura @ 16.12.2007, 13:55:09 ) *
Funkcje można zastosować między innymi przy bazie MySQL, zwykłych plikach (między innymi ponieważ nie operowałem na innych bazach i nie wykluczam ze i w nich śmiało można funkcje wykorzystać)

Przecież skoro w samej paginacji nie odwołujesz się ani do bazy ani txt to przecież to może działać na wszystkim. Nie rozumiem skąd wątpliwości.

Ale do tematu: po co babrasz się z $_GET w ciele funkcji? Poza tym moim skromnym zdaniem funkcja powinna zwracać tablicę elementów, a nie gotowy kod. Później ta tablica powinna zostać obrobiona w widoku wedle uznania (normalne linki, buttony - jak kto chce).

Jestem tego samego zdania co ~devnul: fajnie, że Tobie się przydało, ale raczej mało kto uzna to za "Uniwersalny system paginacji/stronnicowania".
b_chmura
w takim razie spróbuje sie zastosować sie do Twoich uwag.

Wytłumacz mi tylko to:
Cytat
A co przepraszam paginator ma do tego jakie dane ja mu podam? jesli mam taki kaprys to moge podawać mu dane czysto losowe i też ma działać


ad. mod_rewrite
Kod
RewriteRule ^strona/([0-9]*?)$ example.php?page=$1
Cysiaczek
Taki komponent powinien mieć oddzieloną logikę od widoku, powienien mieć jasny interfejs. Ta funkcja to jest kod, który przy każdym projekcie trzeba przerabiać na swoje potrzeby, a jeśli potrzebne jest np 5 różnych wyglądów paginacji, to trzeba tą funkcję przepisać 5 razy. Jeśli potem zechcesz zmienić coś w jej logice, to zmiany będziesz musiał zastosować w pięciu miejscach. Podzielam zdanie kolegów - dobrze, że spełnia Twoje wymagania, ale szkoda, że tylko Twoje.

Pozdrawiam.
devnul
Cytat(b_chmura @ 16.12.2007, 13:04:59 ) *
w takim razie spróbuje sie zastosować sie do Twoich uwag.

Wytłumacz mi tylko to:
ad. mod_rewrite
Kod
RewriteRule ^strona/([0-9]*?)$ example.php?page=$1

widze że upierasz się przy swoim


ja np używam takiego kodu (który później obrabia mi odpowiednio router - ale to inna hisotoria) do maskowania adresów
powiedz mi w takim razie jakie to tu ma zastosowanie?
Kod
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
</IfModule>

Lub prościej: co jesli w kodzie już tysiąc razy używam np zmiennej $_GET['p'] do zdefiniowania numeru strony z jakiej korzystam?

Pomyśl dwa razy nim tym razem odpoweisz bo jak widzisz nie jestem osamotniony w mojej opini
b_chmura
Miałem na myśli te słowa:
Cytat
A co przepraszam paginator ma do tego jakie dane ja mu podam? jesli mam taki kaprys to moge podawać mu dane czysto losowe i też ma działać


Paginator (poniższy) wymaga od użytkowników jedynie sumę wszystkich rekordów i aktualną stronę.

  1. <?php
  2. function paginator($cnt, $Astrona = 1, $Istrona = 5)
  3. {
  4. if(!empty($cnt) or !empty($Istrona)) $CntStr = ceil($cnt/$Istrona);
  5. if($Astrona <= 0) $Astrona = 1;
  6. if($Astrona > $CntStr) $Astrona = $CntStr;
  7.  
  8. $Pstrona  = (($Astrona-1) >= 1)? ($Astrona-1): FALSE;
  9. $Nstrona  = (($Astrona+1) <= $CntStr)? ($Astrona+1): FALSE;
  10. $ALLstrona = range(1, $CntStr);
  11. $start  = $Istrona*$Astrona-$Istrona;
  12.  
  13. if($Istrona > ($cnt-$start)) $Istrona = ($cnt-$start);
  14.  
  15. $out['cnt']  = $cnt;
  16. $out['CntStr'] = $CntStr;
  17. $out['start']  = $start;
  18. $out['Istrona']  = $Istrona;
  19. $out['Pstrona']  = $Pstrona;
  20. $out['Astrona']  = $Astrona;
  21. $out['Nstrona']  = $Nstrona;
  22. $out['ALLstrona'] = $ALLstrona;
  23.  
  24. return $out;
  25. }
  26.  
  27. $cnt = $cnt; //suma wszystkich rekordów
  28. $po_ile = $po_ile; //ile rekordów na pojedynczej stronie
  29. $page  = $page; //numer aktualnej strony np $_GET['page']
  30. $out = paginator($cnt, $page, $po_ile);
  31.  
  32. echo '<pre>';
  33. echo 'Liczba rekordów - '.$out['cnt'].'<br />';
  34. echo 'Liczba Stron  - '.$out['CntStr'].'<br />';
  35. echo 'Od którego rekordu zacząć - '.$out['start'].'<br />';
  36. echo 'Ile rekordów na pojedyńczej stronie - '.$out['Istrona'].'<br />';
  37. echo 'Poprzednia strona - '.$out['Pstrona'].'<br />';
  38. echo 'Aktualna strona - '.$out['Astrona'].'<br />';
  39. echo 'Następna strona - '.$out['Nstrona'].'<br />';
  40. echo 'Numery stron  - ';
  41.  
  42. foreach($out['ALLstrona'] as $nr){ echo $nr.', '; }
  43.  
  44. echo '</pre>';
  45. ?>
Cysiaczek
Teraz to już idzie w zdecydowanie lepszą stronę.

Pozdrawiam
devnul
iść może i idzie ale nadal jest to bardzo dalekie od ideału. Read about OOP
phpion
Hmmm, czy taki zapis:
  1. <?php
  2. $page = ($page <= 0)$page = 1: $page;
  3. ?>

nie jest równoznaczny z:
  1. <?php
  2. $page = ($page <= 0)true : $page;
  3. ?>

? Chyba powinno być:
  1. <?php
  2. $page = ($page <= 0)? 1 : $page;
  3. ?>

Poza tym to troszkę nie ma sensu. Wystarczyłoby:
  1. <?php
  2. if ($page <= 0) $page = 1;
  3. ?>
b_chmura
tak, powinno być
  1. <?php
  2. $page = ($page <= 0)? 1 : $page;
  3. ?>


nie zastosowałem
  1. <?php
  2. if ($page <= 0) $page = 1;
  3. ?>

ponieważ wizualnie mi nie pasowało tongue.gif


Jeśli chodzi o OOP to niestety ale nie potrafią i przede wszystkim nie rozumiem. (wogóle nie rozumiem w czym byłoby to lepsze...)
Moli
Idziesz w dobrym kierunku, ale może użyjesz OOP.
phpion
Cytat(b_chmura @ 16.12.2007, 17:45:26 ) *
ponieważ wizualnie mi nie pasowało tongue.gif

Nie uważasz, że to głupi argument? Po co w 99% przypadków robić $page = $page?

Cytat(Moli @ 16.12.2007, 17:46:16 ) *
...może użyjesz OOP.

Bez komentarza.
devnul
Cytat
Jeśli chodzi o OOP to niestety ale nie potrafią i przede wszystkim nie rozumiem. (wogóle nie rozumiem w czym byłoby to lepsze...)
dobrze napisane - łatwiej konfigurować klasy, dostarczać pobiearć dane itp. Nie umiesz? Naucz się (ponoć lubisz się uczyć nowych rzeczy)
Moli
Cytat
Bez komentarza.

O co Ci chodzi ? Rozbudowanie tej funkcji na klasy nie dośc że poprawiło by elastycznośc (jeśli klasa była by dobrze napisana oczywiście) to łatwiej mógłby rozbudowywać o nowe funkcjie ją.
phpion
Ale chyba autor napisał, że nie zna OOP więc po co drążysz temat?
devnul
ta, autor wątku wiele pisze tu napisał że PHP zna dobrze (WTF - bez choćby podstaw OOP) a także że się chętnie uczy nowych rzeczy - więc ma okazje poznać OOP przy jakimś rozsądnym rozwoju tego paginatora.
b_chmura
Cytat(devnul @ 16.12.2007, 21:55:18 ) *
ta, autor wątku wiele pisze tu napisał że PHP zna dobrze (WTF - bez choćby podstaw OOP) a także że się chętnie uczy nowych rzeczy - więc ma okazje poznać OOP przy jakimś rozsądnym rozwoju tego paginatora.


Przyznam szczerze że często nie raz sie zabierałem za naukę obiektowego programowania jednak przed tym czytałem wiele opinii na ten temat, były bardzo zróżnicowane, jedni mówili że OOP znacznie uelastycznia kod drudzy ze ten sam efekt można uzyskać bez obiektów. W rezultacie sam nie dostrzegam większych różnic.
Często doradzano mi nauki OOP jednak nigdy nie mogłem się do niego do końca przekonać.

Jutro postaram się zrobić powtórkę z rozrywki i w/w skrypt napisać za pomocą OOP

Pozdrawiam
AxZx
raczej chodzi o zrozumienie idei obiektowosci niz stylu programowania - czyli to ze ty sobie zrobisz klase z tych 2 funkcji.

musisz sie zastanowic co jestem obiektem, jakie masz obiekty i to napisac - czyli stworzyc klasy.
b_chmura
w tym sęk ze tej idei nie potrafię sobie uświadomić...
do tematu wrócę już jutro, dziś już trochę nie jestem wstanie.
trucksweb
wiem, o jak sie czujesz sadsmiley02.gif tez nie potrafie pojac obiektow.

co z tego ze przez 2lata meczylem jave i c++, dalej nie umiem i wole klasyczne struktury party.gif jakos sa dla mnie czytelniejsze i latwiejsze do opanowania.

(nie jestem stary wiec to nie jest powodem trudnosci w opanowaniu idei sciana.gif )
devnul
że posłużę się cytatem
"Don't think you are, know you are." - to trzeba poprostu wiedzieć

oczyście umysły chłopaki a napewno pójdzie lepiej - bo dzis bez OOP ciężko - nawet jeśli sami jej nie wykorzystacie to macie utrudnione zrozumienie rozwiązań innych osób, które w normalnych wypadkach mogły by sporo pomóc/przyspieszyć (pracę)
Turgon
Cytat(trucksweb @ 17.12.2007, 01:50:47 ) *
wiem, o jak sie czujesz sadsmiley02.gif tez nie potrafie pojac obiektow.

co z tego ze przez 2lata meczylem jave i c++, dalej nie umiem i wole klasyczne struktury party.gif jakos sa dla mnie czytelniejsze i latwiejsze do opanowania.

(nie jestem stary wiec to nie jest powodem trudnosci w opanowaniu idei sciana.gif )

Tutaj trzeba myśleć algorytmem smile.gif Jak piszę system, mam od razu w głowie zarys zależności - jest to efekt napisania kilku systemów smile.gif
devnul
Cytat
Tutaj trzeba myśleć algorytmem Jak piszę system, mam od razu w głowie zarys zależności - jest to efekt napisania kilku systemów

to raczej nie myślenie algorytmem tylko praktyka, bo jak można nie myśleć algorytmem? każdy rodzaj myślenia to myślenie na podstawie jakiegoś szablonu/wzorca - a więc algorytmu winksmiley.jpg
b_chmura
tak jak mówiłem, przykład paginatora napisany w oparciu o OOP.
Pierwszy mój kod napisany obiektowo, wprawdzie działa ale czy jest on poprawny?

  1. <?php
  2. class paginator
  3. {
  4. public $cnt;
  5. public $Istrona;
  6. public $Astrona;
  7.  
  8. public function FCntStr()
  9. {
  10. if(!empty($this->cnt) or !empty($this->Istrona)) {$this->CntStr = ceil($this->cnt/$this->Istrona);}
  11. return $this->CntStr;
  12. }
  13.  
  14. public function FAstrona()
  15. {
  16. if($this->Astrona <= 0) {$this->Astrona = 1;}
  17. if($this->Astrona > $this->FCntStr()) {$this->Astrona = $this->FCntStr();}
  18. return $this->Astrona;
  19. }
  20.  
  21. public function FPstrona()
  22. {
  23. $this->Pstrona = (($this->FAstrona()-1) >= 1)($this->FAstrona()-1): FALSE;
  24. return $this->Pstrona;
  25. }
  26.  
  27. public function FNstrona()
  28. {
  29. $this->Nstrona = (($this->FAstrona()+1) <= $this->FCntStr())? ($this->FAstrona()+1): FALSE;
  30. return $this->Nstrona;
  31. }
  32.  
  33. public function FALLstrona()
  34. {
  35. $this->ALLstrona = range(1, $this->FCntStr());
  36. return $this->ALLstrona;
  37. }
  38.  
  39. public function Fstart()
  40. {
  41. $this->start = $this->Istrona*$this->FAstrona()-$this->Istrona;
  42. return $this->start;
  43. }
  44.  
  45. public function FIstrona()
  46. {
  47. if($this->Istrona > ($this->cnt-$this->Fstart())) {$this->Istrona = ($this->cnt-$this->Fstart());}
  48. return $this->Istrona;
  49. }
  50. }
  51.  
  52. $pagin = new paginator;
  53. $pagin->cnt  = $cnt; //suma wszystkich rekordów
  54. $pagin->Istrona = $po_ile; //ile rekordów na pojedynczej stronie
  55. $pagin->Astrona = $page; //numer aktualnej strony np $_GET['page']
  56.  
  57. echo '<pre>';
  58. echo 'Liczba rekordow - '.$pagin->cnt.'<br />';
  59. echo 'Liczba Stron  - '.$pagin->FCntStr().'<br />';
  60. echo 'Od którego rekordu zaczac - '.$pagin->Fstart().'<br />';
  61. echo 'Ile rekordów na pojedyńczej stronie - '.$pagin->FIstrona().'<br />';
  62. echo 'Poprzednia strona - '.$pagin->FPstrona().'<br />';
  63. echo 'Aktualna strona - '.$pagin->FAstrona().'<br />';
  64. echo 'Następna strona - '.$pagin->FNstrona().'<br />';
  65. echo 'Numery stron  - ';
  66.  
  67. foreach($pagin->FALLstrona() as $nr){ echo $nr.', '; }
  68.  
  69. echo '</pre><br />';
  70. ?>


EDIT
Ps: prawie dwa razy więcej linijek kodu...

EDIT
Przykład działania - link

EDIT
Przykład panelu sterującego
  1. <?php
  2. function Ppanel($Pstrona, $Astrona, $Nstrona, $ALLstrona)
  3. {
  4. if($Pstrona)
  5. {
  6. echo '<a href="?page='.$Pstrona.'">Poprzednia</a> | ';
  7. }
  8. else
  9. {
  10. echo 'Poprzednia | ';
  11. }
  12.  
  13. $i = 1;
  14. foreach($ALLstrona as $nr)
  15. {
  16. if($i == $Astrona)
  17. {
  18. echo $nr.', ';
  19. }
  20. else
  21. {
  22. echo '<a href="?page='.$nr.'">'.$nr.'</a>, ';
  23. }
  24. $i++;
  25. }
  26.  
  27. if($Nstrona)
  28. {
  29. echo ' | <a href="?page='.$Nstrona.'">Następna</a>';
  30. }
  31. else
  32. {
  33. echo ' | Następna';
  34. }
  35. }
  36. ?>
kicaj
W sumie posiadam podobna klase stronicowania, jednak nurtuje mnie wciaz problem integracji z szablonami, otoz tworzymy sobie liste:
Kod
poprzedni | 5 | 6 | 7 | 8 | 9 | nastepny


Kod do powyzszej klasy wygladalby nastepujaca w szablonie:
  1. <?php if( $pagin->FPstrona ): ?>
  2. <a href=link_do_strony_nr_<?php echo $pagin->FPstrona; ?>poprzedni</a>
  3. <?php else: ?>
  4. poprzedni
  5. <?php endif; ?>
  6. |
  7. <?php foreach( $pagin -> FALLstrona() as $nr ): ?>
  8. <!-- tutaj znow warunek ze dla aktualnej strony nie tworzy linka... -->
  9. <a href="link_do_strony_nr_<?php echo $nr; ?>">$nr</a> |
  10. <?php endif; ?>
  11. |
  12. <!-- tutaj kolejny raz warunek dla tworzenia linka (lub nie) dla "poprzedni"... -->


W szablonie chce umiescic jak najmniej kodu php, niestety w samym stronicowaniu jest tego za duzo, czy macie jakies rozwiazania? Dla podobnej klasy lub calkiem inne rozwiazanie.
hwao
Stronicowanie to rozwiazanie na pograniczu modelu i widoku, stąd te problemy.

Można raczej jedynie napisać tylko helper/plugin/funkcje do renderowania stronicowania z jakiś danych.
b_chmura
Cytat(kicaj @ 18.12.2007, 02:01:36 ) *
W sumie posiadam podobna klase stronicowania, jednak nurtuje mnie wciaz problem integracji z szablonami, otoz tworzymy sobie liste:
Kod
poprzedni | 5 | 6 | 7 | 8 | 9 | nastepny


Kod do powyzszej klasy wygladalby nastepujaca w szablonie:
  1. <?php if( $pagin->FPstrona ): ?>
  2. <a href=link_do_strony_nr_<?php echo $pagin->FPstrona; ?>poprzedni</a>
  3. <?php else: ?>
  4. poprzedni
  5. <?php endif; ?>
  6. |
  7. <?php foreach( $pagin -> FALLstrona() as $nr ): ?>
  8. <!-- tutaj znow warunek ze dla aktualnej strony nie tworzy linka... -->
  9. <a href="link_do_strony_nr_<?php echo $nr; ?>">$nr</a> |
  10. <?php endif; ?>
  11. |
  12. <!-- tutaj kolejny raz warunek dla tworzenia linka (lub nie) dla "poprzedni"... -->


W szablonie chce umiescic jak najmniej kodu php, niestety w samym stronicowaniu jest tego za duzo, czy macie jakies rozwiazania? Dla podobnej klasy lub calkiem inne rozwiazanie.


w takim wypadku stworzyłbym funkcje i odwołałem się do niej w miejscu gdzie chciałbym ją wyświetlić, innego sposobu nie znajdziesz
kicaj
Cytat
Stronicowanie to rozwiazanie na pograniczu modelu i widoku, stąd te problemy.

Można raczej jedynie napisać tylko helper/plugin/funkcje do renderowania stronicowania z jakiś danych.

No wlasnie i jak to najoptymalniej zrobic, ma ktos pomysl...
miccom
Wielkie dzięki. U mnie paginator działa bez zarzutów- super programik;) biggrin.gif Wielkie dzięki dla twórcy:D:D:D
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.