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
dariuszp
post
Post #2





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 9.09.2010

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


Typ widoku można przekazywać na różne sposoby. Np mój kolega po fachu trzyma je w URL ale zawsze je maskuje poprzez mod_rewrite. Spotkałem się z przypadkiem gdzie korzystano ze zmiennych środowiskowych przez co po prostu dostawałeś parametr w tablicy superglobalnej $_SERVER. Metoda jest mało ważna.

I owszem. Chodzi mi o takie klasy jak podałeś wyżej. Teoretyzowanie mi nie wychodzi więc może podam jak ja to wykonałem u siebie.

Projekt który tworzę jest podzielony na moduły do tego stopnia że nie ma w nim nic co by było wpisane na sztywno. Nie licząc domyślnego moduły. Jego obecność jest obowiązkowa. Domyślny moduł jest widokiem panelu administracyjnego. Każdy moduł ma część administracyjną i publiczną. Na jednej stronie może być kilka modułów. Moduły mogą być umieszczane na różnych stronach. Każda "instancja" modułu na stronie ma własną konfigurację.

Przy realizacji tego natrafiłem na parę problemów. Czasami musiałem uzyskać jakieś dane poprzez AJAX. Problem leżał tu że... nie za bardzo było się gdzie po nie odwołać. Witryna przechodziła cały proces od zaczytania danych z określonych źródeł, przez wykonanie całej logiki, załadowanie szablonów i wyświetlenie tego. Musiałem pisać obejście specjalnie dla AJAX w tym procesie. W końcu chciałem by moduł zwrócił określone dane z pominięciem głównego szablonu strony.
Później doszła generacja plików XML. Oprócz XML zastosowałem również JSON. Krew mnie zalała jak na potrzeby projektu musiałem dorobić widok gdzie właściwie NIC nie było wyświetlane, po prostu output był wysyłany na zewnętrzny serwer poprzez socket.

Wtedy stwierdziłem że jak tak dalej pójdzie to wyłysieję, dostanę nerwicy i kto wie co jeszcze. W skrócie podobny problem co u Ciebie. Od kolegi zapożyczyłem rozwiązanie i zastosowałem Service Layer (jeżeli nie pomyliłem nazwy). Dlatego je zaproponowałem w Twoim wypadku.

Teraz moduł ma dopisaną listę takich usług jakie obsługuje. Jeżeli jest to JSON i XML to prosząc usługę AJAX dostaje po prostu 404. A działa to w ten sposób:

- ładowane są dane np z bazy danych
- moduł robi co trzeba i przygotowuje ArrayObject z tymi danymi. Stosuje określone nazewnictwo i zasady więc taka tablica zawsze ma podobną postać. Po prostu jej fragmenty mogą istnieć bądź nie.
- następnie wywoływana jest żądana usługa do której jest przekazywany ArrayObject.
- na wyjściu spodziewaj się danych w formacie XML, TXT, JSON lub cokolwiek sobie zaplanowałeś w usłudze.

Do usługi jest właściwie przekazywane końcowe sterowanie aplikacją. Jej wykonanie kończy wyświetlenie danych w jakiejkolwiek formie. Przykładowo usługa HTTP ładujesz szablon strony, wykonuje moduły a ich kod wynikowy umieszcza w odpowiednich miejscach na stronie.
Usługa AJAX ładuje zawsze pojedynczy moduł, przygotowuje dane i surowo je wyświetla tak byś mógł je odebrać ze skryptu.
Usługa JSON po prostu przerabia array object na json i wyświetla.
Tak samo z XML.
Usługa Socket odbiera od żądania login, hasło i adres serwera. Jak login i hasło się zgadzają to wysyła dane na zewnętrzny serwer.

Właściwie cokolwiek sobie wymyślisz, wystarczy stworzyć odpowiednią usługę i jazda. Później w jednym miejscu zmieniasz sposób postępowania dla XML, strony WWW czy ściągania plików. Bardzo przejrzysta i fajna metoda.

Ten post edytował dariuszp 15.09.2010, 11:01:55
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: 7.10.2025 - 21:56