Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][JavaScript][PHP]Dynamiczne ładowanie danych do <SELECT> dropdown list(menu)
Forum PHP.pl > Forum > Przedszkole
ghastblood
Witam,

może mnie ktoś nakierować jak powinno działać dynamiczne ładowanie danych do dropdown list(menu). W projekcie nad którym pracuję mam ustawienia w których podaje godzinę oraz stanowisko na którym ma znaleźć się człowiek o danej godzinie. Przez AJAX ładuje daną osobę otwierająć w divie kod z formularzami co ma wykonać na danym stanowisku i przy danej czynności są 2 selecty ze stanowiskie oraz godziną. Przekazanie danych przez get i załadowanie 3 pliku do diva mija się z celem. Jak mógł bym coś takiego wykonać?

Wydaję mi się że najlepiej było by pobrać wolne stanowiska oraz godziny do tablicy i przez ajax operować danymi z tablicy dla przykładu

1. Odbiór paczki | 10:00 | 12
2. Dostarczenie paczki | 11:00 | 1

czyli jak wybieram godzinę 10:00 to w select option pojawia mi się wolne stanowiska o tej godzinie. zmianna godziny na 9:00 spowoduje zmiane listy ze wolnymi stanowiskami. Najlepiej jak jeszcze kolorowało by wolne stanowiska na zielono a zajęte na czerwono.
ghastblood
Cytat(Turson @ 6.06.2014, 20:17:56 ) *



hmm, o to chodziło tylko nie da rady się zrobić bez użycia pliku szukaj.php bo teraz to było by tak queue.php odwołuje się do pliku getUser.php a getUser.php do searchQueue.php

fajnie jak dało by się ograniczyć w ogóle do jednego pliku.
Turson
Teoretycznie w jednym pliku też się da. Wysyłasz POSTem np. $_POST['ajax'] i sprawdzasz
  1. if(isset($_POST['ajax'])){
  2. //pobierz dane, zwróć
  3. die(); //kończy dalsze wykonywanie pliku
  4. }
ghastblood
Wszystko ładnie pięknie do póki nie pojawiło się klika selectów z tej samej kategorii.

wybieram zawodnika i na podstawie danych z bazy danych generuje mi formularz.

np. zawodnik uczestniczy w 2 konkurencjach

to generuje mi 6 selectów

konkurencja1 | pawilon | godzina | stanowisko
konkurencja2 | pawilon | godzina | stanowisko

pawilon = select
godzina = select
stanowisko = select


żeby rozróżnić selecty można dodać tablice id="pawilon[id_konkurencji]" name="pawilon[id_konkurencji]"

tylko jak zrobić żeby kod js odczytywał z tablicy zmiane konkuretnego id

  1. $(document.body).on('change', '#pawilon', function() {
  2. $.ajax({
  3. type: 'POST',
  4. url: 'searchQueue.php',
  5. success: function(msg){
  6. $("#godziny").html(msg);
  7. }
  8. })
  9. });



Turson
Przede wszystkim musisz zmienić id pawilon na klasę, ponadto dodać atrybut id_konkurencji, czyli
  1. <select class="pawilon" id_konkurencji="wstaw tutaj id konkurencji">


w js pobierasz id:
[JAVASCRIPT] pobierz, plaintext
  1. $(document.body).on('change', '.pawilon', function() {
  2. var id_konkurencji = $(this).attr('id_konkurencji');
  3. $.ajax({
  4. type: 'POST',
  5. url: 'searchQueue.php',
  6. success: function(msg){
  7. $("#godziny").html(msg);
  8. }
  9. })
  10. });
[JAVASCRIPT] pobierz, plaintext
ghastblood
ok, ale teraz muszę kod html wyświetlić w odpowiednim selecie wiec jakoś var id_konkurencji muszę przekazać do odpowiedniego selecta
Turson
To znaczy chcesz do selecta wrzucić id_konkurencji czy odpowiedź z żądania ajaxa??
ghastblood
odpowiedz w select który odpowiada za konkretną konkurencje.

czyli skoro w pawilon mamy id_konkurencji="1"> to chcemy wyświetlić odpowiedz w select godziny id_konkurencji="1"> następnie jak wybierzemy godzinę to tak samo musimy przekazać odpwiedz do select stanowisko
Turson
No ok, ale w czym problem, bo poprzednie posty z przykładami o tym mówią
ghastblood
hmm poprzednie posty mówią o jasno określonych id selectów gdzie ma być załadowana odpowiedz u ciebie jest to id="modele" a u mnie godziny. Niby wystarczy zmienić nazwę ale co w przypadku gdy w formularzu musisz wybrać 3,4 lub 5 marek samochodów, modeli i koloru trzeba. Wydaje mi się że najlepszą opcją było by zastosowanie tablic czyli marka[], model[] i kolor[]. Jak było by do wybrania 5 marek to zawsze odpowiedz bedzie się pojawiała w pierwszym selekcie napodkanym przez skrypt. Jak zasotsuje nazwnictwo marka1, marka2 itd to dla każdego pola bede musiał mieć odpowiedni kod JS, a raczej na tym nie na tym a to polegać. Skoro cały formularz jest tworzony dynamicznie na podstawie danych z mysql to jakoś trzeba te pola rozrzóżniać z poziomu JS.
Turson
Opakuj selecty te które są na tym samym poziomie czyli teoretycznie np. marka i model w jednego diva, powiedzmy:
  1. <div class="container">
  2. <select class="marka"></select>
  3. <select class="model"></select>
  4. </div>

możesz mieć wtedy selecty z tą samą klasą a wybierając select, do którego załaduje odpowiednie opcje piszesz $(this).parent('.container').find('.model').html('<option>...');
ghastblood
hmm, chyba coś robię nie tak.

http://jsfiddle.net/CnAee/
Turson
http://jsfiddle.net/CnAee/1/
Generalnie kwestia zmiany this na that. error: function() dałem tylko dla testów
ghastblood
hmm, na jsfiddle działa jak zmienie URL na mój kod searchQueue.php kod przestaje działać. W firebugu w skrypt zostaje wywołany status 200 OK więc powinno dodać mi odpowiedzi z kodu js
Turson
Przecież na jsfiddle jest
Kod
success: function(){
            $(that).parent('.container').find('.godziny').html("<option>10:00</option>");

czyli nie pobiera żadnej odpowiedzi

powinno
Kod
success: function(msg){
            $(that).parent('.container').find('.godziny').html(msg);


dla testów daj jeszcze np. alert(msg)
ghastblood
poradziłem sobie jakoś smile.gif dzięki wielki za pomoc jakoś nie mogłem sobie z tym poradzić smile.gif teraz tylko muszę jakoś zrobić kolorowanie zajętych stanowisk na czerwono i fajnie jak przy wyborze godziny w nawiasie była by liczba wolnych stanowisk.

zapomniałem o bardzo ważnej rzeczy jaką jest sam zapis do bazy danych.


Wpadłem na taki pomysł.
  1. $(document.body).on('submit', 'form', function() {
  2. var godzina = $(this).val();
  3. var that = this;
  4. $.ajax({
  5. type: 'POST',
  6. url: 'searchQueue.php?mode=add',
  7. data: {
  8. 'zawodnik': $('.zawodnik').val(),
  9. 'pawilon': $('.pawilon').val(),
  10. 'godzina': $('.godziny').val(),
  11. 'stanowisko': $('.stanowiska').val()
  12. },
  13. success: function(msg){
  14. $(".test").html(msg);
  15. }
  16. })
  17. return false;
  18. });



Problem w tym że data przechwytuje pierwsze wartości z formularza.
trueblue
  1. 'zawodnik': $('.zawodnik option:selected').val(),
ghastblood
ajajaj. Sorki że nie wyjaśniłem dokładnie chodzi o to że formularz generuje kilka konterenów z 3 selectami

konkurencja1 | pawilon | godzina | stanowisko
konkurencja2 | pawilon | godzina | stanowisko

i z każdego selecta potrzebuje pobrać wartość

czyli $_POST['konkurencja1'],$_POST['pawilon1'],$_POST['godzina1'],$_POST['stanowisko1'],$_POST['konkurencja2'],$_POST['pawilon2'],$_POST['godzina2'],$_POST['stanowisko2']

w formularzu mam name='konkurencja[]' itd
trueblue
Tak?
  1. 'zawodnik1': $('.zawodnik:eq(0) option:selected').val(),
  2. 'zawodnik2': $('.zawodnik:eq(1) option:selected').val(),
  3. 'zawodnik3': $('.zawodnik:eq(2) option:selected').val(),
  4. 'zawodnik4': $('.zawodnik:eq(3) option:selected').val(),
ghastblood
mniej więcej ale formularz jest generowany dynamicznie więc nie mogę określić danych na sztywno
trueblue
Dlaczego nie możesz?
Przecież kod wykonujesz w momencie submitowania formularza.
ghastblood
bo nie wiem ile konkurencji będzie w formularzu wyjściowym. Dla jednego zawodnika będzie to 1 konkurencja a dla drugiego 8 a jeszcze dla innego może to być 12.
trueblue
Dodaj w beforeSend ajaxa:
  1. var arr=new Array();
  2. $('.zawodnik').each(function(i){
  3. arr.push($(this).find('option:selected').val());
  4. arr.push($('.pawilon:eq('+i+')').find('option:selected').val());
  5. arr.push($('.godziny:eq('+i+')').find('option:selected').val());
  6. arr.push($('.stanowiska:eq('+i+')').find('option:selected').val());
  7. });
  8. $('.jakis_input_hidden').val(arr.join(',')); // .jakis_input_hidden musi być w formularzu

W .jakis_input_hidden dostaniesz coś takiego:
1,1,10,12,2,4,3,15 (paczki po 4 liczby)
w PHP możesz sobie to "pociąć".
ghastblood
udało mi się zrobić to w ten sposób

  1. $(document.body).on('submit', 'form', function() {
  2. var that = this;
  3. var zawodnik = $('.zawodnik').val();
  4. $.ajax({
  5. type: 'POST',
  6. url: 'searchQueue.php?mode=add',
  7. data: $('#formularz').serialize() + '&zawodnik='+ zawodnik,
  8. success: function(msg){
  9. $(".test").html(msg);
  10. }
  11. })
  12. return false;
  13. });
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.