Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyswietlanie elementow
Forum PHP.pl > Forum > PHP > Object-oriented programming
k4myk85
Witam

Od jakiegos czasu sledze to co dzieje sie na tym subforum. Kupilem ksiazke i powoli ucze sie OOP. Mam w szkole projekt do zrobienia i rzucilem sie na gleboka wode (jak dla mnie) z tematem katalogu filmowego w OOP. Ehh nie moge juz zmienic tego wyboru. Mieszajac wiedze z ksiazek i tego forum "cos" pisze. Przedstawie wam krotko 3 klasy jakie napisalem i zalezy mi ta tym zeby ktos powiedzial czy zmierzam w dobra strone lub czy powinienem na problem spojrzec z innej lepszej strony

okrojona klasa DB
  1. <?php
  2. function fetch_row($query_result)
  3.  {
  4. $query_result = (empty($query_result)) ? $this -> query_result : $query_result;
  5. $array = mysql_fetch_array($query_result);
  6. if(!$array)
  7. {
  8.  return false;
  9. }
  10. else
  11. {
  12.  return $array;
  13. }
  14.  }
  15.  
  16. public function ask($query){ 
  17. $result = mysql_query($query) or die("Zapytanie niepoprawne");
  18. return $result;
  19. }
  20. ?>


Klasa Movie
  1. <?php
  2. class Movie 
  3. {
  4.  
  5. private $id = null;
  6. private $title = null;
  7. private $premiere = null;
  8. // ... i wiecej nie bede na forum pisal wszystkich
  9.  
  10.  
  11. public function __construct(array $row)
  12. {
  13. isset($row['id'])$this->set__('id',$row['id']): '';
  14. isset($row['title'])$this->set__('title',$row['title']): '';
  15. isset($row['premiere'])$this->set__('premiere',$row['premiere']): '';
  16. // ...
  17. }
  18.  
  19. public function set__($var,$val) 
  20. {
  21. $this->$var = $val;
  22. }
  23.  
  24. public function get__($var) 
  25. {
  26. return $this->$var;
  27. }
  28. //-
  29. }
  30. ?>


Klasa MovieManager (ktora ma pobierac i zarazem wyswietlac info o filmioe liste itp wykorzystujac klase Templates)
  1. <?php
  2. include('class.DB.php');
  3. include('class.Movie.php');
  4. //include('class.Templates.php');
  5. class MovieManager 
  6. {
  7.  
  8. public $db;
  9. public $tpl;
  10.  
  11. function __construct($db) 
  12. {
  13. $this->db=$db;
  14. $this->tpl= new Templates;
  15. } 
  16.  
  17. public function getMovie($id)
  18. {
  19.  
  20. $sql="SELECT * FROM db_movies WHERE id='".$id."' LIMIT 1";
  21. $result = $this->db->ask($sql);
  22.  
  23. $row = array();
  24. while($row = $this->db->fetch_row($result)) 
  25. {
  26. $row['id'] = $result['id'];
  27. $row['title'] = $result['mv_title'];
  28. $row['premiere'] = $result['mv_premiere'];
  29. // ...
  30.  
  31. //return new Movie($row);
  32. $mve = new Movie($row);
  33. }
  34. return $mve;
  35. }
  36.  
  37. public function getSevenMovies()
  38. {
  39.  
  40. $sql="SELECT * FROM db_movies LIMIT 7";
  41. $result = $this->db->ask($sql); 
  42.  
  43. $evts = array();
  44. $row = array();
  45.  
  46. while($Temp = $this->db->fetch_row($result)) 
  47. {  
  48. $row['id'] = $Temp['id'];
  49. $row['title'] = $Temp['mv_title'];
  50.  
  51. $evts[] = new Movie($row);
  52. }
  53. return $evts;
  54. }
  55.  
  56. public function printMovieDetails()
  57. {
  58.  print "> ".$evt->get__('title')." < <br />"; // nie dziala
  59. }
  60.  
  61. public function printMoviesList()
  62. {
  63.  
  64. $this->tpl->load('commingMovies');
  65. $this->tpl->blocks[] = array(...);
  66. $this->tpl->parse();
  67. foreach( (array)$this->getCommingMovies() as $this->evts ) 
  68. {
  69. $this->tpl->display(); // - nie widac textow z bazy
  70. print $this->evts->get__('title')."<br />"; //OK
  71. }
  72. }
  73.  
  74. //-
  75. }
  76. ?>


Prosze o ocene i pomoc ( jak wyswietlac elementy? )
-=Peter=-
Możesz zrobić klasę Movie w taki sposób (prostrzy):

  1. <?php
  2. class Movies{
  3. $fields = array('id', 'title', 'premiere');
  4. $data = array();
  5.  
  6. public function __construct(array $data){
  7. $this->setData($data);
  8. }
  9.  
  10. public function setData($data){
  11. foreach($data as $k => $v){
  12. if(in_array($k, $this->fields))
  13. $this->data[$k] = $v;
  14. }
  15. }
  16. }
  17.  
  18. public function __get($name){
  19. $method = 'get'.ucfirst(strtolower($name));
  20.  
  21. if(method_exists($this, $method)){
  22. call_user_func(array($this, $method));
  23. }else{
  24. if(in_array($name, $this->fields){
  25. return $this->data[$name];
  26. }else{
  27. //wyrzucenie wyjatku? zwrocenie false?
  28. return false;
  29. }
  30. }
  31. }
  32.  
  33. public function __set($name, $value){
  34. $method = 'set'.ucfirst(strtolower($name));
  35.  
  36. if(method_exists($this, $method)){
  37. call_user_func(array($this, $method), $value);
  38. }else{
  39. if(in_array($name, $this->fields){
  40. $this->data[$name] = $value;
  41. }else{
  42. //wyrzucenie wyjatku? zwrocenie false?
  43. return false;
  44. }
  45. }
  46.  
  47. }
  48. }
  49. ?>


Możesz ten szkielet wyodrębnić w klasie abstrakcyjnej i Movie by po nim dziedziczyło.

  1. <?php
  2. public function printMovieDetails()
  3. {
  4.  print "> ".$evt->get__('title')." < <br />"; // nie dziala
  5. }
  6. ?>

To Ci nie działa, bo zmienna $evt jest wzięta z powietrza, nie została zdeklarowana, czy podana jako parametr do metody. Pozatym widzę wiele błędów w klasie MovieManager, używasz atrybutu "evt", a nie jest on zdefinowany w ciele klasy, stąd te błędy.

  1. <?php
  2. foreach( (array)$this->getCommingMovies() as $this->evts ) {}
  3. ?>


Takie coś nie powinno mieć miejsca ($this->evts nie jest zdeklarowane jako atrybut klasy)... Użyj poprostu:
  1. <?php
  2. foreach( (array)$this->getCommingMovies() as $evts ) {}
  3. ?>


Jeśli już używasz klasy widoku (Templates), to taka metoda jak printMovieDetails jest niepotrzebna. Metody w klasach mają nic nie wyświetlać, tylko zwracać. Wyświetlaniem zajmuje się widok (chyba że nie stosujesz MVC).
k4myk85
Dzieki bardzo za ta odpowiedz. Licze na kolejne...

Nie uzywam framework'ow. Chce nauczyc sie oop tylko troszeczke zle boisko wybralem (szkola) ;p. Ten sposob na klase Movie jest ciekawy. Dzisiaj w nocy posiedze nad MovieManager bo faktycznie sajgon z tej klasy. Co do wyswietlania elementow tablicy... obiektow to zrobic osobna klase ktora bedzie dziedziczyla z Templates i odpowiednio umieszczala dane w tabelkach z plikow tpl? Nie chce umieszczac kodu html w klasach bo czytalem ze to jest 'nieladne' tak jak uzywanie print i echo (tak jest w dosyc sporej ilosci ksiazek na temat php oop).


Przy okazji pozdrawiam i Zycze Wesolych Swiat i mokrego Dyngusa
-=Peter=-
To co chcesz zaimplementować przypomina DAO (taki wrzorzec).

Oto jak bym widział klasę MoviesManager (oczywiście uproszczoną):

  1. <?php
  2. class MoviesManager{
  3. private $hDb = null;
  4.  
  5. public function __construct(){
  6. $this->hDb = Database::instance();
  7. }
  8.  
  9. /**
  10.  * Zwraca podany obiekt filmu
  11.  */
  12. public function getMovie($id){
  13. $aMovie = $this->hDb->query("SELECT * FROM movies WHERE id='$id';");
  14.  
  15. $movie = new Movie($aMovie);
  16. return $movie;
  17. }
  18.  
  19. /**
  20.  * Zwraca tablice obiektow
  21.  */
  22. public function getAllMovies($limit = null){
  23. $l = '';
  24. if(is_numeric($limit)){
  25. $l = ' LIMIT '.$limit;
  26. }
  27. $query = 'SELECT * FROM movies'.$limit.';';
  28. //zakladam ze Database::getAll zwraca to samo co metoda rozszerzenia PEAR DB::getA
    ll
  29.  
  30. $aMovies = $this->hDb->getAll($query);
  31.  
  32. $movies = array();
  33.  
  34. foreach($aMovies as $aMovie){
  35. $movies[] = new Movie($aMovie);
  36. }
  37.  
  38. return $movies;
  39. }
  40. }
  41.  
  42. //zastosowanie
  43. $mm = new MoviesManager();
  44.  
  45. $movie = $mm->getMovie(1);//pobiera film o id=1
  46. $movies = $mm->getAllMovies(7);//pobiera siedem filmow
  47. ?>
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.