Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CodeIgniter]Mysql+ajax zapis na eventy
Forum PHP.pl > Forum > PHP > Frameworki
jacobson
Witam, chce zrobic zapis na dane eventy. przy nacisnieciu przycisku ma byc wywolywana funkcja ajaxa ktora ma przeslac dane do bazy mysql (w momencie kiedy ktos zapisuje sie na dany event). No i tu pojawia sie problem gdyz z poziomu widoku (gdzie mam skrypt js) musze przeslac dane i wywolac skrypt php ktory polaczy sie z baza i wysle zapytanie... a do tego potrzebuje juz zaladowania modelu. W jaki sposob to zrobic, czy moze moje rozumowanie jest bledne i jest jakis prosty sposob tongue.gif
szok
Ale w czym problem?

Po prostu wywołaj daną metodę kontrolera który obsłuży całe twoje zapytanie.

Dodatkowo możesz sprawdzić czy to zapytanie jest ajaksowe przez:
  1. $this->input->is_ajax_request()

http://codeigniter.com/user_guide/libraries/input.html
jacobson
ale to w widoku poprostu dac
$this->load->model('blabla');
$this->blabla->metoda();
w skrypcie ajaxa ?
szok
Rozumiem że ajaksem chcesz przesłać jakie dane POST tak?
To po prostu wczytujesz ajaksem adres tak samo jak w przeglądarce.
domena.pl/controller/mojaakcja

I w niej wykonujesz wszystko jak w kontrolerze, tylko zwracasz format taki jaki chcesz.
np możesz wysłać czysty kod HTML który jest renderowany przez kontroler i ładujesz go do jakiegoś diva co masz na stronie.
jacobson
no i wlasnie zrobilem tak ale cos mi nie pyka tongue.gif

moja funkcja w widoku:

  1. function enroll(id){
  2. $.post(
  3. 'http://localhost/index.php/main/ajax_function/'+id
  4. );
  5. }


moj kontroler :

Kod
function ajax_function($id){
        $data = array(
            'userid' => $this->session->userdata('username'),
            'id' => $id
        );
        $this->db->insert('enroll', $data);
    }



no i nie wiem dlaczego to moze nie dzialac, bede mega wdzieczny za pomoc z tym ;p
szok
Nie post, tylko lepiej użyć load w jquery, rozumiem że to w jquery jest?
Kod
function enroll(id){
    $('#result').load('http://localhost/index.php/main/ajax_function/'+id, function() {
       alert('Load was performed.');
    });
}

I do Diva o ID result wrzuca Ci wynik
jacobson
nom tylko to ma tak nie dzialac tongue.gif to ma byc powiazane z mysql, po nacisnieciu przycisku (z funkcja onclick), wywoluje sie funkcja enroll(id) ktora ma za zadanie przeslac info do kontrolera ktory za to ma za zadanie skontaktowac sie z mysql i te przekazane wczesenij informacje dodac do bazy danych. Nie chodzi o to zeby do jakiegos diva wrzucalo wynik.
szok
To po prostu zrób pustego diva gdzieś, display:none; i po kłopocie.
phpion
Cytat(jacobson @ 24.05.2011, 23:25:14 ) *
no i wlasnie zrobilem tak ale cos mi nie pyka tongue.gif

...

no i nie wiem dlaczego to moze nie dzialac, bede mega wdzieczny za pomoc z tym ;p

Napisz czym objawia się owe "nie działanie". Jeśli nie korzystasz to zacznij korzystać z dodatku Firebug do Firefoxa. W sytuacjach pracy z Ajaxem jest naprawdę niezastąpiony. Może żądanie się w ogóle nie wywołuje? Może po drodze wali jakimś błędem? Zobaczysz na jaki adres idzie żądanie, jakie parametry ze sobą niesie oraz co uzyskuje w rezultacie.

Swoją drogą: w kontrolerze widzę $this->db. Na pewno w kontrolerze masz dostęp do bazy danych? Nie powinno to być przypadkiem odwołanie do metody modelu?
szok
Cytat(phpion @ 25.05.2011, 09:04:38 ) *
Swoją drogą: w kontrolerze widzę $this->db. Na pewno w kontrolerze masz dostęp do bazy danych? Nie powinno to być przypadkiem odwołanie do metody modelu?


CI na to pozwala, że można bez modeli się obejść. Ale zalecane jest jednak tworzenie modeli aby było zgodne z mvc smile.gif
jacobson
tak dorobilem model i nie dzialalo podzialalem firebugiem i odkrylem mega glupi blad... chcialem uploadowac do bazy varchar(10) a mialem tam ustalone pole varchar(5) tongue.gif

Dziekuje wszystkim za pomoc

A tak zeby nie tworzyc nowego tematu... to chcialbym zeby eventy na ktore uzytkownik jest zapisany mialy ten button Zapis ustawiony na hidden, ale nie mam zielonego pojecia jak to zrobic. Wiem ze nie korzystac sie z wywolywania modelu z widoku. Za to do kontrolera nie mam jak przeslac id eventu na ktory uzytkownik sie zapisuje ... Czy ktos moze podsunalby jakis "dobry" pomysl smile.gif
phpion
Ja bym to zrobił tak:

1. Pobierasz z bazy eventy widoczne na danej podstronie (zakładam, że masz stronicowanie).
2. W pętli pobierasz ich identyfikatory i zapisujesz do tablicy.
3. Pobierasz z bazy z tabeli wiążącej event z użytkownikiem te eventy, na które zapisany jest użytkownik i zapisujesz je do tablicy.
4. Wyświetlając eventy w widoku dla każdego sprawdzasz czy jego id występuje w tablicy eventów, na które jest zapisany użytkownik (np. in_array). Jeśli nie to wyświetlasz mu przycisk, jeśli nie to go nie wyświetlasz.
jacobson
hehe dokladnie tak zrobilem... w kontrolerze dalem zmienna $data['is_enrolled'] = array(); i potem do tej zmiennej przypisuje $this->mojmodel->mojafunkcja();

w funkcji pobieram wszystkie id eventow dla uzytkownika (username pobrane z sesji) i zapisuje do tablicy (array_push) i na koniec ja zwracam.

W moim widoku w foreachu dalem dodatkowy warunek in_array dany id eventu w tablicy i jak tak to zeby wyswietlal pusty link a jak nie to zeby wyswietlal link do zapisu i smiga ladnie smile.gif Dziekuje bardzo za pomoc smile.gif
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.