|
|
|
| Всем привет.
Заранее, сори, потому как не знаю, к какому разделу это больше относиться к php или javascript.
Есть скрипт, который формирует двойной выпадающий список.
<?
<?php
// Устанавливаем соединение с базой данных
require_once("config.php");
// Начало HTML-формы
echo "<form action=3.php method=post>";
// Формируем первый выпадающий список
$query = "SELECT * FROM catalogs
ORDER BY name";
$cat = mysql_query($query);
if(!$cat) exit(mysql_error());
// Если имеется хотя бы одна запись,
// то формируем выпадающий список
if(mysql_num_rows($cat) > 0)
{
echo "<select name=id_catalog
onchange='show(this.form.id_catalog)'>";
echo "<option value=0>Не имеет значения</option>";
while($catalog = mysql_fetch_array($cat))
{
if($_POST['id_catalog'] == $catalog['id_catalog'])
{
$selected = "selected";
}
else $selected = "";
echo "<option value=$catalog[id_catalog] $selected>
$catalog[name]</option>";
// Формируем массив первичных ключей каталогов
$array_catalog[] = $catalog['id_catalog'];
}
echo "</select>";
}
// Формируем второй выпадающий список
$query = "SELECT * FROM catalogs";
$cat = mysql_query($query);
if(!$cat) exit(mysql_error());
// Если имеется хотя бы одна запись,
// формируем выпадающий список
if(mysql_num_rows($cat) > 0)
{
while($catalog = mysql_fetch_array($cat))
{
// Формируем скрытые списки
$query = "SELECT * FROM products
WHERE id_catalog = $catalog[id_catalog]
ORDER BY name";
$prd = mysql_query($query);
if(!$prd) exit(mysql_error());
// Если в текущем каталоге имеется хотя бы
// одна товарная позиция, то формируем выпадающий список
if(mysql_num_rows($prd) > 0)
{
echo "<select id=$catalog[id_catalog]
style=\"display:none\" name=product$catalog[id_catalog]>";
while($product = mysql_fetch_array($prd))
{
if($_POST['id_product'] == $product['id_product'])
{
$selected = "selected";
}
else $selected = "";
echo "<option value=$product[id_product] $selected>
$product[name]</option>";
}
echo "</select>";
}
}
}
echo "</br><input type=submit name=send value=Отправить>";
// Конец HTML-формы
echo "</form>";
?>
<script language='JavaScript1.1' type='text/javascript'>
<!--
var messageIdList = new Array(<?= implode(",", $array_catalog) ?>);
function show(sel)
{
for (i = 0; i < messageIdList.length; i++)
{
document.getElementById(messageIdList[i]).style.display = "none";
}
var selectedVal = sel.options[sel.selectedIndex].value;
document.getElementById(selectedVal).style.display = "block";
}
//-->
</script>
?>
|
Мне требуется сделать несколько таких выпадающих списков, на одной странице.
То есть первый категория - > продукт
ниже: категория - > продукт итд
все они должны быть в одной форме | |
|
|
|
|
|
|
|
для: *m*
(25.02.2011 в 17:44)
| | Это называется связанные списки. Тут по большей части работа JavaScript, а что касается РНР, то лучше сделать не так. Но сперва вопрос такой:
>первый категория - > продукт
>ниже: категория - > продукт
то есть каждый последующий список, это дубликат предыдущего получается? Что-то не очень понятен смысл списков ваших, поясните. И запросы к базе у вас странные. | |
|
|
|
|
|
|
|
для: sim5
(26.02.2011 в 05:21)
| | ну в моем случае это страны и города, и каждый список, это дополнительная страна и к ней нужно выбирать город. То есть не совсем дубликат.. Каждый последующий список, может быть разная страна и соответственно город . И вот еще такой вопрос, можно ли сделать, это посредством php и javascript, чтобы к стране можно было выбирать несколько городов.
Чтобы в итоге получилось так:
Страна - > Город - > Город - > Город
Страна - > Город - > Город - > Город
Страна - > Город - > Город - > Город
|
| |
|
|
|
|
|
|
|
для: *m*
(26.02.2011 в 12:43)
| | Может я чего-то не понимаю в вашей затее, но зачем вам столько списков? Ну к примеру, если бы мы отдали пользователю один список "Страна", по которому он мог бы ее выбрать, и после этого выбора появлялся бы следующий список, в котором можно было бы выбрать область, который бы порождал список раойнов, а тот список городов, и так вплоть до этажа в подъезде.
То есть, пользователю выдается "дерево" списков, по которому он, спускаясь вниз, доходит до конечной цели. И понятное дело, что в данном случае это оправдано и удобно для пользователя хотябы по тому, что если ему вывалить по выбору страны список всех подъездов в них имеющихся, то это бы был сверхгигантский список.
Вы же хотите каждой парой списков делать одно и тоже - выбрать страну, а в другом город. Зачем тогда дублировать эти пары списков? По идее, если я вас правильно понимаю, то вам требуется всего два списка, вот только данные для них нужно представлять совсем иначе, нежели чем вы это делаете.
Список стран это уже готовый html-код, а вот для городов нужно передавать клиенту js-обект, а из него средствами javascript готовить непосредственно список. Значения опшенов списка стран это ключи, под которыми js-обект содержит имена городов. Выбирает пользователь страну в первом списке, JavaScript по ключу выбирает информацию о городах этой страны, создает и выводит список.
Если же вам эти списки нужны, к примеру, чтобы у каждого поля формы пользователь мог выбрать страну и город в ней, а посему вы хотели бы прикрутить такие списки к каждому полю, то и в этом случае это неоправдано, так как средствами JavaScript эту пару списков можно отображать на странице динамически, в любом ее месте.
Если я не понял, то объясните, для чего одинаковые по сути пары списков вам? | |
|
|
|
|
|
|
|
для: sim5
(26.02.2011 в 13:34)
| | Смотрите, у меня есть задача, добавлять к туристическому экскурсионному туру несколько городов маршрута, города эти могут быть из разных стран, и чтобы не выводить все города всех стран в одном 5ти этажном списке, решил сделать выпадающими списками. Сначала выбираем страну, и в выпадающих списках, выбираем города, этой страны, затем если этот тур отностится еще и к другой стране, выбираем другую страну в списке ниже и выбираем для нее города. Но в принципе не больше трех стран. | |
|
|
|
|
|
|
|
для: *m*
(26.02.2011 в 15:22)
| | Так при таком подходе как у вас Страна-Город вам все равно придется "вываливать" большой список, вы же не делите их как "часть" городов одной страны, по крайней мере этого у вас не заметно, да и смысла нет в этом. Так что как ни крути, а вам требуется всего два списка.
Другое дело, если бы эти списки имели родителя - туристический маршрут, ему подчинены, вот тогода можно было бы последовательно все и выбирать. То есть три списка - в первом маршрут, второй страны этого маршрута, а третий города в этом маршруте.
И в этом случае обошлось бы тремя списками, не клонируя их для каждого выбора. Если требуется последовательно выбирать эти значения, занося их куда либо, то такую последовательность задать JS-сценарием и отследить ее не сложно будет. | |
|
|
|
|
|
|
|
для: sim5
(26.02.2011 в 15:43)
| | ))) все может и правильно Вы говорите, но как мне все же сделать, то что мне нужно? | |
|
|
|
|
|
|
|
для: *m*
(27.02.2011 в 12:15)
| | У вас есть два списка, и выбирать вы можете только из них. Следовательно, привязывайте (показывайте) на странице в том месте, где на данный момент нужно осуществить выбор. Как и где, я не могу сказать, ибо как вы делаете я не знаю. Например, если маршрут это некая схема его, то эти списки можно показывать рядом с узлом маршрута, по которому щелкнет пользователь. В общем решений может быть много, а что....
Что касается самих списков, то отдавать пользователю их лучше не так, тем более, что городов много. Список стран, если он небольшой, может быть уже готовым html кодом, а города в виде js-объекта. Мне некогда сейас писать много, потому пример на jQury, на чистом JS просто чуть больше писать надо будет.
<script>
//объект городов
var t = {1:[[1,'Aaaaa'],[2,'Bbbbb'],[3,'Ccccc']],2:[[5,'Ddddd'],[6,'Eeeee'],[7,'Fffff']],3:[[1,'Ggggg'],[2,'Hhhhh']]};
//вывод списка городов по выбранной стране
function getCity(n) {
if(n) {
var s = '<select name="city" onchange="$(this).remove()"><option value="">Выберите...</option>';
for(i=0; i<t[n].length; i++) s += '<option value='+t[n][i][0]+'>'+t[n][i][1]+'</option>';
s += '</select>';
$(document.body).append(s);
}
}
</script>
<select name="country" onchange="getCity(this.value)">
<option value="">Выберите...</option>
<option value="1">AAAAAA</option>
<option value="2">BBBBBB</option>
<option value="3">CCCCCC</option>
</select>
|
| |
|
|
|
|
|
|
|
для: sim5
(27.02.2011 в 14:53)
| | что не сработал у меня Ваш пример(
ладно, сейчас нужно хотя бы к чему то прийти, а как в приведенный мною пример, добавить еще несколько, выпадающих списков с продуктами? в моем случае странами. Например еще 2 дополнительных списка городов по выбранной стране, чтобы получилось:
Страна -> Город -> Город -> Город
|
| |
|
|
|
|
|
|
|
для: *m*
(27.02.2011 в 20:13)
| | Чтобы пример заработал нужно подключить библиотеку jQuery, в шапке страницы, я же написал, что пример под нее написан .
Чтобы в стране можно было выбрать несколько городов, для этого не надо кучу списков городов, дотстаточно указать одному списку городов атрибут multiple, а к его имени добавить [], тоесть для пимера выше, элемет select будет записан так:
<select multiple name="city[]">
| ,в котором теперь можно выбрать несколько городов, а на сервере, после отправки формы, будет получен массив city.
PS. Немного времени выкроил, вот пример. Но сначала:
1. Нельзя в списке Город выбрать Город -> Город -> Город, как пишите вы. О таком выборе еще может быть речь в случае выбора административной принадлежности. Нужен список с множественным выбором (выше написано).
2. У вас уже есть два списка, а более не получить их, не из чего у вас, а коли вы хотите "завалить" ими страницу, то просто дублируйте их.
Эот пример без кучи списков и предполагает, что у вас есть маршруты, которые охватывают те или иные страны. Выбрав маршрут, пользователь получает список стран этого маршрута, а выбрав страну в этом списке, получает список городов ее, в котором может выбрать несколько городов. При каждом новом выборе (снизу-вверх) списки удаляются со страницы.
Данные пользователю передаются в виде двух js-объктов: а) rut - описывает связь id маршрутов со странами входящими в них; б) cit - описывает связь id стран с городами входящими в них. По этим id происходит выборка в объектах и строится соответствующий список. То есть, готовые списки не создаются на сервере и не передаются клиенту, это не только расточительно, но и не удобно.
Где их выводить, этого я не знаю, как собственно не знаю чего вам вообще надо. Нет в примере и фиксации выбранного пользователем, что тоже зависит от того, что вы планируете делать. А это может быть как формирование массива с последующей сериализацией для передачи его по url, так и формирование скрытых полей формы. И то и другое сделать не сложно.
Пример под jquery, которая в нем подключается с официального сайта разработчика. Если вам надо просто на javascript, то обращайтесь в соответствующий раздел форума, а мне писать некогда.
<html>
<head>
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var rut = {"m1":[[1,"Страна 1"],[2,"Страна 2"],[3,"Страна 3"]],
"m2":[[4,"Страна 4"],[5,"Страна 5"],[6,"Страна 6"]],
"m3":[[7,"Страна 7"],[8,"Страна 8"],[9,"Страна 9"]]};
var cit = {1:[[1,"Город 1"],[2,"Город 2"],[3,"Город 3"]],
2:[[4,"Город 1"],[5,"Город 2"],[6,"Город 3"],[7,"Город 4"]],
3:[[8,"Город 1"],[9,"Город 2"],[10,"Город 3"]],
4:[[11,"Город 1"],[12,"Город 2"],[13,"Город 3"]],
5:[[14,"Город 1"],[15,"Город 2"],[16,"Город 3"]],
6:[[17,"Город 1"],[18,"Город 2"],[19,"Город 3"],[20,"Город 4"]],
7:[[21,"Город 1"],[22,"Город 2"],[23,"Город 3"],[24,"Город 4"]],
8:[[25,"Город 1"],[26,"Город 2"],[27,"Город 3"]],
9:[[28,"Город 1"],[29,"Город 2"],[30,"Город 3"],[31,"Город 4"]]};
$(document).ready(function(){
$('#route > li').click(function(){
$('#country').remove();
$('#city').remove();
var s = '<select id="country"><option value="">Выберите...</option>';
var c = rut[this.id]
for(i=0; i<c.length; i++) s += '<option value='+c[i][0]+'>'+c[i][1]+'</option>';
s += '</select>';
$(document.body).append(s);
});
$('#country').live('change',function(){
$('#city').remove();
if(this.value) {
var s = '<select id="city" multiple name="city[]"><option value="">Выберите...</option>';
var c = cit[this.value]
for(i=0; i<c.length; i++) s += '<option value='+c[i][0]+'>'+c[i][1]+'</option>';
s += '</select>';
$(document.body).append(s);
}
});
});
</script>
</head>
<body>
Маршруты
<ul id="route">
<li id="m1">Маршрут 1</li>
<li id="m2">Маршрут 2</li>
<li id="m3">Маршрут 3</li>
</ul>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: sim5
(28.02.2011 в 01:07)
| | А я и подключал в head библиотеку, у меня появлялась возможность выбрать из первого списка, после чего появлялся второй связный список, но когда я выбирал из второго списка он тут же пропадал.
А вот последний пример, работает, мне он в принципе подходит.
Такой вопрос, а можно будет динамически формировать списки, потому что, администратор может добавить новую страну или новые города для какой-нибудь страны, чтобы не приходилось, вручную править списки, нужно чтобы информация из БД подгружалась. Вот как в приведенном мною примере в самом начале, где в javascript в массив, помещаются имплоидом значения, из массива php. Здесь можно тем же образом поступить? | |
|
|
|
|
|
|
|
для: *m*
(28.02.2011 в 12:57)
| | Пропадает потому, что так в примере написано, просто в примере нет обработки сохранения выбора, но после выбора список надо удалять. Правда это справедливо только для этого примера, для второго, со списком с множественным выбром, так же делать нельзя.
Так вы и будете формировать динамически, на сервере, правда не сами списки, а данные для них, как то id маршрутов и их названия (если конечно это у вас есть), выводя их в список (ul), id стран и городов, а также их имена, добавляя их в js-объекты. Только заметьте, что эти id маршрутов в элементах LI не прописаны непосредственно, а после буквы m, так как id элемента на странице не может начинаться с цифры. Извлечь цифры из этих id для передачи на сервер не сложно, с помощью рег выражения.
Вы же отдавая страницу пользователю делате выборку из базы, и она вернет все, что на данный момент в ней есть. Сформировали список маршрутов (ul), а вот данные для стран и городов помещаете в два объекта, по примерам указанным в этом примере. То есть, на сервере, в циклах вы формируете не выпадающие списки (select), а формируете эти объекты.
На клиенте будут сформированы списки отражающие текущее состояние в базе, вот и вся динамика. Если у вас задействован Ajax, то можно вообще не строить эти объекты, а получать с сервера запросом от клиента. | |
|
|
|
|
|
|
|
для: sim5
(28.02.2011 в 13:43)
| | Отлично!) Ну я буду собирать в объекты потому что AJAX не знаю совсем, поэтому буду отталкиваться от вашего примера. Единственное, что у меня почему-то не попадают данные из селектов в массив $_POST. То есть я поместил ваш пример в форму, по кнопке отправить в $_POST попадает только сама кнопка. | |
|
|
|
|
|
|
|
для: *m*
(28.02.2011 в 15:55)
| | Я же писал:
Нет в примере и фиксации выбранного пользователем, что тоже зависит от того, что вы планируете делать. А это может быть как формирование массива с последующей сериализацией для передачи его по url, так и формирование скрытых полей формы. И то и другое сделать не сложно.
То есть, нужно добавить к обработке событий onchange списков действия, по которым выбранные значения спика будут где-то фиксироваться. Если вы отправляете формой, то значит на jQuery же и добавляйте скрытые поля в эту форму, соответственно именуя их, и давая значения выбранные пользователем в списках. Еще лучше, по выбору в списках, создавать промежуточный массив, который будет обновляться по выбору, так как пользователь может изменить свое решение, что-то ранее выбранное изменить, либо вообще отказаться от какого либо выбора. В этом случае этот промежуточный массив можно легко отредактировать, и только перед отправкой формы добавить скрытые поля формы с его значениями. Для того чтобы пользователь мог отменить что либо из ранее выбранного, перед помещением значений массива в форму необходимо вывести результат выбора, в котором он может произвести необходимое. | |
|
|
|
|