Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyswietlanie elementow, pierwsze klasy katalogu filmowego
k4myk85
post 21.03.2008, 12:55:51
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 23.06.2007

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


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? )

Ten post edytował k4myk85 21.03.2008, 12:57:03
Go to the top of the page
+Quote Post
-=Peter=-
post 21.03.2008, 13:36:26
Post #2





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


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).

Ten post edytował -=Peter=- 21.03.2008, 13:39:07


--------------------
Go to the top of the page
+Quote Post
k4myk85
post 21.03.2008, 20:32:18
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 23.06.2007

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


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
Go to the top of the page
+Quote Post
-=Peter=-
post 21.03.2008, 21:27:53
Post #4





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


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. ?>


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:29