Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kilka pytań do skryptów tworzących dynamiczne formularze
Forum PHP.pl > Forum > XML, AJAX > AJAX
sebap123
Napisałem skrypt, który zarządza akcjami dziejącymi się pod wpływem zmian w polach select. Mam trzy takie pola i opcje każdego wynikają bezpośrednio z wcześniej podjętych akcji. Wszystko działa w powiedzmy 80% tak jak sobie tego życzę, dlatego mam do was prośbę, żebyście w miarę możliwości podpowiedzieli mi co robię źle, jak to zmienić, bo przyznaję, że w JS i AJAXIE siedzę od niedawna (ok. dwóch dni).
Najpierw podam kody, a potem podam moje uwagi, zastrzeżenia, co mi się w działaniu nie podoba i za czym mam dość spore problemy.
test_skrypt.js (tam są funkcje JS):
Kod
function ls_1(nr)
{
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    }
    else{
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState==4 && xmlhttp.status==200){
            document.getElementById("selector_c").innerHTML=xmlhttp.responseText;
        }
    }
xmlhttp.open("GET","../dynamic.php?ls="+nr,true);
xmlhttp.send();
}

function ls_2(nr)
{
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    }
    else{
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState==4 && xmlhttp.status==200){
            document.getElementById("selector_l").innerHTML=xmlhttp.responseText;
        }
    }
xmlhttp.open("GET","../dynamic.php?ls2="+nr,true);
xmlhttp.send();
}


dynamic.php (tutaj wykonuję wszelkie polecenia które mają coś zmienić):
  1. <?
  2. //Dotyczy pierwszego pola select
  3. if($_GET['ls']!=null){
  4. $p=$_GET['ls'];
  5. switch($p){
  6. case 's':
  7. echo'<option value="m1">M1_O1</option>';
  8. echo'<option value="m2">M1_O2</option>';
  9. echo'<option value="m3">M1_O3</option>';
  10. break;
  11. case 'm':
  12. echo'<option value="m4">M2_O1</option>';
  13. echo'<option value="m5">M2_O2</option>';
  14. echo'<option value="m6">M2_O3</option>';
  15. break;
  16. }}
  17. else{
  18. echo'<option value="0">t1</option>';
  19. }
  20.  
  21. //Dotyczy drugiego pola select
  22. if($_GET['ls2']!=null){
  23. $q=$_GET['ls2'];
  24. switch($q){
  25. case 'm1':
  26. echo'<option value="1">M1_O1</option>';
  27. echo'<option value="2">M1_O2</option>';
  28. echo'<option value="3">M1_O3</option>';
  29. break;
  30. }}
  31. else{
  32. echo'<option value="0">t2</option>';
  33. }
  34. ?>


fragment kodu gdzie mam pola select:
  1. echo'<div class="selector2">
  2. <label for="rozmiar">rozmiar:</label>
  3. <select name="rozmiar" id="selector_r" onchange="ls_1(this.value)">
  4. <option value=""></option>
  5. <option value="s">S</option>
  6. <option value="m">M</option>
  7. </select>
  8. </div>
  9.  
  10. <div class="selector2">
  11. <label for="kolor">kolor:</label>
  12. <select name="color" id="selector_c" onchange="ls_2(this.value)">
  13. <option value=""></option>
  14. </select>
  15. </div>
  16.  
  17. <div class="selector2">
  18. <label for="ilosc">ilosc:</label>
  19. <select name="data[ilosc][name]" id="selector_l">
  20. <option value="1">1</option>
  21. <option value="2">2</option>
  22. </select>
  23. </div>';


A teraz moje spostrzeżenia, uwagi, czy też pytania:
1. Czy da się jakoś te dwie funkcje JS (ls_1 i ls_2) zamknąć w jedną, bo przyznaję, że coś kombinowałem z ifami ale jakoś nie wyszło.
2. Gdy już działa wszystko to w momencie, kiedy wybieram opcję w pierwszym select to wtedy w drugim mam normalnie trzy opcje plus pole t2 (czyli to po else w dynamic.php dot. drugiego selecta) Dlatego właśnie dodałem te t1 i t2, żeby łatwiej było zlokalizować błąd, ale to jakoś nic mi szczególnie nie dało i może wy coś widzicie co pominąłem, bo w gruncie rzeczy nie chciał bym, żeby to tak było (mają być tylko trzy pola i tyle).
3. To już ostatnia rzecz, która przyznaję dosyć mocno mnie zaskoczyła, a mianowicie gdy juz mam wybraną opcję w select 1 i 2 to wtedy w select 3 pojawia mi się t1 (czyli to z pierwszego selecta w dynamic.php) a ten select w ogóle ma nie korespondować z select 3. Co to może być?

Domyślam się, że dużo napisałem i dla wielu z was jest to zapewne bardzo proste, ale jak już mówiłem dopiero zaczynam JS i AJAXA tak więc liczę na wsparcie i zrozumienie.
Scalak
Cytat
2. Gdy już działa wszystko to w momencie, kiedy wybieram opcję w pierwszym select to wtedy w drugim mam normalnie trzy opcje plus pole t2 (czyli to po else w dynamic.php dot. drugiego selecta) Dlatego właśnie dodałem te t1 i t2, żeby łatwiej było zlokalizować błąd, ale to jakoś nic mi szczególnie nie dało i może wy coś widzicie co pominąłem, bo w gruncie rzeczy nie chciał bym, żeby to tak było (mają być tylko trzy pola i tyle).


konstrukcja Twojego ifa (specjalnie wcinam):

Kod
if($_GET['ls2']!=null){
     $q=$_GET['ls2'];
     switch($q){
          ...
     }
}else{
     echo'<option value="0">t2</option>';
}

wszak do else wchodzisz smile.gif
reasumując wywal else z obu ifów
Cytat
1. Czy da się jakoś te dwie funkcje JS (ls_1 i ls_2) zamknąć w jedną, bo przyznaję, że coś kombinowałem z ifami ale jakoś nie wyszło.

da się przykładowo tak:
Kod
function ls(nr,zm){
      ...
xmlhttp.open("GET","dynamic.php?ls="+nr+"&zm="+zm,true);
xmlhttp.send();
}

dodałem dodatkową zmienną zm. Wywołuję ją w Twoim php tak:
Kod
onchange="ls(this.value,\'ls\')"

a w odpytywanym pliku robię:
Kod
<?
//Dotyczy pierwszego pola select
if($_GET['zm']=='ls'){
    $p=$_GET['ls'];
        ...
}

//Dotyczy drugiego pola select
if($_GET['zm']=='ls2'){
        $q=$_GET['ls2'];
        ...
}
?>

Cytat
3. To już ostatnia rzecz, która przyznaję dosyć mocno mnie zaskoczyła, a mianowicie gdy juz mam wybraną opcję w select 1 i 2 to wtedy w select 3 pojawia mi się t1 (czyli to z pierwszego selecta w dynamic.php) a ten select w ogóle ma nie korespondować z select 3. Co to może być?

po zmienieniu 2 problem ten zniknie

Maciej
sebap123
Dzięki wielkie. Własnie o coś takiego mi chodziło.
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.