[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить скрипт вывода зависимых списков
segazav
Есть два зависимых списка:


<?php
<select name="region" size="1" class="pole" id="region">
<
option value="<?php echo @$region?>"><?php echo @$region?></option>
<
option value="Свердловская область">Свердловская область</option>
<
option value="Московская область">Московская область</option>

<
select name="gorod" size="1" class="pole" id="gorod">
<
option value="<?php echo @$gorod ?>"><?php echo @$gorod ?></option>
<
option value="Екатеринбург">Екатеринбург</option>
<
option value="Москва">Москва</option>
?>


Помогите составить скрипт для того, чтобы при выборе в первом списке "Региона" автоматически подбирался необходимый "Город" во втором списке.



Спустя 1 час, 15 минут, 1 секунда (8.05.2011 - 12:23) lioness написал(а):
создать таблицу, где будет привязка области к городам, такой структуры:

id, parent_id, name
1, 0, Свердловская область
2, 1, Екатеринбург
3, 0, Московская область
4, 3, Москва

далее при выбора области в соответствии с полученным id выбираем все его дочерние элементы, например, выбрано Московская область id = 3, составляем запрос:
select * from table1 where parent_id=3

и выводим в цыкле соответственные данные

<select name="region" size="1" class="pole" id="region">
if($date['parent_id'] == 0)
{
$selected = ($date['id'] == 3) ? 'selected="selected"' : '';
<
option value="$date['id']" $selected>$date['name']</option>
}

<select name="gorod" size="1" class="pole" id="gorod">
if($date['parent_id'] > 0)
<
option value="$date['id']">$date['name']</option>


вот какой код у нас получится в HTML

<select name="region" size="1" class="pole" id="region">
<option
value="1">Свердловская область</option>
<option
value="3" selected="selected">Московская область</option>

<select
name="gorod" size="1" class="pole" id="gorod">
<option
value="4">Москва</option>

Спустя 29 минут, 11 секунд (8.05.2011 - 12:52) segazav написал(а):
Вашу отличную мысль я уловил!
Что то я не совсем понял порядок выполнения кода.
Можете все скрипты написать одним кодом?

Спустя 33 минуты, 5 секунд (8.05.2011 - 13:26) lioness написал(а):
define('MYSQL_HOST','localhost');
define('MYSQL_USER','user');
define('MYSQL_PASSWORD','test');
define('MYSQL_DATABASE','new');
define('MYSQL_CHARSET','utf8');

if(@mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD))
{
mysql_query('SET NAMES '.MYSQL_CHARSET.';');
mysql_select_db(MYSQL_DATABASE);

$result = mysql_query('select * from table1 where parent_id = 0');
echo '<select name="region" size="1" class="pole" id="region">';
while($date = mysql_fetch_assoc($result))
{
$selected = ($date['id'] == 3) ? 'selected="selected"' : '';
echo '<option value="'.$date['id'].'" '.$selected.'>'.$date['name'].'</option>';
}
echo '</select>';

$result = mysql_query('select * from table1 where parent_id = 3');
echo '<select name="gorod" size="1" class="pole" id="gorod">';
while($date = mysql_fetch_assoc($result))
echo '<option value="'.$date['id'].'">'.$date['name'].'</option>';
echo '</select>';
}

mysql_close();

Спустя 55 минут, 53 секунды (8.05.2011 - 14:21) segazav написал(а):
А если таблицу создать немного по другому:

id, region_tabl, gorod_tabl
1, Свердловская область, Екатеринбург
2, Свердловская область, Нижний Тагил
3, Московская область, Москва
4, Московская область, Балашиха

для того, чтобы в данной строке (echo '<option value="'.$date['id'].'" '.$selected.'>'.$date['name'].'</option>';) значения ($date['id']) и ($date['name']) были одинаковые.

Какой код тогда будет для вывода?

Спустя 1 час, 11 минут, 40 секунд (8.05.2011 - 15:33) lioness написал(а):
Здесь уже надо думать логически, если нужна область подставляете 'region_tabl', а если город, то 'gorod_tabl'. Хотя такая структура не оптимальная тип varchar (не меньше 30 байт в зависимости от длинны строки) займет больше места, чем если был бы тип int (максимальный размер 11 байт, хотя можна поставить меньше в зависимости от количества строк в таблице) и теперь 30 байт умножаем на количество строк в таблице и отнимаем 11 байт уженно на количество строк и узнаем на сколько размер таблицы мог бы быть меншым, хотя это уже Ваше дело какй тип и структуру использовать.

Спустя 45 минут, 7 секунд (8.05.2011 - 16:18) segazav написал(а):
А в этом коде, без перезагрузки страницы, список можно выбрать только один раз?

Спустя 19 минут, 58 секунд (8.05.2011 - 16:38) Joker написал(а):
segazav
Читаем нормализацию бд)
segazav
2 элементарные таблицы:

region:
id|name

city:
id|name|region_id

С начало на странице выводишь список из таблицы region после того как значение в select'e изменилось (событие onchange вроде) аяксом загружаешь второй select но в запросе подставляешь id из перового select'a.

Спустя 4 минуты, 35 секунд (8.05.2011 - 16:43) lioness написал(а):
а перезагрузку страницы делайте с помощью JavaScript или jQuery с использованием onchange и ajax, это уже на Ваш вкус, а код только для примера как организовать вывод зависимых списков.

Спустя 8 минут, 26 секунд (8.05.2011 - 16:51) lioness написал(а):
Joker
Не оптимально 2 таблицы так как, если в будущем надо будет кроме областей и городов добавить районы, села, тогда у тебя будет 4 таблицы, а у меня одна, где есть привязка к parent_id это наиболее оптимальный вариант.

Спустя 11 минут, 34 секунды (8.05.2011 - 17:03) segazav написал(а):
Нашел одну подходящую функцию, работает нормально.
Но:
1) после перезагрузки страницы поле город становится не активным и для того, чтобы снова выбрать город, необходимо заново выбрать регион.
2) в некоторых браузерах в поле город отображается регион

Подскажите, как это исправить???

Вот JAVA:


function mF ()
{
var slc_1 = document.getElementById ('region'), slc_2 = document.getElementById ('gorod');
if (!slc_1.selectedIndex) {slc_2.selectedIndex = 0; slc_2.disabled = 1; return}
if (!self.Gslc_2)
{
Gslc_2 = []; for (var j = 0, obj = slc_2.options, lj = obj.length; j < lj; j++)
{Gslc_2 [j] = []; Gslc_2 [j].label = obj [j].label; Gslc_2 [j].value = obj [j].value; Gslc_2 [j].text = obj [j].text}
var w = Math.max (slc_1.offsetWidth, slc_2.offsetWidth); slc_1.style.width = slc_2.style.width = w + 'px';
}
for (var rbr = slc_1.options [slc_1.selectedIndex].value, new_slc_2 = [], j = k = 1, lj = Gslc_2.length; j < lj; j++)
if (Gslc_2 [j].label == rbr) {new_slc_2 [k] = []; new_slc_2 [k].value = Gslc_2 [j].value; new_slc_2 [k++].text = Gslc_2 [j].text}
new_slc_2 [0] = Gslc_2 [0];
for (var j = slc_2.options.length - 1; j >= 0; j--) slc_2.options [j] = null;
for (var j = 0; j < new_slc_2.length; j++)
{
var opt = document.createElement ('option'); opt.value = new_slc_2 [j].value; opt.text = new_slc_2 [j].text;
slc_2.options.add (opt);
}
slc_2.disabled = 0;
}


А вот часть самого списка (всего 86 регионов):


<select name="region" size="1" class="pole" id="region" onchange="mF ()">
<
option value="<?php if (empty ($_SESSION['gorod']) and empty ($_POST['gorod'])) {echo "";} else {echo @$_POST['region'];}?>"><?php if (empty ($_SESSION['gorod']) and empty ($_POST['gorod'])) {echo "";} else {echo @$_POST['region'];}?></option>
<
option value="Республика Адыгея">Адыгея</option>
<
option value="Республика Алтай">Алтай (Республика)</option>
<
option value="Алтайский край">Алтайский край</option>
<
option value="Амурская область">Амурская область</option>
</
select>


<
select name="gorod" size="1" class="pole" id="gorod" disabled>
<
option label="<?php echo @$_POST['region'] ?>" value="<?php if (!empty ($_POST['gorod'])) {echo $_POST['gorod']; $_SESSION['gorod']=$_POST['gorod'];} else {echo $_SESSION['gorod'];}?>">
<?php if (!empty ($_POST['gorod'])) {echo $_POST['gorod']; $_SESSION['gorod']=$_POST['gorod'];} else {echo $_SESSION['gorod'];}?>
</option>
<
option label="Республика Адыгея" value="Адыгейск">Адыгейск</option>
<
option label="Республика Адыгея" value="Майкоп">Майкоп</option>
<
option label="Республика Алтай" value="Горно-Алтайск">Горно-Алтайск</option>
<
option label="Алтайский край" value="Алейск">Алейск</option>
<
option label="Алтайский край" value="Барнаул">Барнаул</option>
<
option label="Алтайский край" value="Белокуриха">Белокуриха</option>
<
option label="Алтайский край" value="Бийск">Бийск</option>
<
option label="Алтайский край" value="Горняк">Горняк</option>
<
option label="Алтайский край" value="Заринск">Заринск</option>
<
option label="Алтайский край" value="Змеиногорск">Змеиногорск</option>
<
option label="Алтайский край" value="Камень-на-Оби">Камень-на-Оби</option>
<
option label="Алтайский край" value="Новоалтайск">Новоалтайск</option>
<
option label="Алтайский край" value="Рубцовск">Рубцовск</option>
<
option label="Алтайский край" value="Славгород">Славгород</option>
<
option label="Алтайский край" value="Яровое">Яровое</option>
<
option label="Амурская область" value="Белогорск">Белогорск</option>
<
option label="Амурская область" value="Благовещенск">Благовещенск</option>
<
option label="Амурская область" value="Завитинск">Завитинск</option>
<
option label="Амурская область" value="Зея">Зея</option>
<
option label="Амурская область" value="Райчихинск">Райчихинск</option>
<
option label="Амурская область" value="Свободный">Свободный</option>
<
option label="Амурская область" value="Сковородино">Сковородино</option>
<
option label="Амурская область" value="Тында">Тында</option>
<
option label="Амурская область" value="Шимановск">Шимановск</option>
</
select>

Спустя 11 минут, 5 секунд (8.05.2011 - 17:14) Joker написал(а):
lioness
Спорим?)

Занеси в свою таблицу все страны, все области, все города, все районы, после начни подлючать эту таблицу в куче мест, сразу поймешь что любая бд даже такая как ORACLE начнет тормозить, ну да ладно и это еще фантики, понаставим индексов как нубудь ускорим работу, задача следующая, вывести все только области в моём случае банальные запрос самый быстрый по скорости select без каких то условий, в твоём случае это условие на parent_id будет стоять и это при условии что он не где не будет нарушен (будем надеяться менеджеры у тебя адекватные и не когда в жизни не допускают ошибок)

Но давай возьмём расширение таблички:

каждый город может быть федеральным или моногородом, или еще чем нибудь поставим в табличку тип city_type_id ну и отдельную табличку для у меня как работало все так и работает в твоей эти значения появятся у всех записей даже у стран, областей и т.д. и т.п.

ну и это еще не всё каждая область тоже может быть разной:
- область
- край
- автономный округ

и вот еще одно поле которое будет абсолютно у всех записей.

и теперь давай посчитаем место на диске которое займут мои таблички и твоя одна, уже страшно становится от твоей. еще вопросы?)

в итоге твоя таблица будет типа id|name|parent_id|city_type_id|region_type_id

Спустя 3 минуты, 16 секунд (8.05.2011 - 17:17) Joker написал(а):
lioness
прочитай про нармализацию это во первых.
мешать в одну табличку все сущности, извини но через месяц при первом же масштабировании проекты ты улетишь в трубу.

Спустя 5 минут, 53 секунды (8.05.2011 - 17:23) Joker написал(а):
И еще моментик, работая над серьёзными проектами всегда требуется аналитика, а это сложнейшие запросы, делая запросы на свою табличку переджойнивая её саму на себя кучу раз, у тебя будет считать стандартный отчет по несколько минут, готов получить пендюлей от директора? начальники ждать не любят.

Спустя 10 минут, 50 секунд (8.05.2011 - 17:34) segazav написал(а):
Ребята помогите, что не могу понять как устранить недочеты по указанному выше коду!
Этот код вообще не использует Mysql.

Спустя 3 минуты, 49 секунд (8.05.2011 - 17:38) Joker написал(а):
segazav
Тебе уже и пример кода дали и алгоритм, попробуй разобратся сам если не получается пиши что не получается а про тексты типа "ааааа помощь не работает" почитай тут http://phpforum.ru/index.php?showtopic=3 пиши что конкретно не работает и как пытаешься исправить

Спустя 1 минута, 47 секунд (8.05.2011 - 17:39) lioness написал(а):
Joker
При заполнении моей таблицы менеджеры не заполняют поле parent_id оно заполняется php-скриптом, на счет структуры, то она останется такой какой была так как привязка идет таким образом, что не нужно создавать дополнительные колонки, а запрос и вывод данных происходит рекурсивно.

PS. мой портал так и работает, и не загнулся с 2004 г. по сегодняшний день

Спустя 3 минуты, 13 секунд (8.05.2011 - 17:43) Joker написал(а):
уников в день сколько?

то что у тебя работает паортал это не показатель, показатель нагрузка на сайт, дай линк на свой "портал"

Спустя 3 минуты, 4 секунды (8.05.2011 - 17:46) lioness написал(а):
...

Спустя 6 минут, 14 секунд (8.05.2011 - 17:52) Joker написал(а):
предлагаю дуэль, твоя архитектура против моей, бд MySQL (тип таблиц на свой выбор)
Должно учитываться:
- скорость (на больших обьёмах данных)
- расширяемость

ну и хватит для начала, если уверен в своих знаниях то создовай тему в разделе флейм думаю многие вынесут что то для себя новое. 1,2к в день уников это мало а уже сайт подгружается за 3 секунды)

Спустя 5 дней, 2 часа, 27 минут, 42 секунды (13.05.2011 - 20:20) segazav написал(а):
Я сделал так, но почему то не сохраняются последние выбранные значения поля "menu2" вместо первой пустой строки, после перезагрузки формы:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<
script language="JavaScript">
dir = new Array()

dir[1] = new Array()
dir[1][0]=new dir_qrec("","")
dir[1][1]=new dir_qrec("Апрелевка","Апрелевка")
dir[1][2]=new dir_qrec("Балашиха","Балашиха")
dir[1][3]=new dir_qrec("Бронницы","Бронницы")

dir[2] = new Array()
dir[2][0]=new dir_qrec("","")
dir[2][1]=new dir_qrec("Арамиль","Арамиль")
dir[2][2]=new dir_qrec("Артемовский","Артемовский")
dir[2][3]=new dir_qrec("Асбест","Асбест")

dir[3] = new Array()
dir[3][0]=new dir_qrec("","")
dir[3][1]=new dir_qrec("Александровск","Александровск")
dir[3][2]=new dir_qrec("Березники","Березники")
dir[3][3]=new dir_qrec("Верещагино","Верещагино")

function dir_qrec(subname,subid){
this.subname=subname
this.subid=subid
return this
}

function show_subs( value )
{
var k=document.form1.menu1.selectedIndex
var listObj=document.form1.menu2
listObj.length=0
for (var j=0; j<dir[k].length; j++)
{
listObj.options[j]=new Option(dir[k][j].subname)
document.form1.menu2.options[j].value=dir[k][j].subid
}
listObj.options[ value ].selected=true
}
</script>
</
head>

<
body>
<
form name="form1" action="3.php" method="GET" onSubmit="this.si.value=this.menu1.selectedIndex; this.sity.value=this.menu2.selectedIndex">
<
input type="hidden" name="si" value="0">
<?php
$arr = array ('', 'Московская область', 'Свердловская область', 'Пермский край');
$response = '<select name="menu1">';
for ($i=0; $i<count($arr); $i++){
if($i==$_GET['si'])
$response .= '<option value="'.$arr[$i].'" selected="selected">'.$arr[$i].'</option>';
else
$response .= '<option value="'.$arr[$i].'">'.$arr[$i].'</option>';
}
$response .= '</select>';
print $response;
?>
<br>
<
input type="hidden" name="sity" value="0">
<?php
print '
<select name="menu2" onChange="">
<script language="JavaScript">
<!--
show_subs( ".$_GET[sity]." );
//->
</script>
</select>
'
;
?>
<br>
<
input name="search" type="submit" class="knopka" title="Найти" value="Найти">
</
form>
</
body>
</
html>


Подскажите, как это можно доработать?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.