Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa]Stronicowanie
Forum PHP.pl > Inne > Oceny
piotrooo89
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. ?>
Cysiaczek
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 sad.gif

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

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

Oczywiście życzę powodzenia smile.gif

0/10

Pozdrawiam
bim2
Tak jak napisał Cysiaczek, to funkcje opakowane w class {} 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. ?>
piotrooo89
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.
Spawnm
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 smile.gif
bim2
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. :]
Kildyt
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.
pejott
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ć.
erix
  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ę.
Pilsener
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?
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.