Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [klasa]Stronicowanie
piotrooo89
post
Post #1


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




Jako że OOP od pewnego czasu znam czysto z teori postanowiłem napisać coś co mogłoby mi się przydać. Przerobiłem własny sturkturalny kod stronicowania i teraz prosze was o wszelkie uwagi, rady - konstruktywną krytykę - jak dla laika OOP.

index.php

  1. <?php
  2. include ('stronicowanie-class.php');
  3. include ('mysql.php');
  4.  
  5. if(empty($_GET['start']))
  6. {
  7.  $od = 1;
  8.  $_GET['page'] = 1;
  9. }
  10. else
  11. {
  12.  $od = mysql_escape_string($_GET['start']);
  13. }
  14.  
  15. $str = new Stronicowanie();
  16. $str->pokaz($od);
  17. $str->nawigacja($str->licz_rekordy());
  18. $str->pop_nas($_GET['start'], $str->licz_rekordy());
  19. ?>



stronicowanie-class.php

  1. <?php
  2. class Stronicowanie
  3. {
  4.  public $ile_na_stronie = 20;
  5.   
  6.  public function licz_rekordy()
  7.  {
  8.      $all = mysql_query('SELECT COUNT(*) FROM termin');
  9.      $ile = mysql_result($all, 0);
  10.      return $ile;
  11.  }
  12.  
  13.  public function pokaz($od)
  14.  {
  15.      $sql = mysql_query('SELECT * FROM termin LIMIT '.$od.', '.$this->ile_na_stronie.'');
  16.      while ($row = mysql_fetch_object($sql))
  17.      {
  18.          echo $row->id;
  19.          echo $row->data .'<br>';
  20.      }
  21.  }
  22.  
  23.  public function nawigacja($ile)
  24.  {
  25.      if($ile > $this->ile_na_stronie)
  26.      {
  27.          for($i=0 ; $i<ceil($ile/$this->ile_na_stronie) ; $i++) 
  28.          {
  29.              $b = $i + 1;
  30.              if ($_GET['page']==$b)
  31.              {
  32.                  echo '<a href="'.$_SERVER['PHP_SELF'].'?start='.($i*$this->ile_na_stronie).'&page='.($i+1).'">['.($i+1).']</a> | '; 
  33.              }
  34.              else
  35.              {
  36.                  echo '<a href="'.$_SERVER['PHP_SELF'].'?start='.($i*$this->ile_na_stronie).'&page='.($i+1).'">'.($i+1).'</a> | '; 
  37.              }
  38.          }
  39.      }
  40.  }
  41.  
  42.  public function pop_nas($naw, $ile)
  43.  {
  44.      $next = $naw + $this->ile_na_stronie;
  45.      $prev = $naw - $this->ile_na_stronie;
  46.   
  47.      if ($_GET['start'] == 0)
  48.      {
  49.          echo '<a href="'.$_SERVER['PHP_SELF'].'?start='.$next.'&page='.($_GET['page']+1).'">Następny ></a>';
  50.      }
  51.      elseif (($_GET['start'] > 0) && ($next < $ile))
  52.      {
  53.          echo '<a href="'.$_SERVER['PHP_SELF'].'?start='.$prev.'&page='.($_GET['page']-1).'">< Poprzedni</a> | '; 
  54.          echo '<a href="'.$_SERVER['PHP_SELF'].'?start='.$next.'&page='.($_GET['page']+1).'">Następny ></a>';
  55.      }
  56.      elseif ($next > $this->ile_na_stronie)
  57.      {
  58.          echo '<a href="'.$_SERVER['PHP_SELF'].'?start='.$prev.'&page='.($_GET['page']-1).'">< Poprzedni</a>';
  59.      }
  60.  }
  61. }
  62. ?>
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #2





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




Hmm... Prawdopodobnie ten kod po prostu działa, ale nie jest klasą stronicowania. Wszystko wymieszane (model, widok), wszystko na sztywno "Select from termin", a co jeśli chcę wyciągnąć rekordy z innej tabeli? Nową klasę muszę napisać? To po co mi ta Twoja? Oj (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Cytat
Jako że OOP od pewnego czasu znam czysto z teori (...)

Nie, nie znasz, nie "zaskoczyłeś" jeszcze.

Oczywiście życzę powodzenia (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

0/10

Pozdrawiam
Go to the top of the page
+Quote Post
bim2
post
Post #3





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Tak jak napisał Cysiaczek, to funkcje opakowane w class {} (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Obiekt ma być ułatwieniem w pisaniu, ma być jak bardzo elastyczna funkcja. Do czego służy funkcja? Żeby nie pisać kilka razy tego samego. Co do obiektowości, ciężko mi to wytłumaczyć, ale polega ona na tym aby uprościć pisanie użytkownikowi. Przykład dobrego stronnicowania:
  1. <?php
  2. $iCount = mysql_query('SELECT ......');
  3. $oPager = new Pager($iCount, $_GET['page'], 20);
  4.  
  5. $rQuery = mysql_query('SELECt ...LIMIT '.$oPager->getLimit());
  6.  
  7. echo $oPager->getPager();
  8. ?>
Go to the top of the page
+Quote Post
piotrooo89
post
Post #4


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




dziękuje za opinie, czekam na kolejne.

po raz kolejny zabieram się do przeczytania co to jest OOP. Mam nadzieję że coś już z tego będzie.
Go to the top of the page
+Quote Post
Spawnm
post
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




mieszasz polskie i angielskie nazwy ,
pop_nas($naw, $ile) //hę ?

  1. <?php
  2. public function licz_rekordy()
  3. {
  4.     $all = mysql_query('SELECT COUNT(*) FROM termin');
  5.     $ile = mysql_result($all, 0);
  6.     return $ile;
  7. }
  8. ?>

dał byś

  1. <?php
  2. public function licz_rekordy($tabelka)
  3. {
  4.     $all = mysql_query('SELECT COUNT(*) FROM '.$tabelka);
  5.     $ile = mysql_result($all, 0);
  6.     return $ile;
  7. }
  8. ?>

i było by fajnie bo inne klasy by mogły skorzystać dla innych tabel (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
bim2
post
Post #6





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


A co jak chce stronnicować plik? To nie tak ma działać. Klasa pager ma obliczyć który plik (wiersz) teraz otworzyć oraz wygenerować sam pager. :]
Go to the top of the page
+Quote Post
Kildyt
post
Post #7





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

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


Zacznij używać skróconych warunków. Pisanie klamer nie we wszystkich sytuacjach jest potrzebne.
Jeżeli includujesz plik tylko raz to użyj funkcji include_once.

Całość bardzo kiepska i "sztywna" dla programisty.
Go to the top of the page
+Quote Post
pejott
post
Post #8





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Cytat(Kildyt @ 5.04.2009, 21:32:21 ) *
Zacznij używać skróconych warunków. Pisanie klamer nie we wszystkich sytuacjach jest potrzebne.
Jeżeli includujesz plik tylko raz to użyj funkcji include_once.

Całość bardzo kiepska i "sztywna" dla programisty.


Tylko, że spadek wydajności przy stosowaniu klamer znikomy i niezauważalny, a czytelność kodu znacznie wzrasta.
Co do klasy, to wiadomo, lipton. Poczytaj więcej o OOP, i przepisz swoją klasę, bo jest ona dość prosta w implementacji, więc na początek może być.
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




  1. Za polskie nazwy funkcji/zmiennych należy się chłosta.
    1. <?php
    2. $_SERVER['PHP_SELF']
    3. ?>
    proponowałbym podstawianie własnego skryptu + łączenie z istniejącymi elementami QUERY_STRING
  2. na sztywno ustawiasz zapytania w klasie...

1/10, na zachętę.
Go to the top of the page
+Quote Post
Pilsener
post
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


To jest tragedia, czym to się różni od kawałka kodu typu:

  1. <?php
  2. echo 'coś';
  3.   echo 'ktoś'
  4.   echo 'nicoś';
  5. ?>
który includujesz w miejscu, w którym ma się wyświetlać to stronicowanie i który tak naprawdę nie nadaje się do wykorzystania w żadnym innym miejscu nawet na tej samej stronie? Pomijając już fakt, że potrzebujesz aż dwóch zapytań do bazy i inne szczegóły, ale takiego kodu nie warto nawet analizować.

Kiedyś znalazłem na tym forum i usprawniłem taką funkcję:
  1. <?php
  2. function tresc_pasek($l_odp,$l_odp_nastronie,$l_odp_napasku,$a) { //funkcja tworząca nawigację
  3.   $l_odp_podz = intval($l_odp/$l_odp_nastronie)+1;
  4.   $l_odp_podz_mod = $l_odp%$l_odp_nastronie;
  5.   if($l_odp_podz_mod>0){++$l_odp_podz;}
  6.   if($a>=$l_odp_podz){$a=$l_odp_podz-1;}
  7.   if($a>1){$tablica['prev']=$a-1;}else {$tablica['prev']=0;}
  8.   if($a<=$l_odp_napasku){$koniec=$l_odp_napasku*2+2;}else{$koniec=$a+$l_odp_napasku+1;}
  9.   if($a<=$koniec-$l_odp_napasku){$star=$a-$l_odp_napasku;}
  10.   if($a>=$l_odp_podz-$l_odp_napasku){$star=$l_odp_podz-$l_odp_napasku*2-1;}
  11.   if($koniec>$l_odp_podz){$koniec=$l_odp_podz;}
  12.   if($star<1){$star=1;}
  13.   for($i=$star;$i<$koniec;++$i){
  14.      if($i<$a){$tablica[]=$i;}
  15.      if($i==$a){$tablica['active'] = $i;}
  16.      if($i>$a){$tablica[]=$i;}    
  17.   }
  18.   if($a<$l_odp_podz-1){$tablica['next']=$a+1;}else{$tablica['next']=0;}
  19.   return $tablica;
  20. }
  21. ?>
- podajesz liczbę rekordów, porcję rekordów na stronę, wielkość paska i numer bieżącej strony - funkcja zwraca tablicę stron (z oznaczeniem która jest bieżąca, która pierwsza a która ostatnia i we właściwej kolejności), którą możesz teraz opakować HTML'em - tak to ma działać, pisanie kodu, który ma statycznie echować HTML na monitorze jest bez sensu, a wykorzystywanie w tym celu obiektówki jest jak dla mnie absurdalne.

Podstawą jest:
- wywalenie HTML z kodu
- parametryzacja a parametry wprowadzane do klasy z zewnątrz, a nie definiowane wewnątrz niej
- operowanie na zmiennych (a nie echowanie co popadnie na ekran)

Bo jak sobie wyobrażasz wykorzystanie tego stronicowania? Będę godzinę poprawiał kod HTML i zapytania do bazy, a kiedy już sobie tą "klasę" zaincluduję to zdumiony stwierdzę, że brak zmiennej, którą mogę wyświetlić na stronie a zamiast tego skrypt coś echuje, kiedy ja jeszcze generuję stronę i w efekcie dostanę taki kod:
  1. <a href="">Tu Twoje stronicowanie się wyechuje</a>
  2. <!-- a tu się zaczyna moja strona i nic nie mogę na to poradzić
  3. <html>
- nie mówiąc już o tym, że kiedy będę chciał przekazać do tej "klasy" jakieś parametry (np. liczbę rekordów) to nie będę mógł, bo już się to na ekranie drukuje i drukuje i nie mogę tego powstrzymać! A jak będzie gdzieś dalej jakiś błąd to co? Każe przeglądarce zwrócić czym prędzej to co wyechowałem i odesłać mi z powrotem? Nie sądzisz, że to się kupy nie trzyma?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 17:35