Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [class] Pager
Forum PHP.pl > Inne > Oceny
phpion
Hej!
Splodzilem nowa, mala, klase sluzaca do przestawiania pagera.
Oto jej kod zrodlowy:
  1. <?php
  2. class Pager
  3. {
  4. private $total;
  5. private $current;
  6. private $pageHandler;
  7. private $formats = Array(
  8. 'main' => '<a href="%s">%d</a>',  // glowny link
  9. 'mainActive' => '<b>%d</b>',  // numer aktualnej strony
  10. 'begin' => '<a href="%s">|<</a>', // powrot na poczatek
  11. 'beginUnActive' => '|<',  // nieaktywny powrot na poczatek
  12. 'end' => '<a href="%s">>|</a>', // przeskok na koniec
  13. 'endUnActive' => '>|',  // nieaktywny przeskok na koniec
  14. 'next' => '<a href="%s">>></a>',  // nastepna strona
  15. 'nextUnActive' => '>>', // nieaktywna nastepna strona
  16. 'previous' => '<a href="%s"><<</a>', // poprzednia strona
  17. 'previousUnActive' => '<<', // nieaktywna poprzednia strona
  18. 'pause' => '...', // pauza miedzy czescia lewa, glowna, prawa
  19. 'separator' => ' '  // separator poszczegolnych elementow
  20. );
  21. private $config = Array(
  22. 'leftShift' => 2, // wypisywanie x liczb z poczatku
  23. 'mainShift' => 3, // wypisywanie x liczb z lewej i prawej strony aktualnej
  24. 'rightShift' => 2 // wypisywanie x liczb na koncu
  25. );
  26.  
  27. public function __construct($total, $pageHandler = 'page')
  28. {
  29. if (isset($_GET[$pageHandler]) && (int)$_GET[$pageHandler] < 1 || !isset($_GET[$pageHandler]))
  30. $current = 1;
  31. elseif (isset($_GET[$pageHandler]) && (int)$_GET[$pageHandler] > $total)
  32. $current = $total;
  33. else
  34. $current = (int)$_GET[$pageHandler];
  35.  
  36. $this->total = $total;
  37. $this->current = $current;
  38. $this->pageHandler = $pageHandler;
  39. }
  40.  
  41. private function replacePage($new)
  42. {
  43. if (eregi($this->pageHandler."=", $_SERVER['REQUEST_URI']))
  44. return str_replace($this->pageHandler."=".$this->current, $this->pageHandler."=".$new, $_SERVER['REQUEST_URI']);
  45. elseif (count($_SERVER['argv']) == 0)
  46. return $_SERVER['REQUEST_URI']."?".$this->pageHandler."=".$new;
  47. else
  48. return $_SERVER['REQUEST_URI']."&".$this->pageHandler."=".$new;
  49. }
  50.  
  51. public function createPager()
  52. {
  53. $arrayTemp = Array();
  54.  
  55. $arrayTemp[] = ($this->current > 1) ? sprintf($this->formats['begin'], $this->replacePage(1)) : sprintf($this->formats['beginUnActive']);
  56.  
  57. $arrayTemp[] = ($this->current > 1) ? sprintf($this->formats['previous'], $this->replacePage($this->current - 1)) : sprintf($this->formats['previousUnActive']);
  58.  
  59. if ($this->config['leftShift'] + $this->config['mainShift'] + $this->config['rightShift'] >= $this->total)
  60. for ($i = 1; $i <= $this->total; $i++)
  61. $arrayTemp[] = ($i == $this->current) ? sprintf($this->formats['mainActive'], $i) : sprintf($this->formats['main'], $this->replacePage($i), $i);
  62. else
  63. {
  64. $pauseBefore = $pauseAfter = FALSE;
  65.  
  66. $left = 1 + $this->config['leftShift'];;
  67. $mainLeft = ($this->current - $this->config['mainShift'] >= 1) ? $this->current - $this->config['mainShift'] : 1;
  68. $mainRight = ($this->current + $this->config['mainShift'] <= $this->total) ? $this->current + $this->config['mainShift'] : $this->total;
  69. $right = $this->total - $this->config['rightShift'];
  70.  
  71. $start = ($right < $mainRight) ? $mainRight + 1 : $right + 1;
  72. $stop = ($left >= $mainLeft) ? $mainLeft : $left;
  73.  
  74. for ($i=1; $i<$stop; $i++)
  75. {
  76. $arrayTemp[] = sprintf($this->formats['main'], $this->replacePage($i), $i);
  77. $pauseBefore = TRUE;
  78. }
  79.  
  80. if ($pauseBefore == TRUE)
  81. $arrayTemp[] = sprintf($this->formats['pause']);
  82.  
  83. for ($i = $mainLeft; $i<=$mainRight; $i++)
  84. $arrayTemp[] = ($i == $this->current) ? sprintf($this->formats['mainActive'], $i) : sprintf($this->formats['main'], $this->replacePage($i), $i);
  85.  
  86. $arrayTemp[] = sprintf($this->formats['pause']);
  87.  
  88. for ($i=$start; $i <= $this->total; $i++)
  89. {
  90. $arrayTemp[] = sprintf($this->formats['main'], $this->replacePage($i), $i);
  91. $pauseAfter = TRUE;
  92. }
  93.  
  94. if ($pauseAfter != TRUE)
  95. unset($arrayTemp[(count($arrayTemp) - $this->config['rightShift'] + 1)]);
  96. }
  97.  
  98. $arrayTemp[] = ($this->current + 1 <= $this->total) ? sprintf($this->formats['next'], $this->replacePage($this->current + 1)) : sprintf($this->formats['nextUnActive']);
  99.  
  100. $arrayTemp[] = ($this->current < $this->total) ? sprintf($this->formats['end'], $this->replacePage($this->total)) : sprintf($this->formats['endUnActive']);
  101.  
  102. return implode($this->formats['separator'], $arrayTemp);
  103. }
  104. }
  105. ?>

Chcialem, aby calosc byla jak najprostsza w pozniejszym uzyciu i tak wykorzystanie klasy sprowadza sie do:
  1. <?php
  2. $pager = new Pager(20);
  3. echo $pager->createPager();
  4. ?>

Pierwszym parametrem jest liczba wszystkich stron, drugi (opcjonalny) parametr to zmienna sluzaca do przechowywania numeru strony (domyslnie: page).
Klasa generuje 2 rodzaje pagera:
- jesli liczba stron jest mniejsza od sumy zakresow z configa:
  1. |< << 1 2 3 4 5 6 >> >|

- lub w przeciwnym wypadku ucina liste (wyobrazmy sobie np. wypisane jak powyzej linki np. do 100 stron tongue.gif):
  1. |< << 1 2 ... 9 10 11 12 13 14 15 ... 19 20 >> >|

Prosilbym o ocene tej klasy (dopiero zaczynam przygode z OOP) oraz o pomoc: w momencie gdy recznie w adresie przegladarki ustalimy page na wieksza niz podana w konstruktorze skrypt zachowuje sie dziwnie: kazdy link prowadzi do tejze podstrony... Przeciez jest warunek w konstruktorze... Poza tam odwolanie do $_GET jest tylko w 1 miejscu. Prosilbym o spojrzenie na ten bug... Z gory dzieki! smile.gif
mike
Cytat(phpion.com @ 10.08.2006, 18:25 ) *
Prosilbym o ocene (...)

Na forum jest specjalne miejsce do ocen.
Przenoszę z Przedszkola.
phpion
Wiem, ale uznalem ze ta klasa jest za mala zeby ja dawac do dzialu 'Oceny'. Chodzilo mi o ogolny rzut okiem na to no i o pomoc w rozwiazaniu tego problemu o ktorym pisalem.
hwao
Kod
        'next' => '<a href="%s">>>',     // nastepna strona

Paskudne smile.gif powinienes uzyć ENCJI (>>)

Dane w takiej klasie powinny byc wprowadzane z zewnatrz a nie
  1. <?php
  2. if (isset($_GET[$pageHandler]) && (int)$_GET[$pageHandler] < 1 || !isset($_GET[$pageHandler]))
  3. ?>

podobnie z SERVER
phpion
Rozumiem. Czyli wszystkie dane ustawiac za pomoca metod? Natomiast nie rozumiem pierwszej uwagi... chodzi o &glt; ?
Ale dzieki za odpowiedz, wlasnie o takie rzeczy mi chodzilo, chce sie uczyc dorbze i miec dobre nawyki.
Ogolnie: czy nie nalezaloby robic tworzenia pagera np. na funtion tworzaca poczatek, poprzedni, liste glowna, nastepny i koniec? I dopiero na koncu laczyc to w calosc?
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.