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
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 (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) co o tym sądzicie ..
Go to the top of the page
+Quote Post
menic
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
widmogrod
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ..

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

Pozdrawiam
widmogrod
Go to the top of the page
+Quote Post
menic
post
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 (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png) Tak wiec mozliwosci kombinowania jest dużo (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif) I jak zechce to moge odpalic nawet kilka razy ta samą akcje (tylko nie wiem po (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif) )

Ten post edytował menic 15.01.2007, 20:58:51
Go to the top of the page
+Quote Post
widmogrod
post
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?
Go to the top of the page
+Quote Post
arecki
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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
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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

CZy to komplikowanie? W pewnym sensie tak, ale zalezy jak na to pparztec (IMG:http://forum.php.pl/style_emoticons/default/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?) (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
widmogrod
post
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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
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: 1.01.2026 - 18:56