Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Własny, prosty silnik MVC
Forum PHP.pl > Forum > PHP > Object-oriented programming
iro88
Jestem w trakcie pisania własnego silnika MVC i natknąłem się na pewien problem z działaniem kodu.

index.php wygląda następująco.
  1. <?php
  2. require_once('app/init.php');
  3.  
  4. $router = new Application_Routing();
  5. $httprequest = new Application_Request();
  6.  
  7. $httprequest ->GetParamFromUrl();
  8. $router ->setMVC($httprequest->model,$httprequest->view,$httprequest->controller);
  9. $router ->doAction($httprequest->controller,$httprequest->action,$httprequest->param);
  10.  
  11. ?>


Chyba nie ma co dużo tłumaczyć. Index inicjuje (includuje potrzebne pliki) tworzy obiekty do odczytywania URLa i wczytania na tej podstawie odpowiednich plików Modelu, Widoku i Kontrolera.

Teraz ta część której nie jestem pewny, prawdopodobnie sama filozofia jest rąbnięta, ale już tłumaczę o co mi chodzi...
Następnie gdy mamy wczytany już model, kontroler i widok, aplikacja bierze (jeśli jest coś w url'u) dane do wykonania akcji (wywołania odpowiedniej funkcji) i ją wykonuje.

W widoku mam link, który podaje do url'a dane do akcji. Akcja zostaje wykonana, jednak, aby zobaczyć zmiany muszę ręcznie odświeżyć stronę, bo wszystko dzieje się na pliku index.php i nie odświeża mi go podczas klikania na link.

Teraz pytanie, co można z tym zrobić, aby hulało? Próbowałem z header ale wyskakuje błąd, że nie można przekierować na stronę która jest obecnie wczytana. Za jakiekolwiek wskazówki, podpowiedzi będę bardzo wdzięczny.
Crozin
Po pierwsze w MVC to kontroler decyduje jakie modele i widoki (tak, może ich być wiele) utworzyć.
Po drugie przeczytaj o zasadzie pojedynczej odpowiedzialności - to w kontekście obiektu Application_Request.
Po trzecie korzystaj z PHP5.3.

A wracając do tematu... albo przepisz to jeszcze raz albo dołącz jakiś kod, bo szczerze powiedziawszy ciężko zrozumieć o co Ci chodzi/co jest nie tak.
iro88
Pytanie o co mi chodzi nie jest chyba właściwym, bo opisane jest w pierwszym poście, ale spróbuję uściślić.
Chodzi mi o to, jak powinien wyglądać mechanizm routingu i sam plik index.php, by na jednym widoku móc przeprowadzać różne akcje i nie musieć jej odświeżać by zobaczyć efekty tych akcji?

Co do reszty kodu to jest trochę rozbudowana, pojutrze postaram się wstawić jak wrócę z pracy. Ale nie sądzę, że jest to aż takie ważne, skoro chodzi mi o konkretną rzecz, gdzie nie trzeba szukać błędu w kodzie, bo działa (lecz trza odświeżać ręcznie lub klikać w link dwukrotnie - i w tym tak na prawdę mój problem).
Crozin
Cytat
[...] by na jednym widoku móc przeprowadzać różne akcje i nie musieć jej odświeżać by zobaczyć efekty tych akcji?
Ale przecież to nie jest możliwe w przypadku aplikacji webowych, bo wykonanie akcji oznacza konieczność wykonania nowego żądania czyli przeładowanie strony. Tego nie przeskoczysz na chwilę obecną.
fleshgrinder
Cytat(Crozin @ 23.01.2011, 23:30:33 ) *
Ale przecież to nie jest możliwe w przypadku aplikacji webowych, bo wykonanie akcji oznacza konieczność wykonania nowego żądania czyli przeładowanie strony.


hm.. a Ajax?
Crozin
A co robi AJAX jak nie nowe żądanie tyle że w tle? Z punktu widzenia aplikacji (po stronie serwera) praktycznie niczego to nie zmienia.
fleshgrinder
Tak, po stronie serwera zmiany praktycznie nie ma, ale mam wrażenie, że iro88 chodziło bardziej o to, co widać po stronie klienta smile.gif

Poza tym:
Cytat(iro88)
W widoku mam link, który podaje do url'a dane do akcji. Akcja zostaje wykonana, jednak, aby zobaczyć zmiany muszę ręcznie odświeżyć stronę, bo wszystko dzieje się na pliku index.php i nie odświeża mi go podczas klikania na link.


Brzmi mi to tak, jakbyś przekazywał dane do widoku zanim jeszcze zostanie wykonana akcja.. Przykład, żebym wiedział czy dobrze zrozumiałem: powiedzmy, że masz widok listy elementów i akcję kasującą element podlinkowaną jako "usuń". Jest lista elementów, klikasz "usuń", element zostaje usunięty z bazy, ale po przeładowaniu wciąż widać go na liście, dopiero kliknięcie w odśwież sprawia, że pojawia się stan faktyczny - na tym polega problem? Jeśli tak, to znaczy, że akcje po stronie serwera wykonują się w niewłaściwej kolejności.

Masz pewnie kolejność podobną do tej:
- załaduj elementy i przekaż informacje do widoku
- wykonaj akcję (usuń element)
- renderuj widok

Dwa pierwsze kroki powinieneś zamienić miejscami.
iro88
Dobrze mnie rozumiesz fleshgrinder. Właśnie o to mi chodzi.
Problem w tym, jak dać możliwość do kliknięcia w przykładowe 'usuń' bez wcześniejszego wyświetlenia widoku? Działając w proceduralnym php zapętliłbym index.php do następnej 'ackji'.
Ale jak to zrobić pisząc w obiektowym?
Czuję czym jest renderowanie lecz nie wiem czy dobrze. Obecnie nie mam takiej funkcji w swoim frameworku.
iwosz
Cytat(iro88 @ 26.01.2011, 13:49:46 ) *
Dobrze mnie rozumiesz fleshgrinder. Właśnie o to mi chodzi.
Problem w tym, jak dać możliwość do kliknięcia w przykładowe 'usuń' bez wcześniejszego wyświetlenia widoku? Działając w proceduralnym php zapętliłbym index.php do następnej 'ackji'.
Ale jak to zrobić pisząc w obiektowym?
Czuję czym jest renderowanie lecz nie wiem czy dobrze. Obecnie nie mam takiej funkcji w swoim frameworku.


hmm, z tego co rozumiem w url-u przekazujesz info jaki ma być uruchomiony kontroler i jaka akcja ma być przeprowadzona oraz jaki obecnie masz załadowany widok? Więc pozostaje po wykonaniu akcji przerenderować na nowo widok. Jeśli wykonywał byś odpytanie za pomocą ajaxa to musiał byś dodatkowo wywołać odświeżenie widoku. Może wklej kod który renderuje widok, może tam coś jest nie tak...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.