Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> MVC - widok
Apo
post
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


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 :?: (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
envp
post
Post #2





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


Wiesz, jezlei chodzi o widok, to wzorowanie na Zend'zie nie jest dobre, bo chlopaki chyba zapomnieli o czyms takim (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Apo
post
Post #3





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


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 :|
Go to the top of the page
+Quote Post
envp
post
Post #4





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


  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. ?>
Go to the top of the page
+Quote Post
Prph
post
Post #5





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
eai
post
Post #6





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


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.
Go to the top of the page
+Quote Post
Turgon
post
Post #7





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


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 ?
Go to the top of the page
+Quote Post
eai
post
Post #8





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


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.

Ten post edytował eai 20.10.2006, 15:40:06
Go to the top of the page
+Quote Post
Turgon
post
Post #9





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


Hmm... Nie wiele mi to pomogło...
Go to the top of the page
+Quote Post
eai
post
Post #10





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


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"

Ten post edytował eai 20.10.2006, 16:07:11
Go to the top of the page
+Quote Post

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: 22.08.2025 - 19:54