Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Widok MVP, Renderowanie roznych typow widoku
marcio
post
Post #1





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Hej doszedlem do wniosku ze w moim fw widok, ogolnie warstwa prezentacji jako szablon to za malo, w sensie gdy zajdzie potrzeba na wyswietlenie innego fotmatu pdf,xml,text,csv czy json bedzie lipa i albo nie da rady albo bede musial kombinowac w kontrolerze i robic rzeczy ktorych nie powinno sie robic.

Wiec postanowilem poszerzyc fw o nowa funkcjonalnosc, oprocz widokow jako szablony mozna uzywac klasy.

Jednak nie wiem zabardzo jak to najlepiej rozwiazac do tej pory doszedlem do 2 sposobow:
-Osobna klasa widoku na kazdy format czyli News_View_Html,News_View_Xml itp...itd...
-Jedna ogolna klasa News_View implementujaca interfejs IView ktory ma metody: renderHtml,renderXml,renderJson itp..itd

Moze pokaze pseudo kod to bedzie bardziej wiadomo o co mi chodzi:
  1. interface IView {
  2.  
  3. public function render();
  4.  
  5. }
  6.  
  7. //lub
  8.  
  9. interface IView {
  10.  
  11. public function renderHtml();
  12. public function renderText();
  13. public function renderXml();
  14. public function renderJson();
  15. public function renderPdf();
  16.  
  17. }
  18.  

I potem reszta:
  1. <?php
  2.  
  3. class News_View_Html extends Html_View implements IView {
  4.  
  5. public function render() {
  6.  
  7. return $this -> Layout('news', 'components', 'admin');
  8.  
  9. }
  10.  
  11. }
  12.  
  13. class News_View_Xml extends Xml_View implements IView {
  14.  
  15. public function render() {
  16.  
  17. //implemenctacja dla xml'a
  18.  
  19. }
  20.  
  21. }
  22.  
  23. //lub jedna klasa z metodami dla kazdego typu widoku dziedziczaca po bazowej klasie view + interfejs
  24.  
  25. class News_View extends View implements IView {
  26.  
  27. //implementacja assign'ow
  28. public function setVars($vars) {
  29.  
  30. $this -> view -> AddVars($vars);
  31.  
  32. }
  33.  
  34.  
  35. public function renderHtml() {
  36.  
  37. $this -> view -> Layout('news', 'components', 'admin');
  38.  
  39. }
  40.  
  41.  
  42. public function renderXml() {
  43.  
  44. //implementacja dla xml'a
  45.  
  46. }
  47.  
  48.  
  49. //potem implementacja dla text,pdf i json jesli jest potrzeba jak nie to puste metody
  50.  
  51. }
  52.  
  53.  
  54. //klasa kontrolera
  55.  
  56. class News extends Controller implements IController {
  57.  
  58. public function Index() {
  59.  
  60. //pobieranie news'ow z modelu
  61. //ustawiane widoku dla url index.php/Home,Index,Index,html
  62.  
  63. $args = $this -> routing -> getParams();
  64.  
  65. switch($args) {
  66.  
  67. case 'html':
  68. //teraz tak albo osobna klasa dla kazdego widoku albo jedna klasa ze wszystkimi metodami
  69. $view = $this -> News_View_Html;
  70. $view -> AddVars($news);
  71. return $view -> render();
  72.  
  73. //lub
  74.  
  75. $view = this -> News_View;
  76. $view -> setVars($news);
  77. return $view -> renderHtml();
  78.  
  79. break;
  80.  
  81. case 'xml':
  82. //tutaj to samo tylko ze w formacie xml
  83. break;
  84.  
  85. }
  86.  
  87. }
  88.  
  89. }
  90. ?>

Kod pisany na szybko z palca wiec moze sa jakies bledy, to ma byc tylko taki ogolny zarys.

Chodzi o to ktore rozwiazanie jest lepsze, a moze zadne z nich i proponujecie inne...?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Ja bym wykorzystał takie rozwiązanie:
  1. class News {
  2. public $id;
  3. public $title;
  4. }
  5.  
  6. abstract class News_Renderer {
  7. public $news;
  8.  
  9. abstract public function render();
  10. }
  11.  
  12. class News_Renderer_HTML extends News_Renderer {
  13. public function render() {
  14. return '<h3>'.$this->news->title.' (id='.$this->news->id.')</h3>';
  15. }
  16. }
  17.  
  18. class News_Renderer_CSV extends News_Renderer {
  19. public function render() {
  20. return $this->news->title.';'.$this->news->id
  21. }
  22. }

W kodzie wykorzystujesz to tak:
  1. $news = new News();
  2. $news->id = 1;
  3. $news->title = 'Moj news';
  4.  
  5. $renderer = new News_Renderer_HTML();
  6. $renderer->news = $news;
  7.  
  8. echo $renderer->render();

Jeśli wolisz możesz przekazywać obiekt $news to metody render() jako parametr. Jak Ci wygodniej.
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.10.2025 - 01:42