Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Poprawnosc kodu wzorca MVC, i gdzie pisac widok?
adrianpl20
post
Post #1





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Witam. Zacząłem naukę o klasach i wzorcu MVC. Napisałem jako pierwsze takie "coś" w formie ćwiczenia. Prosiłbym o sprawdzenie tego kodu i o podpowiedzenie mi, czy poprawnie te klasy, metody oraz kod w nich, napisałem, i gdzie tworzy się widok? Tak jak teraz to zrobiłem w klasie View z wykorzystaniem switch'y, czy powinno się includować plik html z widokiem? Z góry dziękuję za pomoc.

index.php
  1. <?php
  2.  
  3. require_once 'classes.php';
  4.  
  5. ?>
  6.  
  7. <html>
  8. <head>
  9. <link rel="stylesheet" href="main.css" type="text/css" />
  10.  
  11. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  12. </head>
  13. <body>
  14.  
  15. <div class="page">
  16. <div class="top"></div>
  17.  
  18. <a href="?page=kontakt">Kontakt</a>
  19. <a href="?page=pomoc">Pomoc</a>
  20. <a href="?page=oferta">Oferta</a>
  21.  
  22. <?php
  23.  
  24. $controller = new Controller();
  25. $controller->load();
  26.  
  27.  
  28.  
  29. ?>
  30.  
  31. elo
  32. </div>
  33. </body>
  34. </html>


classes.php
  1. <?php
  2.  
  3. class Model {
  4.  
  5. }
  6. class View {
  7.  
  8. public function showPage($param) // protected
  9. {
  10. switch($param)
  11. {
  12. case 'kontakt':
  13. {
  14. echo '<div><b>Kontakt</b></div>';
  15. echo '<p>Jesli chcesz sie z nami skontaktowac napisz do nas na adres email</p>';
  16.  
  17. break;
  18. }
  19. case 'pomoc':
  20. {
  21. echo '<div><b>Pomoc</b></div>';
  22. echo '<p>Nie udzielamy pomocy, spierniczac.</p>';
  23.  
  24. break;
  25. }
  26. case 'oferta':
  27. {
  28. echo '<div><b>Oferta</b></div>';
  29. echo '<p>Oferujemy wszystko i nic, za darmo i drogo.</p>';
  30.  
  31. break;
  32. }
  33. }
  34. }
  35.  
  36. }
  37. class Controller {
  38.  
  39. private $page;
  40. private $view;
  41.  
  42. public function load()
  43. {
  44. $this->page = $_GET['page'];
  45. $this->view = new View;
  46.  
  47. switch($this->page)
  48. {
  49. case 'kontakt':
  50. $this->view->showPage('kontakt');
  51. break;
  52.  
  53. case 'pomoc':
  54. $this->view->showPage('pomoc');
  55. break;
  56.  
  57. case 'oferta':
  58. $this->view->showPage('oferta');
  59. break;
  60. }
  61. }
  62.  
  63. }
  64.  
  65.  
  66. ?>


Ten post edytował adrianpl20 20.02.2014, 12:57:07
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Do kodu PHP uzywa sie BBCODE PHP. Prosze poprawic.

Klasa View nie powinna miec w sobie calego kodu HTML. Klasa View ma wczytywac odpowiedni plik z widokiem
Go to the top of the page
+Quote Post
adrianpl20
post
Post #3





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Poprawione.

Okej plik, rozumiem, a poza tym wszystko jest w porządku? Na innym forum, ktoś mi napisał, że ten kod ma mało wspólnego z MVC i że można/łatwiej użyć jeszcze FrontControllera (sprawdzałem na wiki, to dodatkowy wzorzec chyba do uzycia z MVC), czy jest on uzywany, potrzebny?

Ten post edytował adrianpl20 20.02.2014, 13:01:19
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Google: "MVC php"

1-szy wynik:
http://ferrante.pl/frontend/php/wzorzec-mvc-w-php/

Go to the top of the page
+Quote Post
adrianpl20
post
Post #5





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Coś tam "namazałem" od nowa, prosiłbym o sprawdzenie struktury i kodu (po maks. kilkanascie linijek w pliku wiec nie duzo) http://www.sendspace.com/file/bn7n5f Z góry dziękuję.
Go to the top of the page
+Quote Post
Daimos
post
Post #6





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Pod tym linkiem, który teraz podałeś jest jakaś dziwna strona z milionem reklam, a gdzie kod?
(IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Pyton_000
post
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


@up trol?
https://fs04n4.sendspace.com/dl/08a56dffaa3...n7n5f/httpd.rar
Go to the top of the page
+Quote Post
Daimos
post
Post #8





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


no bez jaj Panowie, niedługo zaczną na chomiki wrzucać albo inne cuda, przecież to nie jest biblioteka zenda, żeby nie można było pokolorować na forum
Go to the top of the page
+Quote Post
adrianpl20
post
Post #9





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Nie chciałem tworzyć w kij długiego postu, pomyslałem że tak bedzie łatwiej przejrzeć. Proszę o pomoc, czekam juz kilka dni i to mnie blokuje przed dalszą nauką...

Ten post edytował adrianpl20 23.02.2014, 00:18:46
Go to the top of the page
+Quote Post
Posio
post
Post #10





Grupa: Zarejestrowani
Postów: 417
Pomógł: 44
Dołączył: 23.06.2011

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


To do cholery wstaw kod, bo nikt tu lewych paczek nie chce ściągać...
Go to the top of the page
+Quote Post
adrianpl20
post
Post #11





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Okej, proszę, kod:

struktura katalogów:
/controllers/
/views/
/models/
/index.php

/controllers/controller.php
  1. <?php
  2.  
  3. class Controller {
  4.  
  5. public function loadView($path)
  6. {
  7. require_once 'views/head.php';
  8. require_once $path;
  9. require_once 'views/footer.php';
  10. }
  11.  
  12. }
  13. ?>


/controllers/index.php
  1. <?php
  2.  
  3. class indexController extends Controller {
  4.  
  5. public function index()
  6. {
  7. $this->loadView('views/index.php');
  8. }
  9. }
  10. ?>


/controllers/kontakt.php
  1. <?php
  2.  
  3. class kontaktController extends Controller {
  4.  
  5. public function index()
  6. {
  7. $this->loadView('views/kontakt.php');
  8. }
  9. }
  10. ?>


/views/view.php
  1. <?php
  2.  
  3. class View {
  4.  
  5. public function __construct() {
  6. require_once 'head.php';
  7. }
  8.  
  9. public function __destruct() {
  10. require_once 'footer.php';
  11. }
  12. }
  13.  
  14.  
  15. ?>


/views/head.php
  1. <html>
  2. <head>
  3. <title>Strona glownA</title>
  4. </head>
  5. <body>


/views/footer.php
  1.  
  2. <div class="footer">
  3. Copyright &copy; 2014
  4. </div>
  5. </body>
  6. </html>


/views/index.php
  1. <h3>Witaj na stronie glownej</h3>
  2.  
  3. <ul>
  4. <li>Co tam?</li>
  5. <li>Jak sie masz?</li>
  6. </ul>


/views/kontakt.php
  1. <h3>Skontaktuj sie z nami</h3>
  2.  
  3. <ul>
  4. <li>Napisz email</li>
  5. <li>Spadaj</li>
  6. </ul>


/models/
brak plików

/index.php
  1. <?php
  2.  
  3. require_once 'controllers/controller.php';
  4. require_once 'views/view.php';
  5.  
  6.  
  7. function prepareUri($str)
  8. {
  9. return basename(trim($str));
  10. }
  11.  
  12. if(!empty($_GET['page']))
  13. {
  14. $page = prepareUri($_GET['page']);
  15. }
  16. else
  17. {
  18. $page = 'index';
  19. }
  20.  
  21. if(!empty($_GET['action']))
  22. {
  23. $page_action = prepareUri($_GET['action']);
  24. }
  25. else
  26. {
  27. $page_action = 'index';
  28. }
  29.  
  30. if(file_exists('controllers/'.$page.'.php')) // sprawdzam czy istnieje kontroler
  31. {
  32. require_once 'controllers/'.$page.'.php'; // wczytuje plik kontrolera
  33.  
  34. $temp = $page.'Controller';
  35. $controller = new $temp(); // tworze obiekt kontrolera
  36. $controller->$page_action(); // wywoluje akcje kontrolera
  37. }
  38. else // jesli kontroler nie istnieje
  39. {
  40. header('Status: 404 Not Found');
  41. echo '<html><body><h1>Page Not Found</h1></body></html>';
  42. }
  43.  
  44. ?>


Ten post edytował adrianpl20 23.02.2014, 11:53:11
Go to the top of the page
+Quote Post
Posio
post
Post #12





Grupa: Zarejestrowani
Postów: 417
Pomógł: 44
Dołączył: 23.06.2011

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


jak pozamykasz wszystko w [/php] a nie [/code] to będzie idealnie.

Ogólnie interpretacja tego jak powinien wyglądać wzorzec MVC jest różna. Ile frameworków tyle interpretacji. W jednych kontroler posiada xxxx linijek kodu a w innych xx z tym że xxxx linijek jest zawartych w modelu.

Oólnie to wygląda tak (łopatologicznie tak jak tylko potrafię) Kontroler - jest czymś w rodzaju pośrednika, zarządza logiką czyli tym "CO JAK GDZIE" Model - to jest nasze "COŚ" czyli najczęściej wyniki jakiś zapytań z bazy które później chcemy umieścić w widoku.
No i widok jest to sposób prezentacji. Ale to tak trochę wstępnie... W każdym razie staraj się robić tak (mówię trochę przyszłościowo), że po zmianie czegoś w modelu, nie jesteś zmuszony do zmiany czegoś w kontrolerze. Staraj się separować te 3 rzeczy, jak tylko najbardziej potrafisz. Rób tak, aby każda z nich była niezależna.
Moim zdaniem niepotrzebnie już pomieszałeś tutaj widok z kontrolerem (metoda loadView). Kombinuj tak, żebyś zasobami widoku operował W WIDOKU.

Czyli jeśli już zdecydowałeś się na taką formę prezentacji treści, postaraj się, żeby to się odbywało mw tak:
  1. $view->setHeader('heder.html');
  2. $view->setContent('>> TUTAJ TWOJA TREŚĆ <<');
  3. $view->render();

moim zdaniem powinieneś z miejsca pomyśleć o tym jak stworzyć coś na wzór layoutu i "ładowarki" do niego. Ale to wszystko ustalasz w widoku (IMG:style_emoticons/default/smile.gif)

Ten post edytował Posio 23.02.2014, 00:52:49
Go to the top of the page
+Quote Post
adrianpl20
post
Post #13





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


ok, poprawiłem, przeniosłem metodę loadView do widoku views/view.php
teraz te zmienione pliki wyglądają tak, prawidłowo już?:

views/view.php
  1. <?php
  2.  
  3. class View {
  4.  
  5. public function loadView($path)
  6. {
  7. require_once 'views/head.php';
  8. require_once 'views/'.$path;
  9. require_once 'views/footer.php';
  10. }
  11. }
  12.  
  13. ?>


controllers/controller.php
  1. <?php
  2.  
  3. class Controller {
  4.  
  5.  
  6.  
  7. }
  8.  
  9. ?>


controllers/index.php
  1. <?php
  2.  
  3. class indexController {
  4.  
  5. public function index()
  6. {
  7. View::loadView('index.php');
  8. }
  9. }
  10.  
  11. ?>


controllers/kontakt.php
  1. <?php
  2.  
  3. class kontaktController {
  4.  
  5. public function index()
  6. {
  7. View::loadView('kontakt.php');
  8. }
  9. }
  10.  
  11. ?>
Go to the top of the page
+Quote Post
Damonsson
post
Post #14





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Jak już masz controller.php i świeci pustkami, to możesz wykorzystać np do tego, żeby nie walić w każdym kontrolerze static, tylko przekazywać sobie obiekt od razu do kontrolera:

  1. <?php
  2. class Controller {
  3. public function __construct() {
  4. $this->view = new View();
  5. }
  6. }
  7.  
  8. ?>



  1. <?php
  2.  
  3. class indexController extends Controller {
  4.  
  5. public function __construct() {
  6. parent::__construct();
  7. }
  8.  
  9. public function index()
  10. {
  11. $this->view->loadView('index.php');
  12. }
  13. }
  14.  
  15. ?>
Go to the top of the page
+Quote Post
pyro
post
Post #15





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


To z tym chciałeś pisać tego facebooka O_O ?

Poza tym, co napisał @Damonsson, takie coś:
Cytat(adrianpl20)
  1. <?php
  2.  
  3. class View {
  4.  
  5. public function loadView($path)
  6. {
  7. require_once 'views/head.php';
  8. require_once 'views/'.$path;
  9. require_once 'views/footer.php';
  10. }
  11. }
  12.  
  13. ?>

...jest głośnym wołaniem o pomstę do nieba. To widok ma decydować o tym, co wyświetla. Ponadto nie ma możliwości choćby zarządzania katalogiem z widokami.

Ten post edytował pyro 25.02.2014, 08:45:36
Go to the top of the page
+Quote Post
adrianpl20
post
Post #16





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Metoda loadView przecież jest w widoku, więc nie bardzo rozumiem o co innego chodzi, może o utworzenie osobnych metod setHeader, setFooter i wywołanie ich w metodzie loadView zamiast require header.php i require footer.php ? I o co chodzi z zarządzaniem katalogiem z widokokami?

Ten post edytował adrianpl20 25.02.2014, 09:02:34
Go to the top of the page
+Quote Post
pyro
post
Post #17





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(adrianpl20 @ 25.02.2014, 09:02:09 ) *
Metoda loadView przecież jest w widoku, więc nie bardzo rozumiem o co innego chodzi


Nie jest w widoku, jest w klasie ładującej widok.

Cytat(adrianpl20 @ 25.02.2014, 09:02:09 ) *
nie bardzo rozumiem o co innego chodzi, może o utworzenie osobnych metod setHeader, setFooter i wywołanie ich w metodzie loadView zamiast require header.php i require footer.php ?


To by była zmiana ze złego... na złe.

Cytat(adrianpl20 @ 25.02.2014, 09:02:09 ) *
I o co chodzi z zarządzaniem katalogiem z widokokami?


Co jak będę chciał użyć header2.php, zamiast header.php? Albo załadować widok z vendor/plugin/views ?
Go to the top of the page
+Quote Post
adrianpl20
post
Post #18





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


założyłem, że header zawsze będzie taki sam na każdej podstronie. Więc ręcznie w każdym widoku trzeba będzie wpisywać ładowanie headera np w __construct ?
Go to the top of the page
+Quote Post
pyro
post
Post #19





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(adrianpl20 @ 25.02.2014, 09:10:18 ) *
założyłem, że header zawsze będzie taki sam na każdej podstronie. Więc ręcznie w każdym widoku trzeba będzie wpisywać ładowanie headera np w __construct ?


Nie powinno się nic zakładać, tylko zrobić tak, żeby w razie potrzeby dało się zmienić.
Go to the top of the page
+Quote Post
Damonsson
post
Post #20





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Cytat
Więc ręcznie w każdym widoku trzeba będzie wpisywać ładowanie headera np w __construct


Niekoniecznie, możesz sobie wywoływać defaultowo tak jak masz, ale dodać do tego jeszcze parametry jakieś, które jeśli dodasz to wywołają inny head/foot jaki podasz w parametrach.

Ten post edytował Damonsson 25.02.2014, 09:29:31
Go to the top of the page
+Quote Post
pyro
post
Post #21





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(Damonsson @ 25.02.2014, 09:28:40 ) *
Niekoniecznie, możesz sobie wywoływać defaultowo tak jak masz, ale dodać do tego jeszcze parametry jakieś, które jeśli dodasz to wywołają inny head/foot jaki podasz w parametrach.


....natomiast znacznie lepszym pomysłem byłoby pozostawienie widoku widokowi. Jeżeli będzie potrzeba użycia innych ram dokumentu, wystarczy wtedy określić szablon rodzica albo jak w w/w - zaincludować inne pliki.
Go to the top of the page
+Quote Post
adrianpl20
post
Post #22





Grupa: Zarejestrowani
Postów: 111
Pomógł: 16
Dołączył: 20.02.2014

Ostrzeżenie: (10%)
X----


Usunąłem metodę loadView.

Teraz zrobiłem tak:
controllers/controller.php
  1. <?php
  2.  
  3. class Controller {
  4.  
  5. public $view;
  6.  
  7. public function __construct() {
  8. $this->view = new View;
  9. }
  10.  
  11. }
  12.  
  13. ?>


controllers/index.php
  1. <?php
  2.  
  3. class indexController extends Controller {
  4.  
  5. public function index()
  6. {
  7. $this->view->setHeader('views/head.php');
  8. $this->view->setContent('views/index.php');
  9. $this->view->setFooter('views/footer.php');
  10. $this->view->render();
  11. }
  12. }
  13.  
  14. ?>


view/view.php
  1. <?php
  2.  
  3. class View {
  4.  
  5. private $header_path;
  6. private $content_path;
  7. private $footer_path;
  8.  
  9. public function setHeader($path) // ustawia header
  10. {
  11. $this->header_path = $path;
  12. }
  13. public function setContent($path) // ustawia content
  14. {
  15. $this->content_path = $path;
  16. }
  17. public function setFooter($path) // ustawia stopke
  18. {
  19. $this->footer_path = $path;
  20. }
  21. public function render() // wyswietla widok
  22. {
  23. // header
  24. if(!empty($this->header_path) && file_exists($this->header_path))
  25. require_once $this->header_path;
  26.  
  27. // content
  28. if(!empty($this->content_path) && file_exists($this->content_path))
  29. require_once $this->content_path;
  30.  
  31. // footer
  32. if(!empty($this->footer_path) && file_exists($this->footer_path))
  33. require_once $this->footer_path;
  34. }
  35.  
  36. }
  37.  
  38. ?>


w views/index.php mam tylko html

Pomoże ktoś(IMG:style_emoticons/default/questionmark.gif) ?

hello..

Ten post edytował adrianpl20 28.02.2014, 00:03:05
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 23.08.2025 - 20:56