динамические SELECT разбиты по группам
| Автор
| Сообщение |
 mor55
Новичок

Возраст: 29
Знак зодиака: 
Зарегистрирован: 27.08.2009
Сообщения: 2
|
|
|
Цитата |
|
Дорогие друзья. Кто знает, подскажите. Как сделать динамически зависимые селекты (хотя бы, что бы 1-й зависел от 2-го), разделенные по группам. Перепробовал массу скриптов, но получается группировать только 1-й селект.
Вот, что получилось:
http://czinfobus.cz/1/
А хотелось бы так:
http://zluty.cz/online/Booking |
|
| В начало |
|
 |
|
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
Объясни получше алгоритм. Что ты именно хочешь? Ты хочешь связать 2 таблицы в определённой БД? И ещё - какой движок SQL используешь? Желательно отписать часть исходника. _________________
 |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
| В начало |
|
 |
 mor55
Новичок

Возраст: 29
Знак зодиака: 
Зарегистрирован: 27.08.2009
Сообщения: 2
|
|
|
Цитата |
|
Нет, рекламировать не хочу. А жду помощи
Добавлено спустя 17 минут 25 секунд:
Объясню понятнее.
файл index.php
тут небольшая выборка стран (oprgroup) и городов (option) из 2-х таблиц базы данных:
| php: | <html> <head> <title>Связанные селекты</title> <!-- Подключаем javascript-библиотеку функций --> <script type="text/javascript" src="linkedselect.js"></script> </head> <body> <? if (isset($_POST['od'])) {$od = $_POST['od']; } if (! isset($od)) {$od = 'x'; } if (isset($_POST['do'])) {$do = $_POST['do']; } if (! isset($do)) {$do = 'x'; } //страны OD SELECT DISTINCT country.country_en, country.country_de, country.country_cz, country.country_ru, country.country_ua, country.id_country FROM country, bus_points, bus_stations, bus_routes, bus_intervals WHERE country.id_country = bus_points.id_country AND bus_stations.point_id = bus_points.point_id AND bus_routes.route_id = bus_stations.route_id AND bus_routes.web_active = 1 AND bus_stations.station_id = bus_intervals.departure_station_id ORDER BY country.id_country ASC ",$db); //страны DO SELECT DISTINCT country.country_en, country.country_de, country.country_cz, country.country_ru, country.country_ua, country.id_country FROM country, bus_points, bus_stations, bus_routes, bus_intervals WHERE country.id_country = bus_points.id_country AND bus_stations.point_id = bus_points.point_id AND bus_routes.route_id = bus_stations.route_id AND bus_routes.web_active = 1 AND bus_stations.station_id = bus_intervals.arrival_station_id ORDER BY country.id_country ASC ",$db); print "<form action='index.php' method='post'>"; print "<select name='od' id='od'>"; do { print "<optgroup label='$myrow_country_od[country_ru]'> "; //города OD ru SELECT DISTINCT p.* FROM bus_points as p, bus_stations as s, bus_routes as r, bus_intervals as i WHERE p.id_country = $myrow_country_od[id_country] AND s.point_id = p.point_id AND r.route_id = s.route_id AND r.web_active = 1 AND s.station_id = i.departure_station_id ORDER BY p.point_ru_name ",$db); do { print "<option value='$myrow_city_od[point_id]'>$myrow_city_od[point_ru_name]</option> "; } } print "<select name='do' id='do'></select>"; ?> <script type='text/javascript'> var syncList1 = new syncList; syncList1.dataList = { <? do { //города DO SELECT DISTINCT p.* FROM bus_points as p, bus_stations as s, bus_routes as r, bus_intervals as i WHERE p.id_country = $myrow_country_do[id_country] AND s.point_id = p.point_id AND r.route_id = s.route_id AND r.web_active = 1 AND s.station_id = i.departure_station_id ORDER BY p.id_country ",$db); do { if ($myrow_city_do['point_id'] > 0) '$myrow_city_do[point_id]':{ "; if ($myrow_city_do['point_id'] > 0) //станции SELECT DISTINCT p.* FROM bus_points as p, bus_stations as s, bus_intervals as i WHERE (i.interval_id IN ( SELECT i.interval_id FROM bus_points as p, bus_stations as s, bus_intervals as i WHERE (p.point_id IN (SELECT point_id FROM bus_points WHERE point_id = $myrow_city_do[point_id] ORDER BY id_country)) AND s.point_id = p.point_id AND s.station_id = i.departure_station_id ORDER BY p.id_country)) AND i.arrival_station_id = s.station_id AND s.point_id = p.point_id ORDER BY p.id_country ",$db); if ($myrow_city_do['point_id'] > 0) do { print "'$myrow_stations[point_id]':'$myrow_stations[point_ru_name]', "; } if ($myrow_city_do['point_id'] > 0) print "'':'' },"; } } ?> }; syncList1.sync('od','do'); </script> <? print "<input name='submit' type='submit' value='Ok'>"; ?> </body> </html>
|
и скрипт linkedselect.js:
| Javascript: | /* wwww.tigir.com (дата последней модификации - 30.11.2007) syncList - "класс" связанных списков */ function syncList(){} //Определяем функцию конструктор //Определяем методы //Метод sync() - принимает список из значений атрибутов id элементов SELECT, образующих связанный список и запускает их синхронизацию syncList.prototype.sync = function() { //Перебираем аргументы (id элементов SELECT) и назначаем событиям onChange селектов, с соответствующими id, функцию-обработчик. //В качестве обработчика выступает второй метод объекта syncList - _sync (напрямую его вызывать не нужно) //Обработчик назначается всем элементам SELECT кроме последнего в списке аргументов, т.к. последний не влияет ни на какой другой элемент SELECT и с ним не нужно синхронизироваться. for (var i=0; i < arguments.length-1; i++) document.getElementById(arguments[i]).onchange = (function (o,id1,id2){return function(){o._sync(id1,id2);};})(this, arguments[i], arguments[i+1]); document.getElementById(arguments[0]).onchange();//запускаем обработчик onchange первого селекта, чтобы при загрузке страницы заполнить дочерние селекты значениями. } //служебный метод _sync - срабатывает при смене выбранного элемента в текущем (старшем) элементе SELECT (по его событию onChange) и изменяет содержимое зависимого селекта на основании значения выбранного в старшем селекте. syncList.prototype._sync = function (firstSelectId, secondSelectId) { var firstSelect = document.getElementById(firstSelectId); var secondSelect = document.getElementById(secondSelectId); secondSelect.length = 0; //обнуляем второй (подчиненный) SELECT if (firstSelect.length>0)//если первый (старший) SELECT не пуст { //из свойства dataList, с данными для заполнения подчиненных селектов, берем ту часть данных, которая соответствует именно значению элемента, //выбранного в первом селекте, и определяет содержимое подчиненного элемента SELECT. var optionData = this.dataList[ firstSelect.options[firstSelect.selectedIndex==-1 ? 0 : firstSelect.selectedIndex].value ]; //заполняем второй (подчиненный) селект значениями (создаем элементы option) for (var key in optionData || null) secondSelect.options[secondSelect.length] = new Option(optionData[key], key); //если в старшем SELECT-е нет выделенного пункта, выделяем первый if (firstSelect.selectedIndex == -1) setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 ); //если во втором списке нет выделенного пункта, выделяем первый его пункт if (secondSelect.length>0) setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 ); } //если второй (подчиненный) селект имеет в свою очередь свои подчиненные селекты (те, для которых он главный), //то запускаем его обработчик onchange, чтобы изменить его подчиненные селекты secondSelect.onchange && secondSelect.onchange(); };
|
первый селект группировал (страны и города) без проблем, а второй выдал просто динамические урезанные города (без стран)
скрипт брал из известного примера http://www.tigir.com/javascript_select.htm
пробовал минимум 8 разных видов динамически зависемых селектов, но группировки я так и не добился.
Если кому-то известен, хотя бы источник, где можно осуществить подобную идею, подскажите пожалуйста. |
|
| В начало |
|
 |
 dogma
aka Достоевский

Возраст: 27
Знак зодиака: 
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
|
|
|
Цитата |
|
Кстати, у тебя нет проверки POST переменных. Хотя в данном скрипте это и не влияет на безопасность, но в будущем (при изменении скрипта) это может оказаться серьезной уязвимостью _________________ Bonum initium est dimidium facti
SQL-задачи (on-line) |
|
| В начало |
|
 |
|
Новая тема
Ответить
Печать
|
Вы можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете присоединять файлы в этом форуме Вы можете скачивать файлы в этом форуме
|
|