За последние 24 часа нас посетили 18936 программистов и 1634 робота. Сейчас ищут 962 программиста ...

Две пары связанных списков в одной форме

Тема в разделе "PHP и базы данных", создана пользователем Димон, 1 мар 2011.

  1. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Потребовалось создать две пары связанных селектов в теле одной формы. Т.е. список 2 зависит от списка 1 и список 4 зависит от списка 3.
    Одну пару реализую таким способом:
    Файл в форме:
    PHP:
    1.  
    2. <script type="text/javascript" src="office_blocks/script.js"></script>
    3.   <select name="marka" id="marka">
    4.   <option value="0" selected>---------Выберите марку---------</option>
    5.   <?php
    6.   include "office_blocks/stopauto.php";
    7.       $sql=mysql_query("SELECT * FROM avto_name");
    8.       $n=0;
    9.       $a=0;
    10.       while ($ctg = mysql_fetch_array($sql))
    11.       {    $id[n]=$ctg['avto_name_id'];
    12.                   $i[n]=$ctg['avto_name'];
    13.                   $n=$n+1;
    14.           echo "<option value=".$id[n].">";echo $ctg['avto_name'];  echo "</option>";
    15.         }
    16.   ?>
    17.   </select><br />
    18.   <select name="model" id="model">
    19.   <option value="0" selected>---------Выберите модель-------</option>
    20.   <?php
    21.       $sql=mysql_query("SELECT * FROM avto_name");
    22.       $n=0;
    23.       $a=0;
    24.       while ($ctg = mysql_fetch_array($sql))
    25.       {    $id[n]=$ctg['avto_name_id'];
    26.                   $i[n]=$ctg['avto_name_id'];
    27.                   $n=$n+1;
    28.       $sqla=mysql_query("SELECT * FROM avto_model WHERE avto_name_id =".$ctg['avto_name_id']."");
    29.           while ($ctga = mysql_fetch_array($sqla))
    30.       {    $od[a]=$ctga['avto_model_id'];
    31.                   $o[a]=$ctga['avto_model'];
    32.                   $a=$a+1;
    33.                 echo "<option class=".$i[n]." value=".$od[a].">";echo $ctga['avto_model']; echo "</option>";
    34.         }
    35.       }
    36.   ?>
    37.   </select>[/code]
    Файл script.js
    Код (Text):
    1.  
    2.  function dynamicSelect(id1, id2) {
    3.      if (document.getElementById && document.getElementsByTagName) {
    4.      var sel1 = document.getElementById(id1);
    5.     var sel2 = document.getElementById(id2);
    6.       var clone = sel2.cloneNode(true);
    7.       var clonedOptions = clone.getElementsByTagName("option");
    8.       refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    9.       sel1.onchange = function() {
    10.     refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    11.     }
    12.    }
    13.   }
    14.   function refreshDynamicSelectOptions(sel1, sel2, clonedOptions) {
    15.      while (sel2.options.length) {
    16.     sel2.remove(0);
    17.    }
    18.    var pattern1 = /( |^)(select)( |$)/;
    19.    var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)");
    20.    for (var i = 0; i < clonedOptions.length; i++) {
    21.    if (clonedOptions[i].className.match(pattern1)||
    22.     clonedOptions[i].className.match(pattern2)) {
    23.   sel2.appendChild(clonedOptions[i].cloneNode(true));
    24.     }
    25.    }
    26.   }
    27.   window.onload = function() {
    28.       dynamicSelect("marka", "model");
    29.   }
    В JS я "плаваю" где то на самой поверхности, и никак не могу дойти - что надо сделать с файлом script.js, что бы можно было и вторую пару селектов внести в форму. Помогите пожалуйста в данном вопросе, и если можно с комментариями - хочу хоть немного углубиться в познании JS.
     
  2. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Так никто и не может помочь?
     
  3. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Чужой код на этом форуме исправляют только в разлделе Free-lance.
     
  4. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Тогда для чего вообще форум??? Если Вы хотите только наживы, то и пишите только в Free-lance. А если нет ответа, так и скажите, я лишь помощи попросил, для того, что-бы самому понять, а не торговать идеями!!!
     
  5. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Чтобы самому понять, нужно самому писать.
    А форум создан в помощь людям у которых есть желание научиться программировать.
     
  6. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Что-бы самому понять нужно поучить, а мне обратиться не к кому. Может за пару сотен км и есть программисты, работающие на РНР - я с такими лично не знаком. У меня в глубинке таких нет, а просто читая - ничего не могу понять. Ну и к кому мне скажите обращаться???
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Димон

    Если у тебя самого нет желания вникать и разбираться - откуда оно должно взяться у посторонних людей? Локализуй ошибку, задай конкретный вопрос - и на него ответят.

    А писать для кого-то код, да еще и с комментариями - это увы не бесплатно
     
  8. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    гугл
     
  9. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Я не прошу весь код, а только принцип объяснить.
    Хотя-бы, если я изменю имя файла script.js на script1.js, в нем поменяю наименование функций и переменных, а так-же имена селектов - будет работать этот скрипт? Я пробовал, и у меня переставала работать первая пара селектов.
    Помогите не готовым скриптом а советом.
    А не просто на гугл отправляйте.
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Что надо то? Сделать вторую пару динамической?
    Добавьте в
    [js] window.onload = function() {
    dynamicSelect("marka", "model");
    }[/js]
    аналог для второй пары

    приведенный главный select дополните, чтоб выглядело так:
    HTML:
    1. <select name="marka" id="marka" onchange='dynamicSelect("marka", "model")'>
    и аналогично для второго главного select'а
     
  11. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Мне надо две пары зависимых селектов, но пары не зависят друг от друга, т.е например "марка"-"модель", "отдел"-"должность". Мне надо их поместить в одну форму, но когда я помещаю вторую пару, первая перестает работать.
     
  12. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)Что значит перестает работать? Нет "динамизма"?
    2)А идентификаторы не забываете поменять?
     
  13. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Идентификаторы само-собой поменял. Первая пара снова заработала, а вот вторая нет. Вторая пара вообще не грузится, даже первый селект не выводится. Сейчас проверю запрос к БД на предмет ошибок и отпишусь что выходит и что не работает.
    Интересно, данный JS будет один на две пары селектов?
     
  14. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Перепроверил, запрос работает, а вторая пара нет. Во второй паре даже не появляется второй селект.
    И еще, во второй паре надо менять имена переменных (a, n например на x,y)?
     
  15. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Во второй паре надо поменять запросы и ключи массивов.
    Проверьте какой html создался. Может какой тег забыли закрыть.
     
  16. Димон

    Димон Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    Не получается у меня создать две, независимые друг от друга, пары зависимых селектов. Буду пока заниматься самостоятельно AJAX-ом, может со временем разберусь. Тему можно закрыть.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Димон
    хрен тебе закрыть. уперся в стену и сразу сопли?

    че там у тебя не получается?

    в запросе выбирай ДИСТИНКТ(поле по которому будешь строить селект)

    независимость селектов обеспечивается их именами по праву рождения, зависимость - только искусственно кодом js и ручками =)

    в чем затык?
     
  18. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Димон
    с помощью jquery данная задача облегчается в разы.
    без jquery придётся писать собственные механизмы обработки
    ajax запроса, а затем ещё отлаживать кроссбраузерность.

    хотя это конечно не отменяет изучения языка javascript как такового.
     
  19. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Вообще с js там ничего делать не надо...
    Задача лишь построить 4 select'а с правильными классами option'ов в двух из них.
    например:
    [js] function dynamicSelect(id1, id2) {
    if (document.getElementById && document.getElementsByTagName) {
    var sel1 = document.getElementById(id1);
    var sel2 = document.getElementById(id2);
    var clone = sel2.cloneNode(true);
    var clonedOptions = clone.getElementsByTagName("option");
    refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    sel1.onchange = function() {
    refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    }
    }
    }
    function refreshDynamicSelectOptions(sel1, sel2, clonedOptions) {
    while (sel2.options.length) {
    sel2.remove(0);
    }
    var pattern1 = /( |^)(select)( |$)/;
    var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)");
    for (var i = 0; i < clonedOptions.length; i++) {
    if (clonedOptions.className.match(pattern1)||
    clonedOptions.className.match(pattern2)) {
    sel2.appendChild(clonedOptions.cloneNode(true));
    }
    }
    }

    window.onload = function() {
    dynamicSelect("sel1", "sel2");
    dynamicSelect("sel3", "sel4");
    }
    [/js]
    HTML:
    1. <select id='sel1' onchange='dynamicSelect("sel1", "sel2")'>
    2.     <option value='s1'>1</option>
    3.     <option value='s2'>2</option>
    4.     <option value='s3'>3</option>
    5.     <option value='s4'>4</option>
    6.     <option value='s5'>5</option>
    7.     <option value='s6'>6</option>
    8. <select id='sel2'>
    9.     <option class='s1' value='11'>11</option>
    10.     <option class='s1' value='12'>12</option>
    11.     <option class='s1' value='13'>13</option>
    12.     <option class='s1' value='14'>14</option>
    13.     <option class='s1' value='15'>15</option>
    14.     <option class='s2' value='21'>21</option>
    15.     <option class='s2' value='22'>22</option>
    16.     <option class='s3' value='33'>33</option>
    17.     <option class='s3' value='34'>34</option>
    18.     <option class='s4' value='45'>45</option>
    19.     <option class='s5' value='51'>51</option>
    20.     <option class='s5' value='52'>52</option>
    21.     <option class='s5' value='53'>53</option>
    22. <br>
    23. <select id='sel3' onchange='dynamicSelect("sel3", "sel4")'>
    24.     <option value='s1'>1</option>
    25.     <option value='s2'>2</option>
    26.     <option value='s3'>3</option>
    27.     <option value='s4'>4</option>
    28.     <option value='s5'>5</option>
    29.     <option value='s6'>6</option>
    30. <select id='sel4'>
    31.     <option class='s1' value='11'>11</option>
    32.     <option class='s1' value='12'>12</option>
    33.     <option class='s1' value='13'>13</option>
    34.     <option class='s1' value='14'>14</option>
    35.     <option class='s1' value='15'>15</option>
    36.     <option class='s2' value='21'>21</option>
    37.     <option class='s2' value='22'>22</option>
    38.     <option class='s3' value='33'>33</option>
    39.     <option class='s3' value='34'>34</option>
    40.     <option class='s4' value='45'>45</option>
    41.     <option class='s5' value='51'>51</option>
    42.     <option class='s5' value='52'>52</option>
    43.     <option class='s5' value='53'>53</option>
    44. </form>
    легко заметить что в js всего лишь добавлена одна строчка.