Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC - Przekazanie danych do widoku
Forum PHP.pl > Forum > PHP > Object-oriented programming
Szymciosek
Witam,
chciałem zacząć zabawę z MVC, lecz jak przekazać dane z kontrolera do view?

  1. <?php
  2.  
  3. include_once './models/UserModel.php';
  4.  
  5. class AuthController
  6. {
  7. private $username;
  8.  
  9. public function __construct()
  10. {
  11. $model = new UserModel();
  12.  
  13. $this->username = $_POST['username'];
  14.  
  15. if ($model->getUser($this->username) == true)
  16. {
  17. echo 'Uzytkownik: ' . $this->username . ' istnieje w bazie';
  18. // tutaj uruchomienie widoku z przekazaniem zmiennej
  19. }
  20. else
  21. {
  22. echo 'Uzytkownik: ' . $this->username . ' nie istnieje w bazie';
  23. // tutaj uruchomienie tego samego widoku, ale z przekazaniem innej zmiennej
  24. }
  25. }
  26. }


Wiem, że echo w kontrolerze raczej jest niedozwolone, ale chciałem pokazać co chcę zrobić.

Dobrze to jest w ogóle na początek?

W index ładuję MainController, w którym ładuje i konfiguruję Router, następnie w zależności od url np.
"/" -> StartController
"/login" -> AuthController

W StartController mam metodę output(); która ładuje do siebie plik start.php (jakiś szablon strony z formularzem logowania).
Po wysłaniu formularza zostaję przekierowany na "/login" a tym samym jest uruchamiany AuthController, w którym odbieram dane. Następnie jest uruchomienie modelu, w którym mam metodę getUser(); która sprawdza czy użytkownik istnieje w bazie (array) poprzez in_array..., jeśli taki użytkownik istnieje zwracam do kontrolera TRUE no i dalej to jest to samo co wyżej i problem z przekazaniem do widoku informacji na temat tego co zwrócił model.
ano
  1. <?php
  2.  
  3. include_once './models/UserModel.php';
  4.  
  5. class AuthController
  6. {
  7. private $username;
  8.  
  9. protected $view;
  10.  
  11. public function __construct(View $view)
  12. {
  13. $this->view = $view;
  14.  
  15. $model = new UserModel();
  16.  
  17. $this->username = $_POST['username'];
  18.  
  19. if ($model->getUser($this->username) == true)
  20. {
  21. $this->view->username = $this->username;
  22. }
  23. else
  24. {
  25. echo 'Uzytkownik: ' . $this->username . ' nie istnieje w bazie';
  26. // tutaj uruchomienie tego samego widoku, ale z przekazaniem innej zmiennej
  27. }
  28. }
  29. }


Np tak. Kontroler ma referencję do konkretnego widoku.
Kontroler w tradycyjnym mvc nie musi/nie może "odpalać" widoku.
Szymciosek
Czyli muszę dorobić klasę View, która będzie dopiero ładowała i wyświetlała kolejne widoki (szablony) tak?

Ale co w przypadku, gdy szablon chcę mieć w pliku php np start.php z zawartością np.

Kod
...
<body>
<p><?php /* tutaj jakas wstawka z View */ ?></p>
</body>
...
!*!
Zależy jak interpretujesz skrót MVC. W moim FW w ogóle nie ma widoku pod postacią klasy View (jak w większości), ponieważ poszedłem bardziej w stronę MVP i mam klasę Theme, która odczytuje pliki html/php i ewentualnie wyświetla ich zawartość (łącznie z zagnieżdżeniami i parsowaniem).
Szymciosek
Odczytuje czyli pobiera zawartość, wyszukuje konkretnych miejsc i wkłada w te miejsca Twoją treść?
!*!
Jeśli tak to napiszesz. U mnie "szablony" opierają się głownie na zmiennych, ewentualnie na drobnych funkcjach czy pętlach.

  1. <title><?php echo $title;?></title>


Gdzie $title pochodzi z kontrolera...

  1. $theme = Theme::parse('index.html', array('title'=>'temat strony'));
  2. echo $theme-> render();
Szymciosek
Uchylisz kawałek tego parsera? Nie mogę dojść co się kryje za ta kurtyną.
!*!
Za bardzo zintegrowany z FW nie chce mi się oprawiać. Całość opiera się o funkcję extract przeczytaj dokładnie JAK ona działa i dlaczego powinna być TYLKO w widoku.

  1. extract($tags, EXTR_SKIP); // zamienia zmienne w tablicy na zmienne
  2. ob_start(); // buffor
  3. include $templatePath; // wczytuje plik PHP/HTML który ma $zmienne
  4. $this->template = ob_get_contents(); // zapis
  5. ob_end_clean(); // czyszczenie
  6.  
  7. echo $theme-> render(); // to wyżej, odpowiada return $this->template;
ano
Cytat(!*! @ 12.02.2013, 21:18:45 ) *
Zależy jak interpretujesz skrót MVC. W moim FW w ogóle nie ma widoku pod postacią klasy View (jak w większości), ponieważ poszedłem bardziej w stronę MVP i mam klasę Theme, która odczytuje pliki html/php i ewentualnie wyświetla ich zawartość (łącznie z zagnieżdżeniami i parsowaniem).


MVC byl opisywany już w tyyyylu publikacjach, że ciężko by było nadać mu "kolejną" interpetację - jest już zbyt zformalizowany, żeby próbować mu nadawać samemu jakieś "inne" znaczenie.

@Szymciosek zadał konkretne pytanie o MVC - jaki sens wplatywać tu jak to w Twoim FW jest zaimplementowane i to jeszcze sam piszesz, że "to jednak jest zupełnie inny wzorzec architektoniczny, MVP"?!

https://www.google.pl/search?q=mvc+architecture
poczytaj dużo artykułów, pooglądaj przykłady (nieważny język, php, java - nie ma znaczenia) i na tej podstawie postaraj się samemu wyrobić zdanie "o co chodzi" i "jak to zaimplementować".
!*!
Co nie zmienia faktu że MVC to tylko ogólnik.
ano
Nie. To konkretny, dobrze opisany wzorzec stosowany od ~40 lat (!). Mógłbym Ci tu wkleić linki do 21542 publikacji na jego temat, ale jaki w tym sens?
Czemu rzucasz ogólnikową opinią, że to ogólnik? ( ;-) ) na jakiej podstawie tak twierdzisz?
!*!
Skoro już sam stwierdziłeś że to wzorzec, to nadal chcesz wiedzieć dlaczego to ogólnik? wink.gif

Widziałeś film X na podstawie książki X? Oglądając film X widziałeś tylko czyjąś interpretacje, jego punkt widzenia może się różnić od Twojego po przeczytaniu książki.
ano
Ok, czyli dla Ciebie nie byłby to ogólnik gdyby razem z nim dostarczono konkretną implementację i to najlepiej napisaną w PHP...? ;O
Jeżeli nie o to chodzi to faktycznie, dalej chce wiedzieć czemu mówisz, że to ogólnik...
Szymciosek
MVC wg mnie to po prostu wzorzec i masz pokazane ogólnie jak ma działać, że model ma trzymać dane, widok wyświetlać, kontroler nadzorować pracą tego, a to czy odpalisz w index od razu model, controller i view razem, czy tylko controller, a później dopiero w kontrolerze view i model, to już Twoja sprawa i to jest właśnie ten ogólnik, który nie narzuca konkretnie jak z tego korzystać.
aras785
A problem już rozwiązałeś?
Szymciosek
Ogólnie tak, ale chcę to jeszcze zrobić delikatnie lepiej tzn żeby coś więcej się wyświetlało, ale najpierw muszę ogarnąć w domu.

Jeszcze jedno pytanie odnośnie widoku.

Jak stworzyć plik base.php - który zawiera ogólny szablon z odniesieniem do content.

coś w tym stylu:

  1. ...
  2. </head>
  3.  
  4. <header>...</header>
  5. <nav>...</nav>
  6. <div id="content">$content</div>
  7. <footer>...</footer>
  8.  
  9. </body>
  10. </html>


Gdzie $content jest zmienną, która ładuje do base cały szablon jakiegoś content np.

test.php
  1. <div id="submenu">...</div> <!-- menu w content -->
  2. <p>Treść pod menu</p>
  3. <p>$tresc_dynamiczna</p>



Tą drugą część wraz ze zmienną $tresc_dynamiczna, chcę wsadzić do base.php.

Czyli byłoby tak.

Ładowanie base.php
Przekazanie do niego zmiennej z szablonem test.php
Przekazanie do test.php zmiennej $tresc_dynamiczna...

Da się to ogarnąć tym jednym sposobem opisanym wyżej?
Nie bardzo mam pomysł jak do tego podejść, mam nadzieję, że w miarę zrozumiale napisałem.
Chciałem żeby to działało na zasadzie dziedziczenia widoku jak w Symfony2.
aras785
Ja mam to zrobione na zasadzie że zawsze laduje layout i w nim mam:

  1. <?php include($this->content);?>


A $this->content zawiera widok z akcji np. index/index, index/news smile.gif
!*!
Szymciosek - przetestuj ten kod http://forum.php.pl/index.php?s=&showt...t&p=1025175 extract dziedziczy po sobie.
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.