Всем привет! Помогите пожалуйста. Имеем форму: Названия факультетов и специальностей в выпадающих менюшках достаются из базы. Интересует следующее: как сделать так, чтобы при выборе определенного факультета становились доступными для выбора только соответствующие факультету специальности. Т.е. чтобы нельзя было получить программиста с факультета истории и права. На уровне бд связи имеются. пс надеюсь понятно изложил
возможно несколько вариантов: 1. отправка формы при выборе другого факультета - список специальностей будет соответствовать только выборанному факультету (с перезагрузкой страницы при выборе) 2. если список зависимостей небольшой - написать на js 3. грузить с помощью ajax-а. первый вариант встречал только на древних сайтах. все остальные пользуются js/ajax
Я это делаю вот так на стороне сервера: PHP: <?php $db=SQLDBFactory::getDB(); $sql="select id, kaf, cont from kaf "; if (isset($_POST['fak']) && !empty($_POST['fak'])){ $dbFak=$db->escapeString($_POST['fak']); $sql.="where CHARINDEX($dbFak,cont)=1"; } $db->select($sql); $data=array(); $i=0; while ($row=$db->fetchAssoc()){ $data[$i]=new stdClass(); $data[$i]->id=$row['id']; $data[$i]->val=$row['cont']; $data[$i]->label=$row['kaf']; $data[$i]->itemCls='normalView'; $i++; } return $data; } Если надо могу показать клиентскую сторону, но там юзается ExtJS.
По моему самый простой вариант на JS. Вот мой вариант (легко доработаешь под себя) PHP файл: Код (Text): <head> <script type="text/javascript" src="script.js"></script> </head> <body> <select name="marka" id="marka"> <option value="0" selected>Выберите марку...</option> <?php include "stopauto.php"; $sql=mysql_query("SELECT * FROM avto_name"); $n=0; $a=0; while ($ctg = mysql_fetch_array($sql)) { $id[n]=$ctg['avto_name_id']; $i[n]=$ctg['avto_name']; $n=$n+1; echo "<option value=".$id[n].">";echo $ctg['avto_name']; echo "</option>"; } ?> </select><br /> <select name="model" id="model"> <option value="0" selected>Выберите модель...</option> <?php $sql=mysql_query("SELECT * FROM avto_name"); $n=0; $a=0; while ($ctg = mysql_fetch_array($sql)) { $id[n]=$ctg['avto_name_id']; $i[n]=$ctg['avto_name_id']; $n=$n+1; $sqla=mysql_query("SELECT * FROM avto_model WHERE avto_name_id =".$ctg['avto_name_id'].""); while ($ctga = mysql_fetch_array($sqla)) { $od[a]=$ctga['avto_model_id']; $o[a]=$ctga['avto_model']; $a=$a+1; echo "<option class=".$i[n]." value=".$od[a].">";echo $ctga['avto_model']; echo "</option>"; } } ?> </select> </body> Файл script.js: Код (Text): function dynamicSelect(id1, id2) { // Сперва необходимо проверить поддержку W3C DOM в браузере 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++) { // Если название класса клонированного option эквивалентно "select" // либо эквивалентно значению option первого списка if (clonedOptions[i].className.match(pattern1)|| clonedOptions[i].className.match(pattern2)) { // его нужно клонировать в динамически создаваемый список sel2.appendChild(clonedOptions[i].cloneNode(true)); } } } window.onload = function() { dynamicSelect("marka", "model"); } Конечно сыровато но наглядно и понятно. Вообще то это называется связанным списком.
Если заполнять списки выборкой из базы данных и выделять пункт из второко списка <option> как selected, то после script.js элемент selected теряется. Может есть из этого положения выход?