Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MVC] Owieranie kontrolerów w środku innego.
webdice
post 29.05.2007, 11:34:13
Post #1


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Na początek sory za temat ale nie bardzo wiem jak to nazwać. Nie wiem jak rozwiązać mój problem, a mianowicie mam index i chce zrobić menu (w indexie), ewentualnie część prawą, lewą i jakąś stopkę i tu moje pytanie jak wy to rozwiązujecie w waszych frameworkach. Najbardziej bym chciał mieć np application.Controller.php (w nim zawarte jakieś akacje odnośnie indexu) i inne kontrollery, np news.Controller.php, ogolnie chodzi o to jak includować newsController w applicationController. Ja widze tylko takie rozwiązanie: w odpowiednim miejscu w pliku z szablonem wstawić coś typu

Kod
forward ('controller', 'akcja')


ale takie rozwiązanie nie bardzo mi się podoba, tak samo nie chciałbym dzielić indexu na górną i dolną cześć.\

Pozdrawiam Piotrek.

Ten post edytował webdicepl 29.05.2007, 11:34:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nrm
post 29.05.2007, 11:45:39
Post #2





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


layout w całość łączymy w widoku winksmiley.jpg ale każdy robi jak lubi winksmiley.jpg w ZF chyba masz ładny foward, przejrzyj dokumentację.


--------------------
Go to the top of the page
+Quote Post
LBO
post 29.05.2007, 11:48:31
Post #3





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


W różnych frameworkach jest to różnie rozwiązane np. (najczęściej spotykany) główny plik widoku tzw. layout gdzie możesz utworzyć szkielet strony (nagłówek, stopka, menu i render widoku z kontrolera). Jeżeli chcesz, by te poszczególne części były dynamiczne (po to zapewne używasz kontrolerów), możesz wtedy skorzystać z helperów/komponentów/apletów (w zależności od nazewnictwa frameworka) widoku.

Tak ja to widzę.

Ten post edytował LBO 29.05.2007, 11:49:07
Go to the top of the page
+Quote Post
Ludvik
post 29.05.2007, 12:13:36
Post #4





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Nie mieszałbym widoku z akcjami. Ja bym to zrobił tak:

Application Controller wybiera akcję, która jest realizowana przez jakieś polecenie, które przygotowuje wszystkie potrzebne dla widoku dane. Po pobraniu treści, wybierany jest widok i przekazywany do niego obiekt kontekstu, który zawiera wszystkie niezbędne dla widoku informacje. Renderujemy widok.

Sam widok jest złożony - do szablonu dołączamy komponenty. Jednym z nich może być menu. Generujemy wszystkie z nich, łączymy w głównym szablonie i zwracamy klientowi.

Warto poczytać o wzorcach projektowych, np. o Composite View.

Ten post edytował Ludvik 29.05.2007, 12:13:57


--------------------
Go to the top of the page
+Quote Post
LBO
post 29.05.2007, 12:28:07
Post #5





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Cytat(Ludvik @ 29.05.2007, 13:13:36 ) *
Sam widok jest złożony - do szablonu dołączamy komponenty. Jednym z nich może być menu. Generujemy wszystkie z nich, łączymy w głównym szablonie i zwracamy klientowi.


Czyli w każdym widoku, każdej akcji musimy manualnie, w trakcie tworzenia widoku, dołączać helpery (menu), ewentualnie podwidoki (nagłówek, stopka)?

Cytat(Ludvik @ 29.05.2007, 13:13:36 ) *
Warto poczytać o wzorcach projektowych, np. o Composite View.


Ja polecam to

Ten post edytował LBO 29.05.2007, 12:28:52
Go to the top of the page
+Quote Post
webdice
post 29.05.2007, 12:37:36
Post #6


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Dzięki Panowie, jak wrócę do domu to się będę z tym bawił i ewentualnie zadawał kolejne pytania smile.gif

Pozdrawiam.
Go to the top of the page
+Quote Post
Ludvik
post 29.05.2007, 12:43:29
Post #7





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
Czyli w każdym widoku, każdej akcji musimy manualnie, w trakcie tworzenia widoku, dołączać helpery (menu), ewentualnie podwidoki (nagłówek, stopka)?


Można tak zrobić. Jeżeli możesz wyodrębnić wyraźny szkielet widoku, to można utworzyć podstawowy widok, w którym zagnieździmy inne. Wtedy wybór widoku ograniczałby się do wyboru podwidoku... W gruncie rzeczy, jak to zrobisz, to sprawa programisty... Nie ma konkretnego sposobu, są wzorce, które dają ogólny pogląd, jak np. Composite View. Jest widok i są w nim zagnieżdżone elementy, ale implementacja jest sprawą osobistą...

Co do książki, to też mogę polecić... Warto też korzystać z blueprints...

Ten post edytował Ludvik 29.05.2007, 12:44:55


--------------------
Go to the top of the page
+Quote Post
Reigon
post 20.06.2007, 14:27:13
Post #8





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

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


Sa dwa rozwiazania,ktore przychodza mi do glowy i zeby, jak to powiedzial poprzednik, nie wklepywac wywolywania akcji komponentow manualnie. Pierwsze juz opisal Ludvik i mozna je zastosowac jezeli np. komponenty layoutu wystepuja ale moga w ogole nie wystapic.

Drugim rozwiazaniem (moze nawet lepszym, o ile elementy te zawsze wystepuja, ale sa dynamiczne) jest zastosowanie wzorca Intercepting Filter i wykonywanie akcji menu,header,footer jako akcje preprocessing,
a nastepnie przekazanie wynikow wraz z akcja wywolywana do renderowania. Drugi sposob mozna takze wykorzystac, jezeli elementy te nie wystepuja zawsze - nalezy wtedy zastosowac kilka rodzajow filtrow.
Go to the top of the page
+Quote Post
splatch
post 20.06.2007, 21:32:36
Post #9





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

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


Wywoływanie kolejnych kontrolerów w celu dekorowania widoku nie jest złe, ale z pewnością kłopotliwe. Zwykle filter chain jest już zainicjowany a akcja jako taka jest jego ostatnim elementem wiec dorzucanie kolejnych rzeczy wiąże się zawsze z problemami. Na przykład renderowanie dwóch różnych stron może przebiegać w następujący sposób:
Kod
... filter chain > admin > menu > footer

Kod
... filter chain > frontend > menu > cart > orders > footer

Menu jest stałe, ale renderowanie pozostałych elementów zależne od różnych czynników. Aby uzyskać interesujący efekt konieczne byłoby ręczne konfigurowanie łańcucha w każdej akcji, co zdecydowanie wygodne nie będzie.

W Agavi, Symfony, Mojavi 4 i inne frameworki, które wywodzą się z Mojavi 2/3 a mają wyodrębnioną obsługę widoków wspierają forwardowanie akcji oraz, jak mi się wydaje, rozwiązanie Twojego problemu - mianowicie layouty.

Wygląda to tak, że definiuje się układ, komponenty, które wchodzą w jego skład (menu, stopka, jakieś dodatkowe bloki) i nadaje mu nazwę - powiedzmy "front", "admin", "product", "category" i tak dalej. Każdy z nich różni się przy produktach dorzucamy od razu komentarze i galerię. W widoku danej akcji wystarczy wywołać metodę setLayout(nazwa) by zmienić układ. W sloty wskoczą wyniki wykonywania danych akcji.
Logika bez zmian, widok bardziej elastyczny a i jego zmiany nie wpływają na warstwę biznesową.

Forwardy są przeznaczone do wpięcia pewnego fragmentu uniwersalnej logiki - takich sytuacji jest tak na prawdę niewiele, ponieważ jeśli coś powtarza się często, powiedzmy logowanie operacji wygodniej jest to wrzucić do filtru, zatem forwardy głównie sprowadzają się do zrobienia redirecta, stąd w Agavi od wersji 0.11 forwardy nie są dostępne, w ich miejsce można robić "mini forwardy" na widoki.


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

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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 18:34