Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Widok w MVC
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
UDAT
Ostatnio wziąłem się za budowę własnego CMS'a opartego na MVC i sterowanego zdarzeniami.
Jednak o ile Model i Kontroler ( ten drugi w moim rozwiązaniu szczątkowy) nie sprawiły mi kłopotów to rozplanowanie systemu szablonów już tak.

Czy lepiej jest tworzyć ogrmoną ilość szablonów (oddzielnych dla PDF'a, XHTML, XML'a, oDT, TEXT itd.) czy lepiej stworzyć jakiś system, który wprowadzał by dodatkową warstwę, której zadaniem byłoby przechowywanie uporządkowanych danych w czymś a'la XML. Natomiast View miałby za zadanie IMPORT/EXPORT do niej.

Nie chodzi mi o to co będzie szybsze (w sensie czasu działania) tylko łatwiejsze do zrealizowania przez osoby tworzące content dla serwisu, nie znające php. Jednocześnie system ma być łatwy do rozszerzania.

W pierwszym przypdaku ilość szablonów w najgorszym przypadku równa będzie ilość formatół * ilość akcji*ilość skinów.
W drugim szczerze mówiąc nie wiem do końca jak zbudować VIEW.

Czy lepiej może jeszcze inaczej rozwiązać??
Ociu
Jak dla mnie model to plik konfiguracyjny danego modułu, który przechowywany jest jako xml/ini/php/db (Jak kto woli).

Ja sam w swoich projektach nie używałem modelu, ponieważ nie był mi potrzebny, ale jeśli będzie potrzebny, to napewno wybiore xml.

A swoją drogą, uruchomienie odpowiedniej akcji wygląda u mnie tak (w skrócie).
Kod
FilterChain->(URLFilter)->(ActionChain)->
HttpRequest->
ExecutionFilter->URLFilter->ActionChain->
PageFilter->Action->OPT.


pozdrawiam
ActivePlayer
jak dla mnie widok to 2 czesci.

jedna to dane
  1. <?php
  2.  
  3. // php4
  4. var $data = array();
  5.  
  6. ?>


druga czesc to funkcja ktora przetwarza $this->data na format jaki ty chcesz.

Wiec na moje oko najlatwiej wykonac to w ten sposob:

  1. <?php
  2.  
  3. class View{
  4. var $data;
  5.  
  6. function parse(){;}
  7. }
  8.  
  9. ?>


a potem

  1. <?php
  2.  
  3. class HtmlView extends View{
  4. function parse(){
  5.  // all fetch'es...
  6. }
  7. }
  8.  
  9. class PdfView extends View{
  10. function parse(){
  11.  // all fetch'es...
  12. }
  13. }
  14.  
  15. ?>


a uzycie w kodzie:
  1. <?php
  2.  
  3. function ViewFactory($type){
  4.  switch($type){
  5.  default:
  6.  case 'html':
  7.  return new HtmlView();
  8.  break;
  9.  case 'xml':
  10.  return new XmlView();
  11.  break;
  12.  }
  13. }
  14.  
  15. //...
  16. //$typ_widoku ustalasz wg zadania klienta
  17. $oView = ViewFactory($typ_widoku);
  18. // wszystkie assigny itd
  19. $oView->parse();
  20.  
  21. ?>


nie wiem czy do konca temat zrozumialem, ale ja to tak widze.
bela
@AP, @Ociu: jakoś nie przekonują mnie wasze rozwiązania ;]

@Ociu, chyba nie rozumiesz co to jest model. Już spieszę z wyjaśnienie. Otóż model to inaczej dane, a ściślej rzecz biorąc to zestaw klas, funkcji do pobierania danych z źródła np. bazy danych bądź plików tekstowych.
A ten schemat też mi się jakoś nie podoba. Czemu jest URLFilter? Przecież URL trzeba sparsować aby dowiedzieć się jakie akcje się pod nim kryją. U mnie to jest pluginem.
Poza tym mam problem z rozszyfrowaniem reszty schematu winksmiley.jpg

@UDAT, z tego wynika że najlepszą metodą będzie dla Ciebie XML i przetwarzanie przez XSLT, bo większość formatów o których wspomniałeś to aplikacje XMLa, a z PDF albo plain textem, możemy poradzić sobie za pomocą XSL-FO. Coś jak Cocoon, albo klon dla php a nazwie Popoon.

A co do ilości szablonów w pierwszej Twojej propozycji to wynosi ona tylko liczba szablonów * liczba formatów. Gdyż skiny można zastąpić poprzez CSS.
hwao
@Ociu:
Twoj pomysl moze i dobry, ale imho dlamnie zupelnie mijajacy sie z celem (modul jako "modul" jest, ale opornie sie go wlacza).
@AC:
To poco pokazalest to imho system szablonow a nie View (wiedok) z MVC.

Propozycja Beli wydaje sie najlepsza ale niesie ze soba kolejne nie dogodnosci mianowicnie nie wystarszczy znajomosc html/xml/css zeby to wszytko ladnie zlozyc.

Moja propozycja:
Przeciez calej strony nie bedziesz wyrzucal jako PDF, bo poco?
w PDF'ie mozna wyrzucac dokumentacje/faktury itp... wiec czy nie latwiej jest poprostu dopisac do nich osobny paser?
Ociu
Cytat(bela_666 @ 2006-01-02 17:01:21)
@Ociu, chyba nie rozumiesz co to jest model. Już spieszę z wyjaśnienie. Otóż model to inaczej dane, a ściślej rzecz biorąc to zestaw klas, funkcji do pobierania danych z źródła np. bazy danych bądź plików tekstowych.
A ten schemat też mi się jakoś nie podoba. Czemu jest URLFilter? Przecież URL trzeba sparsować aby dowiedzieć się jakie akcje się pod nim kryją. U mnie to jest pluginem.
Poza tym mam problem z rozszyfrowaniem reszty schematu winksmiley.jpg

Troche źle się wyraziłem. Conf + parser. O to mi bardziej chodziło. A co do reszty. Tyle interpretacji ile ludzi, kazdy ma swój punkt widzenia. A co do URL. URLFilter czyli tłumaczenie adresów. Umysliłem sobie, ze dla mnie filtrem będzie wszystko co co jest potrzebne, słada się tylko z jednej funkcji (metody) i jest bardzo potrzebne ( myk jest taki, że musisz sam zrozumieć ). URLFilter spełnia te wymagania. Wszystkie informacje przerzucam do Context'u, ponieważ te dane są mi zawsze potrzebne. Translator wygląda mniej więcej tak:
  1. <?php
  2. Class URLFilter implements IFiltr {
  3. public function execute(HttpContext $context, FilterChain $chain) {
  4. $url = /* .... */ $_SEVER['PATH_INFO'];
  5.  
  6. $context->vars = explode('/', $url);
  7. $context->module = $context->vars[1];
  8. # ...
  9. $chain->executeNext($context);
  10. }
  11. }
  12. ?>


Edit: ActivePlayer Myśle, że tutaj sposób ukazany w prado będzie ok.
bela
Wiem o co Ci chodzi. Jednak idea filtra jest inna. Filtr możemy sobie wrzucić, wyrzucić, zmienić, zrobić z nim co chcemy, filtr nie jest elementem od którego zależy cała aplikacja. Takim czymś jest plugin winksmiley.jpg
Ociu
Jak kto woli. Mi się tam dobrze pracuje z tym co mam smile.gif.

PS. Wszsycy mnie tylko krytykują i popychają. "A ja się ogolić nie dam! bo ten zarost nosze od przed wojny" winksmiley.jpg

pozdrawiam
ebe
mały OT ale forum bez OTów to jak żołnierz bez karabinu ;P

@Ociu do czego służy Ci HttpContext? Czy za pomocą niego porozumiewają się różne obiekty w Twoim programie, używają do do wymiany informacji?
NuLL
@UDAT - naprawde myslisz ze dla kazdej akcji mozna miec output w PDF-ie - wskazana przez Ciebie liczba templatek jest mocno przesadzona. Formularz logowania tez bedzie mozna w PDF ? biggrin.gif
UDAT
Cytat(NuLL @ 2006-01-02 19:00:47)
@UDAT - naprawde myslisz ze dla kazdej akcji mozna miec output w PDF-ie - wskazana przez Ciebie liczba templatek jest mocno przesadzona. Formularz logowania tez bedzie mozna w PDF ? biggrin.gif

No niby można tongue.gif
Ociu
Cytat(ebe @ 2006-01-02 21:00:21)
mały OT ale forum bez OTów to jak żołnierz bez karabinu ;P

@Ociu do czego służy Ci HttpContext? Czy za pomocą niego porozumiewają się różne obiekty w Twoim programie, używają do do wymiany informacji?

HttpContext służy mi jako nośnik obiektów Request i Reponse.
Bela: A co do schematu, zacząłem go tłumaczyć, ale musiałem, iść na korki dry.gif
Kod
FilterChain->(URLFilter)->(ActionChain)->
HttpRequest->
ExecutionFilter->URLFilter->ActionChain->
PageFilter->Action->OPT.

(Swoją drogą, ale go napisałem... tak naprawde nic nie tłumacy co się dzieje winksmiley.jpg ) Uruchamiany jest FilterChain, do którego ładuje URLFilter i ActionChain. Uruchamiam HttpRequest, aby zrobił to co powinien. Potem ExecutionChain, któy uruchamia filtry URLFilter, ActionChain i PageFilter, którego na schemacie zapomniałem załadować, a tak naprawde to on ładuje co ma być wyświetlone - content. ActionChain uruchamia odpowiednią akcję, której wynik pakowany jest do html (opt).
bela
@ebe, spójrz tutaj, a jak poszukasz tu to będziesz miał lekturkę na kilka miesięcy winksmiley.jpg
splatch
Mankament z XSL FO jest taki, że z tego co mi wiadomo nie ma procesora zdolnego do współpracy z php, który jest go w stanie obsłużyć, chyba że ktoś ma możliwość używania javy z poziomu php i odpowiednio skonfigurowany serwer. Moja propozycja...
  1. <?php
  2.  
  3. class ViewProcessor {
  4.  
  5. const PDF = '.fo';
  6. const XML = '.xml';
  7. const HTML = '.html';
  8.  
  9. /**
  10.  * @param string $default domyślny rodzaj outputu.
  11.  **/ Zwraca obiekt DOMDocument.
  12. public function __construct($default = ViewProcessor::HTML) {
  13. $this->default = $default;
  14. }
  15.  
  16. /**
  17.  * Zwraca obiekt DOMDocument.
  18.  *
  19.  * @param string $fileNameWithoutExtension nazwa pliku do
  20.  * której będzie dodane rozszeżenie. Dla pliku "test" nazwa szablonu
  21.  * będzie wyglądać: test.fo.xsl test.xml.xsl test.xml.html
  22.  *
  23.  **/
  24. public function getDomObject($fileNameWithoutExtension, $type = null) {
  25. if(is_null($type)) {
  26. $type = $this->default;
  27. }
  28. if(file_exists($fileNameWithoutExtension . $type .'.xsl')) {
  29. $d = new DOMDocument;
  30. // tutaj ustawianie zmiennych etc.
  31.  
  32. $xsl = new DOMDocument;
  33. // tutaj ładujemy arkusz XSL
  34. $xsl->load($fileNameWithoutExtension . $type .'.xsl');
  35.  
  36. // Tworzenie procesora XSL
  37. $proc = new XSLTProcessor;
  38. $proc->importStyleSheet($xsl); // dołączenie arkusza XSL
  39. $doc = $proc->transformToDoc($d);
  40.  
  41. return $doc;
  42. }
  43. return false;
  44. }
  45. }
  46.  
  47. ?>
Ociu
Myślę, że znowu zaczyna się temat tpl Vs. php. No ale...

IMHO 'view' powinien być jeden. Tyle na ten temat smile.gif Nie ma się co tworzyć nowych obiektów dla jednego modułu. Dlaczego ? Tworzy się w szablonach barokowy przepych, którego nie powinno być. W prado jest tak, że dla każdego modułu tworzymy nowy plik template, w którym wykonywana jest cała klasa. Rozumiem zrobić sobie tworzenie bloku (parsowanie pliku xml) w tpl, ale uruchamiać obiekt ? Niepotrzebnie. Można zobaczyć:
  1. <div class="author">
  2.      last modified on <%= date('M d, Y h:ia',$this->Parent->Data['wtime']) %>
  3.    by <%= $this->Parent->Data['author'] %>.
  4.      [ <a href="blog.php?page=Blog:EditPage&id=<%= $this->Parent->Data['id'] %>">edit</a> ]
  5.      [ <com:TLinkButton Text="delete" CommandParameter="#$this->Parent->Data['id']" OnCommand="Page.onClickDeleteBtn" onclick="if(!confirm('Are you sure?')) return false;"/> ]
  6.  </div>

I to jes takie nie oddzielanie od siebie warstw tworzącej od wynikowej (Cntroller i View). Po to wymyślowo MVC, aby je od siebie oddzielać.

pozdrawiam
splatch
Tutaj wcale nie zaczyna się temat php vs TPL. On tutaj się kończy. Cały proces tworzenia outputu odwala procesor XSL. Nie ma tutaj miejsca na nic innego. W pamięci przechowywany jest obiekt DOMDocument ze zmiennymi (zmienna $d).
Wszystko pozostaje w jednym języku, bez dodatkowych klas (PDFView, SmartyView, PHPView) etc. zmieniają się tylko szablony XSL.
sf
Ee, u mnie to jest dosc prosto zrobione. To wywolywania akcja tworzy obiekt response, a nie framework ( czy tam kontrolera, zwal jak zwal), response nie jest czescia frameworka, a czescia wywolanej akcji, dzieki temu to czy to bedzie smarty, xml czy cokolwiek ... moja aplikacja nie ma z tym problemu, trzeba tylko napisac odpowiedni Response i z niego korzystac.
UDAT
Cytat(Ociu @ 2006-01-02 20:28:45)
IMHO 'view' powinien być jeden. Tyle na ten temat smile.gif Nie ma się co tworzyć nowych obiektów dla jednego modułu.
------------------------------------------------------------
W prado jest tak, że dla każdego modułu tworzymy nowy plik template, w którym wykonywana jest cała klasa.
------------------------------------------------------------
I to jes takie nie oddzielanie od siebie warstw tworzącej od wynikowej (Cntroller i View). Po to wymyślowo MVC, aby je od siebie oddzielać.

Ten środkowy kawałek trochę mi nie pasuję.
Preferowałbym rozwiązanie pozwalające na pełną hermetyzację Widoku (tj. można zmienić Widok, ale także Model czy Moduł bez zmiany reszty)
Jednak nawet transformacja XML:XSLT nie rozwiązuje tego problemu sad.gif
Ociu
Wiesz, każdy robi jak lubi.
Ja wole używac uniwersalnego viewu dla każdego moduły, czy to news, artykuł, post.

pozdrawiam
UDAT
Cytat(Ociu @ 2006-01-03 18:23:46)
Wiesz, każdy robi jak lubi.
Ja wole używac uniwersalnego viewu dla każdego moduły, czy to news, artykuł, post.

pozdrawiam

O to mi chodzi.

Jak takie coś skonstruować questionmark.gif
Ociu
OPEN POWER TEMPLATE.
Poto Zyx męczył się nad tymi if'ami, foreachem i for'em aby z nich korzystać winksmiley.jpg
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-2024 Invision Power Services, Inc.