Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC - widok
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
Apo
Witam

Zastanawiałem się ostatnio nad implemenacją widoku w moim frameworku. Dotychczas nie tworzyłem osobnych klas dla widoku tylko robiłem tak jak jest w ZF:

  1. <?php
  2.  
  3. class Controller_View extends Controller {
  4.  
  5. public function showComentsAction()
  6. {
  7. $view = new View(); // poprostu prosty parser szablonów
  8. $view->imie = "Marek"; // assign
  9. $view->render('szablon'); // wygenerowanie widoku i przekazanie do zmiennej w HttpResponse
  10. }
  11.  
  12. }
  13. ?>


Ale zauważyłem że dużo osób tworzy osobne klasy dla widoku np:

  1. <?php
  2.  
  3. class News_View extends View {}
  4.  
  5. ?>


Czy moglibyście wyjaśnić jakieś plusy trzymania widoków w osobnych klasach :?: smile.gif

Pozdrawiam
envp
Wiesz, jezlei chodzi o widok, to wzorowanie na Zend'zie nie jest dobre, bo chlopaki chyba zapomnieli o czyms takim smile.gif
Trzymanie widoku w odzielnych klasach jest tym plusem, ze mozesz sobie wymienic w kazdej chwili wyswietlanie ( a to html, a to pdf, a tugież plik tekstowy w postaci bazy czy czegos). Pozdrawiam, Kamil
Apo
A mógłbyś pokazać jakiś przeykład takowej klasy, powiedzmy standardowa (html). Bo ja to rozumuje tak:

Akcja:

  1. <?php
  2.  
  3. class News_Controller extends Controller {
  4.  
  5. public function newsAction()
  6. {
  7. $news = $this->getView('news'); // klasa widoku News
  8. $news->imie = "Marek";
  9. $news->render();
  10. }
  11.  
  12. }?>


No i jak ma wyglądać przykładowa klasa News_View i co ma w sobie zawierać.

  1. <?php
  2.  
  3. class News_View extends View {
  4.  
  5. public function __construct()
  6. {
  7.  $this->setTemplate('widokNewsa');
  8. }
  9.  
  10. }?>


Takie coś stworzyłem ale nie wiem czy dobrze to zrozumiałem :|
envp
  1. <?php
  2. class DoSmthView extends HtmlView
  3. {
  4. public function __construct()
  5. {
  6. parent::__construct();
  7.  
  8. $this->setTemplate('DoSmth');
  9.  
  10. }
  11. }
  12. ?>


Potrzebujessz na pdf dziedziczysz po PDFView

aha parent::__construct():

  1. <?php
  2. ...
  3. private $_sTemplate;
  4. private $_aStyleSheets;
  5.  
  6. public function __construct()
  7. {
  8. $this->_aStyleSheets = array();
  9. }
  10. ...
  11. ?>


Dorzuce kontroler jesli chcesz (takie nei wiadomo co):

  1. <?php
  2. class DoSmth extends Controller
  3. {
  4.  
  5.  
  6. public function _index(){
  7.  
  8.  
  9. $oView = $this->getView( 'DoSmth');
  10. $oModel = $this->getModel('DoSmth');
  11.  
  12. $oView->setAttribute('all',$oModel->showMeAll());
  13. $oView->setAttribute('imie', $this->imie);
  14. return($oView);
  15. }
  16.  
  17. public function Login()
  18. {
  19. $oInput = $this->getInputData();
  20.  
  21. if(!$oInput->getParameter('user_name',2) ||
  22.  !$oInput->getParameter('password',2))
  23. {
  24. $this->pushNextAction('Login');
  25. return;
  26. }
  27. else
  28. {
  29. if(($oInput->getParameter('password',2)) == 'ppp')
  30. {
  31. $oUser = new User;
  32. $aGroups[] = 'administrator';
  33. $oUser->setGroups($aGroups);
  34. $oUser->setAuthenticated();
  35. $this->pushNextAction('DoSmth','_index');
  36. return;
  37. }
  38. else
  39. {
  40. $this->pushNextAction('Login');
  41. return;
  42. }
  43.  
  44. }
  45. }
  46.  
  47.  
  48.  
  49.  
  50. }
  51. ?>
Prph
Cytat(Apo @ 21.09.2006, 19:32:12 ) *
A mógłbyś pokazać jakiś przeykład takowej klasy, powiedzmy standardowa (html). Bo ja to rozumuje tak:


Dobrze to rozumiesz winksmiley.jpg
Envp zaprezentowal widok, gdzie trzeba wywolac konstruktor rodzica. Nie wiem co on tam ma, bo moze jest mu to potrzebne. Da sie to zrobic bez wywolywania konstruktora (zawsze mniej pisania). Polecam zajrzec do Rapide Framework: http://rapide.adrian.livenet.pl/

Adrian.
eai
Początkowo miałem problem z oddzieleniem kodu od generowania widoku a jego parsowania do template.

Ostatecznie zrobiłem klasę tworzącą drzewko danych, klasę tę wykorzystuje moduł do przechwytywania danych pobranych np. z SQL, następnie na samym końcu po dispatcherze i routerze urchamiany jest widok, który dostaje polaczona tablice danych (drzewko) ktora zawiera w sobie m.in. plik tpl na ktorym bedzie operowac. Widok sklada tablice i wyswietla widok (daje to mozliwosc zmiany formatu wyswietlenia z HTML na PDF czy inne edytujac tylko klase widoku a nie kazdy modul).

I wszystko sprawuje sie dobrze.
Turgon
Posłużyłem się waszymi radami i teraz pojawiły się kochane schody. Otóż jest taki problem. Jak skonstruować te klasy konkretnego widoku i jak ogólnie klasę np. HTML_View ?
eai
U mnie wyglada to tak:

Ze mam tablice z zaglebieniami:

Kod
[0] =>
         [file] = plik.tpl
         [setvar] = string;
         [setvar] = string2;
         [setvar] = string3;
         [setvar][] =>
                           [file] = plik2.tpl
                           [setvar] = string4;
                           [setvar] = string5;
                           [setvar] = string6;
itd..


Potem robie funkcje Generate_VIEW_HTML polega ona na tym ze foreach dostaje te tablice i leci po elementach jesli w setvar napotka tablice (ktora jest kolejnym szablonem nie tablica ze zwyklymi stringami) zwraca widok tej samej funkcji:

  1. <?php
  2. function Generate_VIEW_HTML ($tablica)
  3. {
  4. foreach ($tablica as $key => $value)
  5. {
  6.  switch ($key)
  7.  {
  8.  case 'file':  $obj = new Template($value); break;
  9.  case 'setvar'
  10.  if(is_array($value) && array_key_exists('file', $value))
  11.  { $obj->setvar(Generate_VIEW_HTML ($value));
  12.  }
  13.  else
  14.  {
  15.  $obj->setvar($value);
  16.  }
  17.  break;
  18. }
  19. return $obj->htmlout();
  20. }
  21.  
  22. echo Generate_VIEW_HTML ($tablica);
  23. ?>


Ja to na takiej zasadzie to robie. Oczywiscie to tylko schemat w praktyce taka klasa zawiera duzo funkcji np zintegrowany cache itd.... oraz opcje w zaleznosci pod jaki system template to robimy. Ja napisalem sobie wlasny.

Daje to nam duzo mozliwosci, bo mozemy robic cache template w jednym miejscu lub inne potrzebne operacje.
Turgon
Hmm... Nie wiele mi to pomogło...
eai
Teoretycznie w MVC modele przekazuja nam dane, wiec je jakos musimy przekazac np za pomoca tablicy. Drugi Model moze zawierac w tablicy dane z kolejnego modelu. Te tablice odpowiednia lacza sie w galeziach. Po przejsciu przez wszystkie akcje uzytkownika powstaje dosc spora tablica. A widok ma za zadanie przetworzenie tej calej tablicy.

Dlatego u mnie taka struktua:

  1. <?php
  2. //Tablica wygenerowana z modelu NEWSY
  3. $Newsy = array(
  4.  'file' => 'newsy.tpl';
  5.  'setvar' => array(
  6. array('{tytul}' => 'tytul newsa'),
  7. array('{data}'=>'data newsa'),
  8. array('{tresc}'=>'tytul newsa')
  9. );
  10. );
  11. //Tablica wygenerowana z modelu ARTYKULY
  12. $Artykuly = array(
  13.  'file' => 'artykuly.tpl';
  14.  'setvar' => array(
  15. array('{temat}'=> 'temat artykulu'),
  16. array('{dodal}'=> 'administrator'),
  17. array('{tresc}'=> 'zawartosc newsa')
  18. );
  19. );
  20. $Index = array(
  21.  'file' => 'index.tpl';
  22.  'setvar' => array(
  23. array('{newsy}'=> $Newsy),
  24. array('{artykuly}' => $Artykuly),
  25. array('{title}' => 'Strona Glowna serwisu')
  26. );
  27. );
  28. ?>


No i tak dalej.... w dispatcherze lacze te tablice lub bezposrednio w modelu jesli model korzysta z innego modelu....
Tak to u mnie w praktyce wyglada "Oddzielenie Modelu od Widoku"
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.