Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выпадающие списки
 
 автор: *m*   (25.02.2011 в 17:44)   письмо автору
 
 

Всем привет.
Заранее, сори, потому как не знаю, к какому разделу это больше относиться к 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>


?>


Мне требуется сделать несколько таких выпадающих списков, на одной странице.
То есть первый категория - > продукт
ниже: категория - > продукт итд
все они должны быть в одной форме

  Ответить  
 
 автор: sim5   (26.02.2011 в 05:21)   письмо автору
 
   для: *m*   (25.02.2011 в 17:44)
 

Это называется связанные списки. Тут по большей части работа JavaScript, а что касается РНР, то лучше сделать не так. Но сперва вопрос такой:
>первый категория - > продукт
>ниже: категория - > продукт

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

  Ответить  
 
 автор: *m*   (26.02.2011 в 12:43)   письмо автору
 
   для: sim5   (26.02.2011 в 05:21)
 

ну в моем случае это страны и города, и каждый список, это дополнительная страна и к ней нужно выбирать город. То есть не совсем дубликат.. Каждый последующий список, может быть разная страна и соответственно город . И вот еще такой вопрос, можно ли сделать, это посредством php и javascript, чтобы к стране можно было выбирать несколько городов.

Чтобы в итоге получилось так:

Страна - > Город - > Город - > Город 
Страна - > Город - > Город - > Город 
Страна - > Город - > Город - > Город 

  Ответить  
 
 автор: sim5   (26.02.2011 в 13:34)   письмо автору
 
   для: *m*   (26.02.2011 в 12:43)
 

Может я чего-то не понимаю в вашей затее, но зачем вам столько списков? Ну к примеру, если бы мы отдали пользователю один список "Страна", по которому он мог бы ее выбрать, и после этого выбора появлялся бы следующий список, в котором можно было бы выбрать область, который бы порождал список раойнов, а тот список городов, и так вплоть до этажа в подъезде.
То есть, пользователю выдается "дерево" списков, по которому он, спускаясь вниз, доходит до конечной цели. И понятное дело, что в данном случае это оправдано и удобно для пользователя хотябы по тому, что если ему вывалить по выбору страны список всех подъездов в них имеющихся, то это бы был сверхгигантский список.

Вы же хотите каждой парой списков делать одно и тоже - выбрать страну, а в другом город. Зачем тогда дублировать эти пары списков? По идее, если я вас правильно понимаю, то вам требуется всего два списка, вот только данные для них нужно представлять совсем иначе, нежели чем вы это делаете.

Список стран это уже готовый html-код, а вот для городов нужно передавать клиенту js-обект, а из него средствами javascript готовить непосредственно список. Значения опшенов списка стран это ключи, под которыми js-обект содержит имена городов. Выбирает пользователь страну в первом списке, JavaScript по ключу выбирает информацию о городах этой страны, создает и выводит список.

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

Если я не понял, то объясните, для чего одинаковые по сути пары списков вам?

  Ответить  
 
 автор: *m*   (26.02.2011 в 15:22)   письмо автору
 
   для: sim5   (26.02.2011 в 13:34)
 

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

  Ответить  
 
 автор: sim5   (26.02.2011 в 15:43)   письмо автору
 
   для: *m*   (26.02.2011 в 15:22)
 

Так при таком подходе как у вас Страна-Город вам все равно придется "вываливать" большой список, вы же не делите их как "часть" городов одной страны, по крайней мере этого у вас не заметно, да и смысла нет в этом. Так что как ни крути, а вам требуется всего два списка.

Другое дело, если бы эти списки имели родителя - туристический маршрут, ему подчинены, вот тогода можно было бы последовательно все и выбирать. То есть три списка - в первом маршрут, второй страны этого маршрута, а третий города в этом маршруте.

И в этом случае обошлось бы тремя списками, не клонируя их для каждого выбора. Если требуется последовательно выбирать эти значения, занося их куда либо, то такую последовательность задать JS-сценарием и отследить ее не сложно будет.

  Ответить  
 
 автор: *m*   (27.02.2011 в 12:15)   письмо автору
 
   для: sim5   (26.02.2011 в 15:43)
 

))) все может и правильно Вы говорите, но как мне все же сделать, то что мне нужно?

  Ответить  
 
 автор: sim5   (27.02.2011 в 14:53)   письмо автору
 
   для: *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>

  Ответить  
 
 автор: *m*   (27.02.2011 в 20:13)   письмо автору
 
   для: sim5   (27.02.2011 в 14:53)
 

что не сработал у меня Ваш пример(
ладно, сейчас нужно хотя бы к чему то прийти, а как в приведенный мною пример, добавить еще несколько, выпадающих списков с продуктами? в моем случае странами. Например еще 2 дополнительных списка городов по выбранной стране, чтобы получилось:


Страна -> Город ->  Город  -> Город 

  Ответить  
 
 автор: sim5   (28.02.2011 в 01:07)   письмо автору
 
   для: *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>

  Ответить  
 
 автор: *m*   (28.02.2011 в 12:57)   письмо автору
 
   для: sim5   (28.02.2011 в 01:07)
 

А я и подключал в head библиотеку, у меня появлялась возможность выбрать из первого списка, после чего появлялся второй связный список, но когда я выбирал из второго списка он тут же пропадал.

А вот последний пример, работает, мне он в принципе подходит.
Такой вопрос, а можно будет динамически формировать списки, потому что, администратор может добавить новую страну или новые города для какой-нибудь страны, чтобы не приходилось, вручную править списки, нужно чтобы информация из БД подгружалась. Вот как в приведенном мною примере в самом начале, где в javascript в массив, помещаются имплоидом значения, из массива php. Здесь можно тем же образом поступить?

  Ответить  
 
 автор: sim5   (28.02.2011 в 13:43)   письмо автору
 
   для: *m*   (28.02.2011 в 12:57)
 

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

Так вы и будете формировать динамически, на сервере, правда не сами списки, а данные для них, как то id маршрутов и их названия (если конечно это у вас есть), выводя их в список (ul), id стран и городов, а также их имена, добавляя их в js-объекты. Только заметьте, что эти id маршрутов в элементах LI не прописаны непосредственно, а после буквы m, так как id элемента на странице не может начинаться с цифры. Извлечь цифры из этих id для передачи на сервер не сложно, с помощью рег выражения.
Вы же отдавая страницу пользователю делате выборку из базы, и она вернет все, что на данный момент в ней есть. Сформировали список маршрутов (ul), а вот данные для стран и городов помещаете в два объекта, по примерам указанным в этом примере. То есть, на сервере, в циклах вы формируете не выпадающие списки (select), а формируете эти объекты.
На клиенте будут сформированы списки отражающие текущее состояние в базе, вот и вся динамика. Если у вас задействован Ajax, то можно вообще не строить эти объекты, а получать с сервера запросом от клиента.

  Ответить  
 
 автор: *m*   (28.02.2011 в 15:55)   письмо автору
 
   для: sim5   (28.02.2011 в 13:43)
 

Отлично!) Ну я буду собирать в объекты потому что AJAX не знаю совсем, поэтому буду отталкиваться от вашего примера. Единственное, что у меня почему-то не попадают данные из селектов в массив $_POST. То есть я поместил ваш пример в форму, по кнопке отправить в $_POST попадает только сама кнопка.

  Ответить  
 
 автор: sim5   (28.02.2011 в 16:29)   письмо автору
 
   для: *m*   (28.02.2011 в 15:55)
 

Я же писал:
Нет в примере и фиксации выбранного пользователем, что тоже зависит от того, что вы планируете делать. А это может быть как формирование массива с последующей сериализацией для передачи его по url, так и формирование скрытых полей формы. И то и другое сделать не сложно.
То есть, нужно добавить к обработке событий onchange списков действия, по которым выбранные значения спика будут где-то фиксироваться. Если вы отправляете формой, то значит на jQuery же и добавляйте скрытые поля в эту форму, соответственно именуя их, и давая значения выбранные пользователем в списках. Еще лучше, по выбору в списках, создавать промежуточный массив, который будет обновляться по выбору, так как пользователь может изменить свое решение, что-то ранее выбранное изменить, либо вообще отказаться от какого либо выбора. В этом случае этот промежуточный массив можно легко отредактировать, и только перед отправкой формы добавить скрытые поля формы с его значениями. Для того чтобы пользователь мог отменить что либо из ранее выбранного, перед помещением значений массива в форму необходимо вывести результат выбора, в котором он может произвести необходимое.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования