Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Object-oriented programming _ Logika kodu w MVC + AJAX

Napisany przez: pabito 11.06.2013, 08:37:30

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. }

Napisany przez: hind 11.06.2013, 08:47:55

Albo dwie osobne metody, albo osobne widoki wybierane na podstawie typu żądania.

Napisany przez: pabito 11.06.2013, 08:53:12

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 ?

Napisany przez: #luq 11.06.2013, 09: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. }


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

Napisany przez: pabito 11.06.2013, 09:34:18

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

Napisany przez: Damonsson 11.06.2013, 09:52:24

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

  1. public function add($name){
  2.  
  3. if( http://www.php.net/isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && http://www.php.net/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. }

Napisany przez: !*! 11.06.2013, 10:13:54

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( http://www.php.net/isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && http://www.php.net/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. http://www.php.net/exit;
  8. }
  9. $this->load->view('jakis_widok');
  10. }

Napisany przez: pabito 11.06.2013, 11:01:25

@up

chyba w przypadku gdy żądanie nie będzie AJAXowe element się nie doda. ?

Napisany przez: destroyerr 11.06.2013, 12:10:31

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.

Napisany przez: pabito 11.06.2013, 12:48:08

czyli pomysł #luq jest poprawny i najlepszy?

Napisany przez: destroyerr 11.06.2013, 12:58:16

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.

Napisany przez: pabito 11.06.2013, 16:21:56

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.

Napisany przez: hind 12.06.2013, 07:12:16

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. }



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)