Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Lista zależna od innej listy zależnej
Forum PHP.pl > Forum > XML, AJAX > AJAX
koryx
Witam
Tworzę formularz zgłoszeniowy, w którym jest kilka list zależnych od siebie. O ile zrobienie zależnej listy od poprzedniej mi jakoś wyszło to nie wiem jak zrobić żeby kolejna lista była zależna nie tylko od poprzedniej ale również od tej wcześniejszej czyli w wielkim skrócie:
- lista A (dane pobierane z bazy mysql) - kategoria główna
- lista B zależna od A (dane pobierane z bazy mysql) - kategoria wiekowa
- lista C zależna od A i B (dane pobierane z bazy mysql) - kategoria wagowa

To co zrobiłem: wybieram z listy A, pojawia się lista B już z ograniczonym wyborem co do wieku, po wybraniu z listy wieku pojawia sie lista C z ograniczonym wyborem co do wagi ale już bez różnicy na kategorię z listy A

Teraz trochę kodu

Tabele w bazie danych:
CODE
tabela1: id, id_kategoria, id_wiek, id_waga
tabela2: id, wiek
tabela3: id, waga


plik php1
CODE
<form action=".........." method="post" id="formularzid">
Nazwisko: <input type="text" name="nazwisko" id="nazwisko"></BR>
Imię: <input type="text" name="imie" id="imie"></BR>
Konkurencja: <select name="id_kategoria" id="id_kategoria" onchange="showUser(this.value)">
<option value="">Wybierz konkurencję</option>
... pobieranie listy z bazy danych
<option value="1">kategoria1</option>
......
<option value="5">kategoria5</option>
</select>
<div id="txtDane1"></div>
<div id="txtDane2"></div>
<div id="txtDane3"></div>
<input type="submit" value="Dodaj">
</form>


skrypt
CODE
function showUser(str)
{
if (str=="")
{
document.getElementById("txtDane1").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtDane1").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","zawody.php?q="+str,true);
xmlhttp.send();
}


plik zawody.php
CODE
<?php
$q = intval($_GET['q']);

$con = mysql_connect('..............');
if (!$con)
{
die('Could not connect: ' . mysql_error($con));
}
mysql_select_db('......',$con);
$sql="SELECT * FROM tabela2 WHERE id_kategoria = '".$q."'";
$result = mysql_query($sql);
echo "<select name=\"id_wiek\" id=\"id_wiek\" onchange=\"showUser2(this.value)\">
<option value=\"\">Wybierz wiek</option>";
while($row = mysql_fetch_array($result))
{
echo "<option value=";
echo $row['id_wiek'];
echo ">";
echo $row2['wiek'];
echo "</option>";
}
echo "</select>";
mysql_close($con);
?>


Funkcja showUser2 wygląda tak samo jak funkcja showUser z małymi zmianami, zamiast txtDane1 jest txtDane2, zamiast zawody.php?q jest wiek.php?q2. Plik wiek.php to też prawie to samo co zawody.php tylko zamiast $q = intval($_GET['q']); używam $q2 = intval($_GET['q2']); Wiem, że muszę jakoś pobrać "value" z listy kategorii i zmodyfikować funkcję showUser2 by przekazała tą dodatkową wartość do pliku wiek.php ale nie wiem jak.
kamil4u
Skorzystaj z gotowca: http://www.99points.info/2010/06/ajax-tuto...nd-ajax-in-php/ - a jeżeli chcesz sam to zrobić to podejrzyj jak oni rozwiązali problem
koryx
Ciekawe rozwiązanie, jednak opiera się na 1 tabeli. Gdybym chciał zrobić podobnie to samo rozpisanie wszystkich możliwości zajęłoby mnóstwo czasu, w dodatku wiele rekordów miałoby tą samą wartość w polu "category" a inny "pid", istniałaby możliwość łatwej pomyłki, pominięcia jakiegoś wariantu itp. W podanej bazie przykładowych wartości jest niewiele a zajmują 30 rekordów, w mojej (np. waga i wiek te same a kategoria inna) samych wariantów jest kilkadziesiąt a takich rekordów byłoby pewnie kilkaset.

edit: z ciekawości sprawdziłem ile tych rekordów wyjdzie i okazało się, że nie jest aż tak tragicznie, spróbuję wykorzystać to rozwiązanie, pytanie tylko czy wykorzystując przycisk submit w tym formularzu normalnie poprzez post wyślę dane do bazy?
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.