Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Сегодня :

День славянской письменности и культуры


динамические SELECT разбиты по группам


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж mor55
Новичок


Возраст: 29
Знак зодиака: Овен
Зарегистрирован: 27.08.2009
Сообщения: 2

СообщениеЧт, 27-Авг-2009 18:29    Заголовок сообщения: динамические SELECT разбиты по группам
Цитата

Дорогие друзья. Кто знает, подскажите. Как сделать динамически зависимые селекты (хотя бы, что бы 1-й зависел от 2-го), разделенные по группам. Перепробовал массу скриптов, но получается группировать только 1-й селект.


Вот, что получилось:
http://czinfobus.cz/1/

А хотелось бы так:
http://zluty.cz/online/Booking
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеЧт, 27-Авг-2009 22:52 
Цитата

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


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 28-Авг-2009 1:26 
Цитата

Он хочет прорекламировать сайты http://czinfobus.cz/1/ и http://zluty.cz/online/Booking
_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж mor55
Новичок


Возраст: 29
Знак зодиака: Овен
Зарегистрирован: 27.08.2009
Сообщения: 2

СообщениеПт, 04-Сен-2009 15:11 
Цитата

Нет, рекламировать не хочу. А жду помощи

Добавлено спустя 17 минут 25 секунд:

Объясню понятнее.

файл index.php

тут небольшая выборка стран (oprgroup) и городов (option) из 2-х таблиц базы данных:


php:
  1.  
  2. <html>
  3.   <head>
  4.   <title>Связанные селекты</title>
  5.  
  6.   <!-- Подключаем javascript-библиотеку функций -->
  7.   <script type="text/javascript" src="linkedselect.js"></script>
  8. </head>
  9.  
  10. <body>
  11. <?
  12. if (isset($_POST['od'])) {$od = $_POST['od']; } if (!isset($od)) {$od = 'x';}
  13. if (isset($_POST['do'])) {$do = $_POST['do']; } if (!isset($do)) {$do = 'x';}
  14.  
  15.  
  16. mysql_query ('SET NAMES utf8');
  17.  
  18.  
  19. //страны OD
  20. $result_country_od = mysql_query ("
  21. SELECT DISTINCT country.country_en, country.country_de, country.country_cz, country.country_ru, country.country_ua, country.id_country
  22. FROM country, bus_points, bus_stations, bus_routes, bus_intervals
  23. WHERE country.id_country = bus_points.id_country
  24. AND bus_stations.point_id = bus_points.point_id
  25. AND bus_routes.route_id = bus_stations.route_id
  26. AND bus_routes.web_active = 1
  27. AND bus_stations.station_id = bus_intervals.departure_station_id
  28. ORDER BY country.id_country ASC
  29. ",$db);
  30. $myrow_country_od = mysql_fetch_array($result_country_od);
  31.  
  32. //страны DO
  33. $result_country_do = mysql_query ("
  34. SELECT DISTINCT country.country_en, country.country_de, country.country_cz, country.country_ru, country.country_ua, country.id_country
  35. FROM country, bus_points, bus_stations, bus_routes, bus_intervals
  36. WHERE country.id_country = bus_points.id_country
  37. AND bus_stations.point_id = bus_points.point_id
  38. AND bus_routes.route_id = bus_stations.route_id
  39. AND bus_routes.web_active = 1
  40. AND bus_stations.station_id = bus_intervals.arrival_station_id
  41. ORDER BY country.id_country ASC
  42. ",$db);
  43. $myrow_country_do = mysql_fetch_array($result_country_do);
  44.  
  45.  
  46. print "<form action='index.php' method='post'>";
  47. print "<select  name='od' id='od'>";
  48. do
  49. {
  50. print "<optgroup label='$myrow_country_od[country_ru]'>
  51. ";
  52.  
  53. //города OD ru
  54. $result_city_od = mysql_query ("
  55. SELECT DISTINCT p.*
  56. FROM bus_points as p, bus_stations as s, bus_routes as r, bus_intervals as i
  57. WHERE p.id_country = $myrow_country_od[id_country]
  58. AND s.point_id = p.point_id
  59. AND r.route_id = s.route_id
  60. AND r.web_active = 1
  61. AND s.station_id = i.departure_station_id
  62. ORDER BY p.point_ru_name
  63. ",$db);
  64. $myrow_city_od = mysql_fetch_array($result_city_od);
  65.  
  66.         do
  67.         {
  68.         print "<option value='$myrow_city_od[point_id]'>$myrow_city_od[point_ru_name]</option>
  69.         ";
  70.         }
  71.         while ($myrow_city_od = mysql_fetch_array($result_city_od));   
  72.        
  73.         print "</optgroup>";
  74. }
  75. while ($myrow_country_od = mysql_fetch_array($result_country_od));
  76.  
  77.  
  78. print "</select>";
  79.  
  80.  
  81. print "<select name='do' id='do'></select>";
  82. ?>
  83. <script type='text/javascript'>
  84.  
  85. var syncList1 = new syncList;
  86.  
  87.  
  88. syncList1.dataList = { 
  89.  
  90. <?
  91.  
  92.         do
  93.         { 
  94.  
  95.         //города DO
  96.  $result_city_do = mysql_query ("
  97. SELECT DISTINCT p.*
  98. FROM bus_points as p, bus_stations as s, bus_routes as r, bus_intervals as i
  99. WHERE p.id_country = $myrow_country_do[id_country]
  100. AND s.point_id = p.point_id
  101. AND r.route_id = s.route_id
  102. AND r.web_active = 1
  103. AND s.station_id = i.departure_station_id
  104. ORDER BY p.id_country
  105. ",$db);
  106. $myrow_city_do = mysql_fetch_array($result_city_do);
  107.        
  108.         do
  109.         {
  110.  
  111.         if ($myrow_city_do['point_id'] > 0)
  112.         print "
  113.        
  114.         '$myrow_city_do[point_id]':{
  115.         ";
  116. if ($myrow_city_do['point_id'] > 0)     
  117.  
  118.  
  119. //станции
  120. $result_stations = mysql_query ("
  121. SELECT DISTINCT p.*
  122. FROM bus_points as p, bus_stations as s, bus_intervals as i
  123. WHERE (i.interval_id IN (
  124. SELECT i.interval_id
  125. FROM bus_points as p, bus_stations as s, bus_intervals as i
  126. WHERE (p.point_id IN (SELECT point_id FROM bus_points WHERE point_id = $myrow_city_do[point_id] ORDER BY id_country))
  127. AND s.point_id = p.point_id
  128. AND s.station_id = i.departure_station_id
  129. ORDER BY p.id_country))
  130. AND i.arrival_station_id = s.station_id
  131. AND s.point_id = p.point_id
  132. ORDER BY p.id_country
  133. ",$db);
  134. $myrow_stations = mysql_fetch_array($result_stations);
  135.        
  136.        
  137.         if ($myrow_city_do['point_id'] > 0)
  138.         do
  139.         {
  140.         print "'$myrow_stations[point_id]':'$myrow_stations[point_ru_name]',
  141.         ";
  142.  
  143.        
  144.         }
  145.         while ($myrow_stations = mysql_fetch_array($result_stations));
  146.         if ($myrow_city_do['point_id'] > 0)      print "'':''
  147.         },";
  148.        
  149.         }
  150.         while ($myrow_city_do = mysql_fetch_array($result_city_do));
  151.         
  152.         }
  153.                                        
  154.         while ($myrow_country_do = mysql_fetch_array($result_country_do));
  155. print "'':{'':''}";
  156.  
  157.         ?>
  158.  
  159.                
  160. };
  161.  
  162.  
  163. syncList1.sync('od','do');
  164. </script>
  165. <?
  166. print "<input name='submit' type='submit' value='Ok'>";
  167. print "</form>";
  168. print $od;
  169. print "<br>";
  170. print $do;
  171. ?>
  172. </body>
  173. </html>
  174.  



и скрипт linkedselect.js:

Javascript:
  1.  
  2. /*
  3. wwww.tigir.com (дата последней модификации - 30.11.2007)
  4. Библиотека linkedselect.js из статьи "Javascript SELECT - динамические списки" - http://www.tigir.com/linked_select.htm
  5. syncList - "класс" связанных списков
  6. */
  7. function syncList(){} //Определяем функцию конструктор
  8.  
  9. //Определяем методы
  10.  
  11. //Метод sync() - принимает список из значений атрибутов id элементов SELECT, образующих связанный список и запускает их синхронизацию
  12. syncList.prototype.sync = function()
  13. {
  14.         //Перебираем аргументы (id элементов SELECT) и назначаем событиям onChange селектов, с соответствующими id, функцию-обработчик.
  15.         //В качестве обработчика выступает второй метод объекта syncList - _sync (напрямую его вызывать не нужно)
  16.         //Обработчик назначается всем элементам SELECT кроме последнего в списке аргументов, т.к. последний не влияет ни на какой другой элемент SELECT и с ним не нужно синхронизироваться.
  17.         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]);
  18.         document.getElementById(arguments[0]).onchange();//запускаем обработчик onchange первого селекта, чтобы при загрузке страницы заполнить дочерние селекты значениями.
  19. }
  20. //служебный метод _sync - срабатывает при смене выбранного элемента в текущем (старшем) элементе SELECT (по его событию onChange) и изменяет содержимое зависимого селекта на основании значения выбранного в старшем селекте.
  21. syncList.prototype._sync = function (firstSelectId, secondSelectId)
  22. {
  23.         var firstSelect = document.getElementById(firstSelectId);
  24.         var secondSelect = document.getElementById(secondSelectId);
  25.  
  26.         secondSelect.length = 0; //обнуляем второй (подчиненный) SELECT
  27.        
  28.         if (firstSelect.length>0)//если первый (старший) SELECT не пуст
  29.         {
  30.                 //из свойства dataList, с данными для заполнения подчиненных селектов, берем ту часть данных, которая соответствует именно значению элемента,
  31.                 //выбранного в первом селекте, и определяет содержимое подчиненного элемента SELECT.
  32.                 var optionData = this.dataList[ firstSelect.options[firstSelect.selectedIndex==-1 ? 0 : firstSelect.selectedIndex].value ];
  33.                 //заполняем второй (подчиненный) селект значениями (создаем элементы option)
  34.                 for (var key in optionData || null) secondSelect.options[secondSelect.length] = new Option(optionData[key], key);
  35.                
  36.                 //если в старшем SELECT-е нет выделенного пункта, выделяем первый
  37.                 if (firstSelect.selectedIndex == -1) setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 );
  38.                 //если во втором списке нет выделенного пункта, выделяем первый его пункт
  39.                 if (secondSelect.length>0) setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 );
  40.         }
  41.         //если второй (подчиненный) селект имеет в свою очередь свои подчиненные селекты (те, для которых он главный),
  42.         //то запускаем его обработчик onchange, чтобы изменить его подчиненные селекты
  43.         secondSelect.onchange && secondSelect.onchange();
  44. };
  45.  


первый селект группировал (страны и города) без проблем, а второй выдал просто динамические урезанные города (без стран)

скрипт брал из известного примера http://www.tigir.com/javascript_select.htm

пробовал минимум 8 разных видов динамически зависемых селектов, но группировки я так и не добился.
Если кому-то известен, хотя бы источник, где можно осуществить подобную идею, подскажите пожалуйста.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж dogma
aka Достоевский


Возраст: 27
Знак зодиака: Телец
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
СообщениеПн, 07-Сен-2009 3:53 
Цитата

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

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100