![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
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:
I potem reszta:
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...? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 30 Pomógł: 0 Dołączył: 9.09.2010 Ostrzeżenie: (0%) ![]() ![]() |
Akurat to co tworze ma charakter komercyjny i nie mogę się podzielić.
Idea jest prosta. W module ma być zaszyta informacja a jakiej postaci potrafi on zwrócić dane. Jeżeli to HTML to powinien on mieć dostarczony szablon do uzupełnienia a później zwrócić kod wynikowy. Jeżeli to JSON, powinien on zebrać dane do tablicy, zakodować do formatu i wyświetlić itp. Sam dla przykładu by nie tworzyć 10 różnych metod (i trzymać interfejs w jak najprostszej postaci) mam metody które reprezentują jakieś akcje w systemie ale... mogą zwrócić zupełnie inne dane. Dla modułu jest ustawiany tym zwracanych danych a dalej program działa jak by nigdy nic. Teraz pytanie - dlaczego warstwa usług ? Oto kilka przypadków które mi ona rozwiązała: 1. (ServiceHTML) Ładując stronę, mam na niej kilka modułów do wyświetlenia. Usługa musi załadować je wszystkie, ustawić ich konfigurację i wykonać. Następnie uzupełnia szablon o ich kod wynikowy. 2. (ServicePOPUP) W momencie gdy np chcę wyświetlić 1 moduł w oknie pop-up, w lightbox lub w jakikolwiek inny sposób, taki moduł powinien mieć załadowany podstawowy szablon HTML (head + body itp) by działać poprawnie. Dodatkowo powinien być załadowany jeden moduł. 3. (ServiceAJAX) Potrzeba mi podmienić na stronie fragment kodu z modułu, muszę dostać surowy kod do podmiany bez dodatków. Czasami chodzi tylko o fragment tekstu albo informację przykładowo o nowych wiadomościach. 4. (ServiceDOWNLOAD) Dane wynikowe muszę dać użytkownikowi do ściągnięcia, trzeba mu przesłać plik, odpowiednie nagłówki itp. Dodatkowo czasami trzeba mu zablokować możliwość ściągania danego pliku. 5. (ServiceSOCKET) Muszę po prostu otworzyć połączenie poprzez socket z jakimś urządzeniem i przesłać dane wg jakiegoś protokołu. 6. (ServiceWAP) Muszę wyświetlić stronę dla urządzeń mobilnych gdzie potrzebny osobny szablon, obrazki niskiej rozdzielczości itp. 7. (ServiceJSON) Gdy dane muszą być zwrócone w formacie JSON. 8. (ServiceXML) Te same dane co poprzednio ale w formacie XML. I tak się o nic nie martwię. Użytkownik klikając w link wybiera usługę, moduł i akcję jaką chce wykonać. Jeżeli moduł obsługuję daną usługę, ustawiam tym danych wynikowych dla modułu ( $module->setOutputType($service->getOutputType()); $service->run($module); ) to wywoływana jest akcja i dalej wszystko dzieje się w zależności jaka to była usługa. Jeżeli coś jest nie tak (nie ma akcji, nie ma modułu, moduł nie obsługuje danej usługi) to loguję taką informację że coś mogło pójść nie tak i wyświetlam stronę 404. Jedyne co Ci potrzebne to mała standaryzacja. U mnie dla przykładu usługa HTTP i WAP działają podobnie. Różnica polega na tym że kod modułów jest ładowany w oddzielne szablony gdzie moduły w obu przypadkach zwracają to samo (nie licząc obrazków, jeżeli to możliwe to ładowane są te w niższej rozdzielczości). JSON i XML podobnie. Moduł zwraca tablicę asocjacyjną która jest konwertowana na jeden z formatów przez usługę. Download jest specyficzny. Można nim ograniczać lub zezwalać na ściąganie plików (rozszerzyłem serwer o znakomity moduł xsendfile). Ostatnio kolega podrzucił mi ciekawy pomysł który może przetestuję. Zastanawiam się czy by przypadkiem nie spróbować przepuścić przez PHP plików graficznych. Usługa została by poszerzona i np w wypadku gdy dane zdjęcie było ładowane z zewnętrznego serwera - zabraniał bym to robić bądź też dokładał do niego znak wodny. Taka opcja do włączenia. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 16:51 |