Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Ładowanie akcji oraz widoków w FW, Dyskusja
widmogrod
post 15.01.2007, 15:05:08
Post #21





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 28.10.2005
Skąd: kraków

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


Witam, zaprezentuje moje rozwiązanie tego problemu

posiadam plik konfiguracyjny bloków np:
  1. <block>
  2. <default>
  3.    <layout>index.tpl<layout>
  4.    <blocks>
  5.         <main controller="index" action="index" />
  6.         <info controller="index" action="info" />
  7.    </blocks>
  8. </default>
  9. <login>
  10.    <layout>login.tpl<layout>
  11.    <blocks>
  12.         <main controller="login" action="index" />
  13.    </blocks>
  14. </login>
  15. </block>


default - są zdefiniowane domyślnie odpalane bloki i szablon który ma je wykorzystać
login - jak wyżej ..

z odpaleniem default nie ma problemu ( odpalany domyślnie ) ale teraz jak odpalić login otóż posiadam aliasy na rutera które definiują w sobie odpalane bloki przykład pliku konfiguracyjnego aliasów
w szablonie wykorzystuje je w następujący sposób

  1. <alias>
  2.    <login controller="logowanie" action="main" block="login"/>
  3. <alias>


w kontrolerze definiuje "łapanie" bloków poprzez metode setBlock() np.

  1. <?php
  2. class indexAction extends AController
  3. {
  4. public function index(){
  5. $view = $this->getView();
  6. $this->setBlock('main', $view->parse('index/main.tpl');
  7. }
  8.  
  9. public function info(){
  10. $view = $this->getView();
  11. $view->infoMSG = 'jakaś informacja';
  12. $this->setBlock('info', $view->parse('index/info.tpl');
  13. }
  14. }
  15.  
  16. class logowanieAction extends AController
  17. {
  18. public function main(){
  19. $view = $this->getView();
  20. $this->setBlock('main', $view->parse('logowanie/main.tpl');
  21. }
  22. }
  23. ?>


i wykorzystuje je w szablonie głównym poprzez taką linijkę
  1. <?php print $this->block->main?>


... mam nadzieje że przedstawiłem to w miare zrozumiale ..

PS1. moim zdaniem definiowanie odpalanych bloków w akcji jest delikatnie chybione, bo gdy chcemy wzbogacić widoko jakieś dodatkowe bloki trzeba przeszukać klasy akcji i je zmodyfikować, a trzymając to w jednym nie pogubimy się przy większych projektach ..

PS2. można też zrobić pomocnika dla widoku który odpala odpowiednie akcje tj ..
  1. <?php print $this->block->run('index', 'main');?>

wtedy zabawa nie jest już tak hardkorowa z plikami konfiguracyjnymi ... ale czy jest to zgodne z MVC questionmark.gif co o tym sądzicie ..


--------------------
http://blog.widmogrod.info

KontorX – rozszeżenie bibliotek Zend Framework - http://code.google.com/p/kontorx/
KontorX – przykłady - http://kontorx.widmogrod.info

Cappuccino Framework - http://wiki.widmogrod.info/cappuccino
Go to the top of the page
+Quote Post
menic
post 15.01.2007, 18:21:25
Post #22





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


Szczerze? Nie rozumiem o czym piszesz blink.gif Co masz pod pojęciem bloki. Bo dla mnie to kawałek kodu php i html umieszczane w glownym layoucie strony, raczej nie mający powiązań z akcjami.


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
widmogrod
post 15.01.2007, 19:56:23
Post #23





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 28.10.2005
Skąd: kraków

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


u mnie bloki są wynikiem akcji ..

Po sparsowaniu xml'a (z poprzedniego postu) mam tablice, która zawiera nazwy bloków z kontrolerem i akcją do odpalenia. Wrzucam to do ActionChain i ruszam z tym w FrontControllerze razem z wynikiem rutera.
Każda z odpalonych akcji umieszcza swój wynik w odpowiednim bloku poprzez

  1. <?php
  2. $this->setBlock('mojBlok', 'trescBloku');
  3. ?>


teraz tak zcachowany widok akcji wywalam do szablonu poprzez

  1. <?php
  2. print $this->block->mojBlock;
  3. ?>


Mam nadzieje ze sprostowałem nazwe "bloki" w moim FW ..
Ps. rzeczywiście delikatnie odskoczyłem od wątku dry.gif ... jednak jedną akcja z url'a np. index.php/news/show/2 jestem w stanie jednocześnie odpalić akcje komentarzy do tej akcji i bez problemowo połączyć je w jednym szablonie winksmiley.jpg ..

jak za bardzo namieszałem w wątku z góry przepraszam

Pozdrawiam
widmogrod


--------------------
http://blog.widmogrod.info

KontorX – rozszeżenie bibliotek Zend Framework - http://code.google.com/p/kontorx/
KontorX – przykłady - http://kontorx.widmogrod.info

Cappuccino Framework - http://wiki.widmogrod.info/cappuccino
Go to the top of the page
+Quote Post
menic
post 15.01.2007, 20:58:03
Post #24





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


Smieszne masz nazewnictwo wszystkiego. U mnie sa tylko dwa kontrolery: Controller oraz AppController. Ten pierwszy znany jest jako FrontController. Dalej jest moduł i akcja z widokiem. U ciebie kazdy moj moduł to jest nowy kontroler :roll2: Ale wracajac do tematu...
Ja nie musze nic edytować, dopisywac do szablonu. Nic z tych rzeczy. Kazdy kazda akcja modułu ma swoj tpl które są ładowane do głownego tpl
  1. <h1>Witamy na stronie Sparkle Works :)</h1><hr><br>
  2. <pre>
  3. </pre>
  4.  
  5. <?php
  6. $this->loadModuleView();
  7. ?>
  8. <br><br><br><br><br><br>
  9. <hr>
  10. Powered by Sparkle
Kazdy wynik akcji bedzie w loadModuleView().
Natomiast w samej akcji moge zrobić nawet cos takiego:
  1. <?php
  2. class DefaultAction extends View
  3. {
  4. public function Index()
  5. {
  6. //$this->redirect( 'Show', 'News', Array( 'type' => 'get', 'id' => 77 ) );
  7. //echo 'forward<br>';
  8. $this->forward('Show', 'Default'); //Przekieruje do modułu Default do akcji Show nie wyświetlając wyniku aktualnej akcji
  9. $this->newModel( 'Show', 'News' ); //Załaduje akcje Show z modułu News wraz z widokiem
  10. $this->newModel( 'Show', 'Test', Array('id' => 77, 'type' => 'get') );  //Załaduje akcje Show z modułu test wraz z parametrami oraz widokiem
  11. }
  12. }
  13. ?>
Natomiast jesli forward() damy na koncu to zostaną wykonane wczesniejsze załadowane akcje, ale bez ładowania widoków Rkingsmiley.png Tak wiec mozliwosci kombinowania jest dużo guitar.gif I jak zechce to moge odpalic nawet kilka razy ta samą akcje (tylko nie wiem po snitch.gif )

Ten post edytował menic 15.01.2007, 20:58:51


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
widmogrod
post 15.01.2007, 23:22:03
Post #25





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 28.10.2005
Skąd: kraków

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


Cytat
Smieszne masz nazewnictwo wszystkiego. U mnie sa tylko dwa kontrolery: Controller oraz AppController.

Zwał jak zwał .. funkcje są podobne AForntController - jest to "rozrusznik" zaczyna wszystko i AController - jest to abstrakcja akcji .. u ciebue View, widze ze posiada metode forward() co pasuje mi bardziej do akcji niż do widoku ale to jest kwestia podejścia programisty do projektowania FW i nazewnictwa .. no chyba ze dziedziczony View nie posiada forwarda ... i ma całkiem inne zadanie .. możesz mi powiedzieć jakie cechy ma klasa View?

Powiem ze ciekawe rozwiązanie .. jednak zostane przy swoim .. a zawsze mogę wyposażyć FW w metode

  1. <?php
  2. $wynik = $this->runAction('controller', 'action', 'params');
  3. ?>
( takie rozwiązanie jest chyba w symfony .. nie jestem 100% pewien .. )

która bedzie mi zwracać wynik akcji z innego kontrollera ect. i później
  1. <?php
  2. $view->set('main', $wynik);
  3. ?>


i w szablonie

  1. <?php
  2. print $main;
  3. ?>


i podobny efekt, co o tym sądzisz?


--------------------
http://blog.widmogrod.info

KontorX – rozszeżenie bibliotek Zend Framework - http://code.google.com/p/kontorx/
KontorX – przykłady - http://kontorx.widmogrod.info

Cappuccino Framework - http://wiki.widmogrod.info/cappuccino
Go to the top of the page
+Quote Post
arecki
post 16.01.2007, 00:20:00
Post #26





Grupa: Zarejestrowani
Postów: 222
Pomógł: 35
Dołączył: 6.02.2005

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


Przyglądam się Waszej i snuje wnioski i pomysły smile.gif. Wnioski takie mam, że albo lubicie sobie komplikować sprawę albo po prostu 'tak Wam wygodnie'. Oczywiście każdy ma to co lubi i pisze FW dla siebie i pod siebie. Z resztą sam też się w to bawię i więcej mam przyjemności z budowy FW niż z samego korzystania z niego smile.gif.

Co do wywoływań akcji to akurat ja sobie to zupełnie inaczej obmyśliłem. Wydaje mi się że sporo prościej ale po kolei wytłumaczę. Generalnie jest sobie kontroler. Ma on funkcję statyczną runEvent() z parametrami : jaką klasę i metodę wywołać oraz jakie parametry przesłać do niej. Zwraca to co dana metoda wypluje. Oczywiście sam kontroler ma w sobie mechanizmy sprawdzające czy się wywołania nie zapętlą itp. Ma również obiekty odpowiadające za cache'owanie obiektów akcji (czy jak ja to nazywam 'eventów'), za dane sesji no i za widok.

Metodę runEvent można wywołać z każdego miejsca FW tak więc odpada nam konieczność robienia forward() i martwienia się o to czy można i jak. Dodatkowo daje nam możliwość kontrolowania kazdej akcji z poziomu kontrolera (chyba zamieszałem:) ). Każda klasa obsługująca zdarzenia musi dziedziczyć po bazowej klasie do zdarzeń. Dzięki temu każda z akcji ma możliwość dodania zmiennych wyświetlanych w widoku czy modyfikacji zmiennych sesyjnych. Dopiero później kontroler przekazuje do widoku sterowanie z zebranymi danymi. Jedyne co akcja musi zrobić to zdefiniować nazwę szablony do wyświetlenia i tylko ta akcja która została wywołana z router'a. Dodatkowo mam możliwość zdefiniowania czy daną akcję mogę wywołać przez URL'e czy tylko i wyłącznie przez metodę runEvent.

Jedyne co mnie natchnęliście to muszę się zastanowić czy chcę aby klasy obsługujące zdarzenia miały możliwość definiowania własnych części widoku a nie tylko danych do wyświetlenia.


--------------------
Go to the top of the page
+Quote Post
menic
post 16.01.2007, 07:50:54
Post #27





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


View dziediczy po AppControlerze, stąd dostepnośc forward. W Klasie View trzymane są metody jak nazwa wskazuje do widoku, takie jak loadModuleView(), loadAppView(), setView() itp. Narazie jeszcze jest nie rozubudowana, gdyz meczyłem sie z kontrolerami smile.gif

CZy to komplikowanie? W pewnym sensie tak, ale zalezy jak na to pparztec winksmiley.jpg Pisze o głownie dla pożniejszej wygody. Wkurzyło mnie jak pisałem w Symfony, ze w module newsów musze pisac tez moduł komentarzy (wiec po co cała modułowosc?) dry.gif
U mnie Controller odpowiada tylko za załadowanie odpowiednich plikow i tyle. Reszte przejmuje appController z funkcjiami do ładowania akcji itp. Metoda NewModel() to jest tak jak by nakladka na metode executeAction() z appControllera. Musiałem rozdzielic, bo raczej rzadko sie uzywa newModel wiec bez sensu byłoby to pakowanie do głownej metody wywoławczej smile.gif
A działanie forward jest takie, ze wykonuje wszystko w danej akcji, lecz nie wyswietla jej wyniku tylko przenosi do innej akcji i tam juz wyswietla wynik tej przeniesionej biggrin.gif


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
widmogrod
post 16.01.2007, 13:42:02
Post #28





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 28.10.2005
Skąd: kraków

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


@menic - i już wszystko jasne ( ciekawe podejście smile.gif) ..
Cytat
Z resztą sam też się w to bawię i więcej mam przyjemności z budowy FW niż z samego korzystania z niego

hehe .. z tym sie zgodze biggrin.gif

Każdy ma swoje podejście do projektowania i dla mnie takie rozwiązanie jest bardziej przyjemne .. jednak ciągle się rozwijam i kto wie czy za miesiąc nie będę miał nowej wizji rozwiązania tego problemu .. czy też innych

Pozdrawiam
Miłego kodowania

Ten post edytował widmogrod 16.01.2007, 13:45:59


--------------------
http://blog.widmogrod.info

KontorX – rozszeżenie bibliotek Zend Framework - http://code.google.com/p/kontorx/
KontorX – przykłady - http://kontorx.widmogrod.info

Cappuccino Framework - http://wiki.widmogrod.info/cappuccino
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 Wersja Lo-Fi Aktualny czas: 25.04.2024 - 16:04