Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Logika kodu w MVC + AJAX
pabito
post 11.06.2013, 08:37:30
Post #1





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


Witam
Poniżej opiszę sytację nad którą mam problem. Moim problemem jest rozmieszczenie funkcji które są wywoływane poprzez AJAX
Załóżmy taka sytuację.
Mam pewien kontoller a w nim metode add($name)

  1.  
  2. Moj_Controller extends Controller
  3. {
  4. public function add($name){
  5. //jest tuutaj ladowany model Moj_Model
  6. //nastepnie wywoluje metode add Moj_Model
  7. $this->Moj_Model->add($name);
  8.  
  9. //teraz laduje widok ze wszystkimi elementami
  10. $this->load->view('jakis_widok');
  11. }
  12. }


nastepnie moj model wyglada tak
  1. Moj_Model extends Model
  2. {
  3. public function add($name){
  4. //dodaje element o name=$name
  5. }
  6. }


wszystko działa dobrze, po kliknięciu w dany link element zostaje dodany oraz ponownie wyświetlona lista elementów(z ładowanego widoku) z tym ze dochodzi do przeładowania strony.

I teraz moje pytanie jak dodać tutaj obsługę AJAX, skoro metoda add na końcu ładuje widok ? A mi potrzebne jest np. ID ostatniego rekordu. Jak mam to zrobić ? Musze zrobić osobne metody w Controlerze i Modelu do obsługi AJAXowych żądań ?
np. tak ?
  1. Moj_Controller extends Controller
  2. {
  3. public function add($name){
  4. //jest tuutaj ladowany model Moj_Model
  5. //nastepnie wywoluje metode add Moj_Model
  6. $this->Moj_Model->add($name);
  7.  
  8. //teraz laduje widok ze wszystkimi elementami
  9. $this->load->view('jakis_widok');
  10. }
  11.  
  12. public function ajax_add($name) {
  13. $this->Moj_Model->ajax_add($name);
  14. }


Ten post edytował pabito 11.06.2013, 08:39:49
Go to the top of the page
+Quote Post
hind
post 11.06.2013, 08:47:55
Post #2





Grupa: Zarejestrowani
Postów: 142
Pomógł: 24
Dołączył: 30.03.2009
Skąd: Rokitno Szlacheckie

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


Albo dwie osobne metody, albo osobne widoki wybierane na podstawie typu żądania.
Go to the top of the page
+Quote Post
pabito
post 11.06.2013, 08:53:12
Post #3





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


Cytat(hind @ 11.06.2013, 09:47:55 ) *
Albo dwie osobne metody


a czy stworzenie praktycznie dwóch tych samych metod, które robią prawie to samo nie będzie niepotrzebnym duplikowaniem kodu ?
Go to the top of the page
+Quote Post
#luq
post 11.06.2013, 09:31:40
Post #4





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Raczej coś takiego:

  1. Moj_Controller extends Controller
  2. {
  3. public function ajax_add($name) {
  4. $this->Moj_Model->add($name);
  5. }
  6.  
  7. public function add($name){
  8. $this->ajax_add($name);
  9.  
  10. $this->load->view('jakis_widok');
  11. }
  12. }


Dlaczego model pod asynchroniczny request miałby się różnić od modelu synchronicznego requesta?


--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post
pabito
post 11.06.2013, 09:34:18
Post #5





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


miałem na myśli stworzenie nowych metod w modelu i controllerze a nie stworzeniu nowego, osobnego modelu.
edit: źle wczytałem się w Twój przykład

Cytat(#luq @ 11.06.2013, 10:31:40 ) *
Raczej coś takiego:

  1. Moj_Controller extends Controller
  2. {
  3. public function ajax_add($name) {
  4. $this->Moj_Model->add($name);
  5. }
  6.  
  7. public function add($name){
  8. $this->ajax_add($name);
  9.  
  10. $this->load->view('jakis_widok');
  11. }
  12. }


ciekawe rozwiązanie, ciekawe co myślą o nim inni smile.gif


Ten post edytował pabito 11.06.2013, 09:37:24
Go to the top of the page
+Quote Post
Damonsson
post 11.06.2013, 09:52:24
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Nie wiem czy dobrze zrozumiałem problem, ale może coś takiego?

  1. public function add($name){
  2.  
  3. if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && strtolower( $_SERVER['HTTP_X_REQUESTED_WITH'] ) == 'xmlhttprequest') { // jeśli żądanie AJAX
  4. $this->Moj_Model->add($name);
  5. }
  6.  
  7. $this->load->view('jakis_widok');
  8.  
  9. }
Go to the top of the page
+Quote Post
!*!
post 11.06.2013, 10:13:54
Post #7





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Pytanie po co ajax ma ładować widok, po jego detekcji robisz exit, ewentualnie wysyłasz json.

Tak jak wyżej:

  1. public function add($name)
  2. {
  3. if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && strtolower( $_SERVER['HTTP_X_REQUESTED_WITH'] ) == 'xmlhttprequest')
  4. { // jeśli żądanie AJAX
  5. $this->Moj_Model->add($name);
  6. // lub tu jak musisz zwracasz dane w json_encode
  7. }
  8. $this->load->view('jakis_widok');
  9. }


Ten post edytował !*! 11.06.2013, 10:14:14


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
pabito
post 11.06.2013, 11:01:25
Post #8





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


@up

chyba w przypadku gdy żądanie nie będzie AJAXowe element się nie doda. ?
Go to the top of the page
+Quote Post
destroyerr
post 11.06.2013, 12:10:31
Post #9





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Cytat
Pytanie po co ajax ma ładować widok, po jego detekcji robisz exit, ewentualnie wysyłasz json.

Po to należy załadować widok żeby wyświetlić/wysłać/wyrenderować json. Kontroler ma wybrać odpowiedni widok (na podstawie żądania) i go wyświetlić, niezależnie od tego czy będzie to html, json czy pdf. O wywołaniu exit należy zapomnieć, po pierwsze źródło żądania nie ma pojęcia co się stało. Dodatkowo nie wykonają się żadne zadania konieczne do wykonania już po akcji.
Go to the top of the page
+Quote Post
pabito
post 11.06.2013, 12:48:08
Post #10





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


czyli pomysł #luq jest poprawny i najlepszy?
Go to the top of the page
+Quote Post
destroyerr
post 11.06.2013, 12:58:16
Post #11





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Moim zdaniem nie. Skoro dane przesyłane z przeglądarki za pomocą ajaxa nie różnią się od tych pochodzących z synchronicznego żądania to kontroler ma dokładnie to samo zadanie i wykonuje je w ten sam sposób. Powinien wykonać operacje na modelu i przekazać go do widoku. Jeden model, jeden kontroler, dwa widoki.
Go to the top of the page
+Quote Post
pabito
post 11.06.2013, 16:21:56
Post #12





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


hmm już sam nie wiem.

Mój cel:
Gdy wywołam skrypt synchronicznie, chcę aby element został usunięty i wyświetlony widok.
Gdy wywołam skrypt asynchronicznie, chcę aby element został usunięty, zwrócona informacja o nim i wyświetlony widok.
Go to the top of the page
+Quote Post
hind
post 12.06.2013, 07:12:16
Post #13





Grupa: Zarejestrowani
Postów: 142
Pomógł: 24
Dołączył: 30.03.2009
Skąd: Rokitno Szlacheckie

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


Cytat(pabito @ 11.06.2013, 09:53:12 ) *
a czy stworzenie praktycznie dwóch tych samych metod, które robią prawie to samo nie będzie niepotrzebnym duplikowaniem kodu ?

  1. class controller {
  2. public function addAction() {
  3. $this->_add();
  4. $this->view->ok = 'ok';...
  5. }
  6. public function addajaxAction() {
  7. if($this->_add([dane])) {
  8. return ajax_success();
  9. } else {
  10. return ajax_error();
  11. }
  12. }
  13.  
  14. protected function _add() {
  15. [mielenie]
  16. }
  17. }


Inna opcja to zmiana widoku. dla normalnego:
  1. public function add($name)
  2. {
  3. $this->Moj_Model->add($name);
  4. if( ajax) {
  5. $this->load->view('jakis_widok_ajax');
  6. } else {
  7. $this->load->view('jakis_widok');
  8. }
  9. }


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: 28.03.2024 - 23:43