За последние 24 часа нас посетили 16155 программистов и 1666 роботов. Сейчас ищет 891 программист ...

Помогите с выпадающими списками...

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

  1. goodhash

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

    С нами с:
    10 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    Всем привет!
    Помогите пожалуйста.
    Имеем форму:
    [​IMG]
    Названия факультетов и специальностей в выпадающих менюшках достаются из базы.
    Интересует следующее:
    как сделать так, чтобы при выборе определенного факультета становились доступными для выбора только соответствующие факультету специальности. Т.е. чтобы нельзя было получить программиста с факультета истории и права. На уровне бд связи имеются.

    пс надеюсь понятно изложил
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    возможно несколько вариантов:

    1. отправка формы при выборе другого факультета - список специальностей будет соответствовать только выборанному факультету (с перезагрузкой страницы при выборе)
    2. если список зависимостей небольшой - написать на js
    3. грузить с помощью ajax-а.

    первый вариант встречал только на древних сайтах. все остальные пользуются js/ajax
     
  3. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Я это делаю вот так на стороне сервера:
    PHP:
    1. <?php
    2.     $db=SQLDBFactory::getDB();
    3.     $sql="select id, kaf, cont from kaf ";
    4.     if (isset($_POST['fak']) && !empty($_POST['fak'])){
    5.         $dbFak=$db->escapeString($_POST['fak']);
    6.         $sql.="where CHARINDEX($dbFak,cont)=1";
    7.     }
    8.     $db->select($sql);
    9.     $data=array();
    10.     $i=0;
    11.     while ($row=$db->fetchAssoc()){
    12.         $data[$i]=new stdClass();
    13.         $data[$i]->id=$row['id'];
    14.         $data[$i]->val=$row['cont'];
    15.         $data[$i]->label=$row['kaf'];
    16.         $data[$i]->itemCls='normalView';
    17.         $i++;
    18.     }
    19.     return $data;
    20. }
    Если надо могу показать клиентскую сторону, но там юзается ExtJS.
     
  4. Димон

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

    С нами с:
    12 май 2009
    Сообщения:
    152
    Симпатии:
    0
    По моему самый простой вариант на JS. Вот мой вариант (легко доработаешь под себя)

    PHP файл:
    Код (Text):
    1.  
    2. <head>
    3.   <script type="text/javascript" src="script.js"></script>
    4.     </head>
    5.   <body>
    6.   <select name="marka" id="marka">
    7.   <option value="0" selected>Выберите марку...</option>
    8.   <?php
    9.   include "stopauto.php";
    10.       $sql=mysql_query("SELECT * FROM avto_name");
    11.       $n=0;
    12.       $a=0;
    13.       while ($ctg = mysql_fetch_array($sql))
    14.       {    $id[n]=$ctg['avto_name_id'];
    15.                   $i[n]=$ctg['avto_name'];
    16.                   $n=$n+1;
    17.           echo "<option value=".$id[n].">";echo $ctg['avto_name'];  echo "</option>";
    18.         }
    19.   ?>
    20.   </select><br />
    21.   <select name="model" id="model">
    22.   <option value="0" selected>Выберите модель...</option>
    23.   <?php
    24.       $sql=mysql_query("SELECT * FROM avto_name");
    25.       $n=0;
    26.       $a=0;
    27.       while ($ctg = mysql_fetch_array($sql))
    28.       {    $id[n]=$ctg['avto_name_id'];
    29.                   $i[n]=$ctg['avto_name_id'];
    30.                   $n=$n+1;
    31.       $sqla=mysql_query("SELECT * FROM avto_model WHERE avto_name_id =".$ctg['avto_name_id']."");
    32.           while ($ctga = mysql_fetch_array($sqla))
    33.       {    $od[a]=$ctga['avto_model_id'];
    34.                   $o[a]=$ctga['avto_model'];
    35.                   $a=$a+1;
    36.                 echo "<option class=".$i[n]." value=".$od[a].">";echo $ctga['avto_model']; echo "</option>";
    37.         }
    38.       }
    39.      ?>
    40.   </select>
    41.     </body>
    Файл script.js:
    Код (Text):
    1.  
    2. function dynamicSelect(id1, id2) {
    3.  
    4.   // Сперва необходимо проверить поддержку W3C DOM в браузере
    5.  
    6.    if (document.getElementById && document.getElementsByTagName) {
    7.  
    8.   // Определение переменных, ссылающихся на списки
    9.  
    10.     var sel1 = document.getElementById(id1);
    11.     var sel2 = document.getElementById(id2);
    12.  
    13.   // Клонирование динамического списка
    14.  
    15.     var clone = sel2.cloneNode(true);
    16.  
    17.   // Определение переменных для клонированных элементов списка
    18.  
    19.     var clonedOptions = clone.getElementsByTagName("option");
    20.  
    21.   // Вызов функции собирающей вызываемый список
    22.  
    23.     refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    24.  
    25.   // При изменении выбранного элемента в первом списке: // вызов функции пересобирающей вызываемый список
    26.  
    27.     sel1.onchange = function() {
    28.     refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    29.     }
    30.    }
    31.   }
    32.  
    33.   // Функция для сборки динамического списка
    34.  
    35.   function refreshDynamicSelectOptions(sel1, sel2, clonedOptions) {
    36.  
    37.   // Удаление всех элементов динамического списка
    38.  
    39.    while (sel2.options.length) {
    40.     sel2.remove(0);
    41.    }
    42.    var pattern1 = /( |^)(select)( |$)/;
    43.    var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)");
    44.  
    45.   // Перебор клонированных элементов списка
    46.  
    47.    for (var i = 0; i < clonedOptions.length; i++) {
    48.  
    49.   // Если название класса клонированного option эквивалентно "select" // либо эквивалентно значению option первого списка
    50.  
    51.     if (clonedOptions[i].className.match(pattern1)||
    52.     clonedOptions[i].className.match(pattern2)) {
    53.  
    54.   // его нужно клонировать в динамически создаваемый список
    55.  
    56.     sel2.appendChild(clonedOptions[i].cloneNode(true));
    57.     }
    58.    }
    59.   }
    60.   window.onload = function() {
    61.       dynamicSelect("marka", "model");
    62.   }
    Конечно сыровато но наглядно и понятно. Вообще то это называется связанным списком.
     
  5. goodhash

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

    С нами с:
    10 фев 2011
    Сообщения:
    7
    Симпатии:
    0
    Спасибо за помощь!
    решено!
     
  6. alik1964

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

    С нами с:
    31 авг 2011
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Если заполнять списки выборкой из базы данных и выделять пункт из второко списка <option> как selected, то после script.js элемент selected теряется. Может есть из этого положения выход?