Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Widok w MVC, Różne formaty wyjściowe
UDAT
post
Post #1





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

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


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





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


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


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


@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.


--------------------
Go to the top of the page
+Quote Post
hwao
post
Post #5


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




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





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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.

Ten post edytował Ociu 2.01.2006, 16:45:39
Go to the top of the page
+Quote Post
bela
post
Post #7


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


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


--------------------
Go to the top of the page
+Quote Post
Ociu
post
Post #8





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 23.01.2004

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


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?


--------------------
Słyszałem, że macie tutaj jakieś takie php... fajne to, dobre to jest?
Go to the top of the page
+Quote Post
NuLL
post
Post #10





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


@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


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
UDAT
post
Post #11





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

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


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





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


@ebe, spójrz tutaj, a jak poszukasz tu to będziesz miał lekturkę na kilka miesięcy winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
splatch
post
Post #14





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


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. ?>


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Ociu
post
Post #15





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


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.


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
sf
post
Post #17





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


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.

Ten post edytował sf 2.01.2006, 22:10:15


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
UDAT
post
Post #18





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

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


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





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Wiesz, każdy robi jak lubi.
Ja wole używac uniwersalnego viewu dla każdego moduły, czy to news, artykuł, post.

pozdrawiam
Go to the top of the page
+Quote Post
UDAT
post
Post #20





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

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


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

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 07:14