Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logika kodu w MVC + AJAX
Forum PHP.pl > Forum > PHP > Object-oriented programming
pabito
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. }
hind
Albo dwie osobne metody, albo osobne widoki wybierane na podstawie typu żądania.
pabito
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 ?
#luq
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?
pabito
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
Damonsson
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. }
!*!
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. }
pabito
@up

chyba w przypadku gdy żądanie nie będzie AJAXowe element się nie doda. ?
destroyerr
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.
pabito
czyli pomysł #luq jest poprawny i najlepszy?
destroyerr
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.
pabito
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.
hind
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. }


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-2024 Invision Power Services, Inc.