Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: prawidłowosc wzorca mvc
Forum PHP.pl > Forum > Przedszkole
pdfpl
oto skrypt wyswietlajacy tabele mysql
zo zrobic aby byl on prowidlowy pod wzgledm wzorca mvc?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<html xmlns="http://www.w3c.org/1999/xhtml" xml:lang="pl" lang="pl">

<?php

class Model {//obsluguje polaczenie

private $zm_polaczenie;
private $db;

public function __construct($zm_polaczenie, $db) //konstruktor
{
$this->zm_polaczenie = $zm_polaczenie;
$this->db = $db;
$this->polacz();
}

private function polacz() //funkcja polacz
{
if ($zm_polaczenie == null){
$zm_polaczenie = @mysql_connect('xxx', 'xxx', 'xxx');//server user passwd
$db = @mysql_select_db('xxx', $zm_polaczenie);//database
}
return $zm_polaczenie;
}
}

class Widok {//wyswietla dane, moze byc wiele widokow

private $row;
private $result;

public function __construct($row, $result) //konstruktor
{
$this->row = $row;
$this->result = $result;
$this->uruchomPolaczenie();
$this->pokaz();
}

private function uruchomPolaczenie()//konstruktora z klasy Model
{
$this->Model = new Model();
}

private function pokaz() //funkcja pokaz
{
$result = mysql_query('SELECT * FROM program ORDER BY data');

echo "<table border='1'>";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "<tr>";
echo "<td>".$row['data']."</td>";
echo "<td>".$row['punkt_programu']."</td>";
echo "<td>".$row['dokument']."</td>";
echo "</tr>";
}
echo "</table>";
}
}

class Kontroler {//sprawdza dane z geta i decyduje co uruchomic

private $co;

public function __construct() //konstruktor
{
$this->co = $co;
$this->co_uruchomic();
}

private function co_uruchomic() //kontroler
{
$co=$_GET["co"];
if ($co==""){
echo "NIE wybrano widoku.<br><br>";
echo "DOSTĘPNE WIDOKI:.<br>";
echo "* <a href='mvc2.php?co=widok1'>Widok 1</a>";
}
if ($co=="widok1"){
new Widok();//konstruktor klasy Widok
}
}
}

new Kontroler();//uruchamia wzorzec mvc
?>
thek
Primo: BBCode!
Secundo... To co zrobiłeś to pomieszanie wynikające z niedokładnego zrozumienia MVC. Na pewno zaś spojrzawszy na kod od razu rzuca się w oczy wymieszanie tego wszystkiego co zrozumiałeś jako MVC... wewnątrz layoutu, czyli czegoś, za co odpowiada widok. Całość to po prostu kilka klas, które nawzajem się wywołują. Równie dobrze mogły to być zwykłe funkcje i opakowanie tego klasami wcale nie czyni kodu obiektowym, o zgodności z MVC nie wspominając. Zero elastyczności, dane połaczenia na pałę w pliku, uzależnienie tylko od jednego typu bazy (Mysql), brak jakiejkolwiek walidacji danych sensownej (zobacz co robisz z GETem). Krótko mówiąc nie zrozumiałeś dobrze idei tych trzech literek i konsekwencji ich użycia. O zgodności z jakąkolwiek formą standardu html nawet nie wspominałbym, ale od kiedy meta jest przed html a body czy head nie istnieje, tylko od razu tworzy table? U Ciebie masz kawałek html (błędny zresztą) a zaraz potem wywołanie klasy kontroler, która ma zrobić w cudowny sposób resztę.
pdfpl
dobra to jak wyswietlic zawartosc tabeli bazy mysql wraz z polaczeniem uzywajac mvc ?
skowron-line
  1. class controller_user
  2. {
  3. public function users()
  4. {
  5. $model = new model_user();
  6. $view->users = $model->get_users();
  7. $view->render('users.html');
  8. }
  9. }
  10.  
  11.  
  12. class model_user extends model_connect
  13. {
  14. public function get()
  15. {
  16. return //... dane z tabeli
  17. }
  18. }

a plik users.html jest widokiem, zwykły html przemieszany z phpem.
edit:
http://php.pl/Wortal/Artykuly/PHP/Architek...wadzenie-do-MVC
http://phpedia.pl/wiki/MVC
pdfpl
nie do konca rozumien mozesz w kodzie ktory wklejam czyli widok tabeli mysql z polaczeniem zmienic i wskazac elementy mvc ?

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3.  
  4. <html xmlns="http://www.w3c.org/1999/xhtml" xml:lang="pl" lang="pl">
  5.  
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  8. </head>
  9.  
  10. <body>
  11.  
  12. <?php
  13.  
  14. class Model {//obsluguje polaczenie
  15.  
  16. private $zm_polaczenie;
  17. private $db;
  18.  
  19. public function __construct($zm_polaczenie, $db) //konstruktor
  20. {
  21. $this->zm_polaczenie = $zm_polaczenie;
  22. $this->db = $db;
  23. $this->polacz();
  24. }
  25.  
  26. private function polacz() //funkcja polacz
  27. {
  28. if ($zm_polaczenie == null){
  29. $zm_polaczenie = @mysql_connect('serw', 'user', 'pass');//server user passwd
  30. $db = @mysql_select_db('db', $zm_polaczenie);//database
  31. }
  32. return $zm_polaczenie;
  33. }
  34. }
  35.  
  36. class Widok {//wyswietla dane, moze byc wiele widokow
  37.  
  38. private $row;
  39. private $result;
  40.  
  41. public function __construct($row, $result) //konstruktor
  42. {
  43. $this->row = $row;
  44. $this->result = $result;
  45. $this->uruchomPolaczenie();
  46. $this->pokaz();
  47. }
  48.  
  49. private function uruchomPolaczenie()//konstruktora z klasy Model
  50. {
  51. $this->Model = new Model();
  52. }
  53.  
  54. private function pokaz() //funkcja pokaz
  55. {
  56. $result = mysql_query('SELECT * FROM program ORDER BY data');
  57.  
  58. echo "<table border='1'>";
  59. while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  60. echo "<tr>";
  61. echo "<td>".$row['data']."</td>";
  62. echo "<td>".$row['punkt_programu']."</td>";
  63. echo "<td>".$row['dokument']."</td>";
  64. echo "</tr>";
  65. }
  66. echo "</table>";
  67. }
  68. }
  69.  
  70. class Kontroler {//sprawdza dane z geta i decyduje co uruchomic
  71.  
  72. private $co;
  73.  
  74. public function __construct() //konstruktor
  75. {
  76. $this->co = $co;
  77. $this->co_uruchomic();
  78. }
  79.  
  80. private function co_uruchomic() //kontroler
  81. {
  82. $co=$_GET["co"];
  83. if ($co==""){
  84. echo "NIE wybrano widoku.<br><br>";
  85. echo "DOSTĘPNE WIDOKI:.<br>";
  86. echo "* <a href='mvc2.php?co=widok1'>Widok 1</a>";
  87. }
  88. if ($co=="widok1"){
  89. new Widok();//konstruktor klasy Widok
  90. }
  91. }
  92. }
  93.  
  94. new Kontroler();//uruchamia wzorzec mvc
  95. ?>
  96.  
  97. </body>
  98. </html>
thek
To ja zapytam inaczej... ozumiesz własciwie MVC? Czy czytałeś przyklejony temat Temat: MVC ? Czy czytałes podane w nim linki? Myślę, że nie bardzo. Gdyby było inaczej Twój temat by nie zaistniał. A doczytałeś może ostatnią uwagę tego tematu i zamykaniu tematów związanych z MVC? Naprawde tak bardzo zależy Ci pierwszymi postami i tematem zaliczenie się do grona "nieczytatych"? Wziąłem i wyciąłem Ci też dane dostepowe, bo jak widzę zapomniałes przy wklejaniu posta powyżej...
pdfpl
tak czytalem ale potrzebuje konkretnego przykladu. jezeli mozesz to napisz jak zmienic taki przyklad any byl zgodny z mvc ?
pedro84
Mały offtop, ale jakbyś przeczytał przyklejony temat czy też odpowiedź @skowron-line to byś takich pytań nie zadawał.

Ten temat z podanego tematu przyklejonego idealnie wyjaśnia o co kaman...
thek
Po pierwsze zacząłbym od tego, że poczytałbym o różnicy między Kontrolerem i Routerem. Dla Ciebie to jednoznaczne.
Kontroler: Dla Ciebie albo jest to widok1 albo brak. A co jeśli widoków będzie 100? Zrobisz switcha ze 100 case'ów?
Model: ograniczyłeś do jednego, na sztywno wpisanego do modelu. A co jeśli zmienią sie dane? Grzebać będziesz w pliku tym i szukać gdzie robisz połaczenie? A co jesli ktoś nie ma Mysql tylko Pgsql lub Mssql czy Firebirda? Wszystkie funkcje mysql_* możesz właśnie wyrzucić na śmietnik.
Widok: Konstruktor mnie zdziwił... Pobierasz konstruktorem dane, ale jdnoczesnie otem tworzysz połączenie do bazy... Dziwna kolejność.

Prześledź sobie co się dzieje:
Walisz od razu kawał kodu w HTML, potem napotykamy
Kontroler->__construct()
Wewnątrz konstruktora $this->co uruchomic()
To może wywołać new Widok->__construktor() BEZ PARAMETRÓW na co się wkurzy interpreter i sypnie że jak to tak? Bo brak wartości domyślnych, ale bądźmy dobrzy i pozwólny by dał sobie NULLe...
Wywołujemy Widok>uruchomPolaczenie()
co wykopie nam Model() i jego konstruktor.
Ten przy Model->połacz, sprawdzi czy takie połaczenie istnieje, i jesli nie to utworzy je, a jeśli tak to zwróci jego identyfikator.
Pytanie o sens tego drugiego jest tylko gdy robisz to kilkukrotnie w obrębie skryptu jednego (czas życia) - stworzyleś niezbyt lubiany singleton wink.gif
Teraz dalej Widok->pokaż() i plujesz na domyślnym połaczeniu html.. A skąd ja niby wiem jakie połaczenie użyć? A co jeśli jest kilka jednocześnie? Widok sobie zgaduje którego użyć? wink.gif Yak czy inaczej plujesz niepoprawnym HTMLem do przegladarki bo brak Ci sekcji head i body. Naprawdę nie widzisz tu problemu? To nie ma zbytnio rąk i nóg. Jest strasznie ograniczające. A teraz przypuśćmy zamiast pliku HTML chcesz wypluć te dane jako XML... Cały kontroler, widok i model piszesz od nowa?

Nawet jeśli podane tematy czytałeś, to kompletnie nie rozumiesz idei i robisz ją "po swojemu", chcac przykładu, który by był jakiś rozsądny, choć troszkę elastyczny, wymaga napisania conajmniej kilkunastu, w tym część abstrakcyjnych. I chcesz by Ci to teraz dać na tacy. Bo to co dałeś z MVC nie ma wiele wspólnego poza podziałem (i to jeszcze niezbyt poprawnym) na 3 warstwy. Ja bym własciwie pytanie "Co jest źle?" zamienił "Co jest dobrze?" bo przynajmniej mniej pisania by było wink.gif
piotrooo89
gdzie tu rozmowa o MVC jak tu nawet podstaw OOP nie ma ?
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.