Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   взаимосвязанные выпадающие списки (https://javascript.ru/forum/server/8632-vzaimosvyazannye-vypadayushhie-spiski.html)

xDMK 06.04.2010 11:28

взаимосвязанные выпадающие списки
 
У меня такая проблема: Я создал сайт с библиотеками smarty и php. У меня в php извлекается из бд несколько столбцов. В smarty сделан шаблон

<form action = "index.php?search=ok" method="POST" enctype="multipart/form-data">
<table border="0">
<tr>
<td>
<select name="ckod" id="select1">
<option value="0">Выберите страну</option>
{foreach from=$cod item=new}
{$new.id}<option value="{$new.id}" selected>{$new.countrycod}</option>
{/foreach}
</select>
</td>
<td>
<select id="select2" name="country" style="display:none;">
{foreach from=$codcontry item=new2}
{$new2.id}<option value="{$new2.cod_zone}">{$new2.cod_contry}</option>
{/foreach}

</select>
</td>
<td>
<select name="rkod" id="select3" style="display:none;">
{foreach from=$reg item=new1}
{$new1.id}<option value="{$new1.cod_def}">{$new1.cod_def}</option>
{/foreach}
</select>
</td>
Мне нужно чтобы при выборе одного элемента в первом списке выбиралась соответствующие элементы во втором. Типа как на сайтах знакомств при поиске и выборе страны, области и города. Появление самих списков и при выборе например России появлялись регионы России, а при выборе США появлялись списки регионов США. А при выборе регионов ещё список. Помогите! как это сделать ?

Gozar 06.04.2010 14:03

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

xDMK 06.04.2010 14:46

понимаете. фишка в том что у меня извлекается и бд Mysql. И я нашел динамические списки но там не рассматривается. Как мне брать элементы если их нету. Извлекаются из бд.

Gvozd 06.04.2010 15:40

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

xDMK 06.04.2010 23:20

Вы хотите сказать, что самое главное это клиентская часть а не бд. Тогда проблема то в том что, у меня все списки извлекаются из бд таблицы и как мне связать javascript и бд как например на сайтах знакомств. Я не понимаю этого

xDMK 06.04.2010 23:21

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

SkyLight 07.04.2010 11:24

Уважаемый, динамические списки уже далеко не новость, а часто используемая структура. Вам что, лень было поискать и почитать найденное? Материала-то куча, причем не где-нибудь, а прямо на первой странице выдачи.

xDMK 09.04.2010 11:33

я наверно не так описал ситуацию, понимаете у меня всё из базы выводить в эти списки и они должны появляться последовательно. когда выбираешь один из элементов. Например при выборе 1 должны имеено определенные числа( элементы обозначающие один в таблице) если их нету то загружается третий список и выбирается там соответствующие номеру один числа. и тд . Если не сложно вам помогите составить хотябы пример такого же. Я поглядел на пример со странами где выбираешь россию и загружается москва и тд города. но как мне реализовать с помощью бд. Если я извлек все данные тоесть 1, 2,3 соотвествуют своим элементам. тоесть 1 соответствует 920, 1 соответствует 930 и тд у меня так и идёт в одной таблице. Мне также с остальными, Что то похожее я нигде не видел там где вы сказали искать.

а Главное чтобы всё это было с помощью Jquery и ajax

SkyLight 09.04.2010 12:43

Ну так и подумайте, как, имея id из списка, получить с сервера связанные с ним данные. Пробуйте, если что-то не будет получаться - задавайте вопросы и приводите код. Если хотите готовый скрипт, то вам сюда.

walik 11.04.2010 10:57

Если я правильно понял - есть событие onchange.
Как только срабатывает событие, проверяешь что выбрал пользователь и отправляешь AJAX запрос на сервер для получения нового списка.

SkyLight 11.04.2010 10:59

Вот теперь надо, чтобы это понял топик-стартер

xDMK 11.04.2010 16:40

понимаете, у меня все списки из базы данных. нужно чтобы когда я выбрал из первого списка например единицу появлялся второй список со своим диапазоном из бд где этот диапазон элементов равен 1. и тд. так как у меня не известны числа.. Если бы знать как получить доступ к элументу одного из options можно было просто запрограммировать что и как выводить во втором списке и тд. Я не давно изучаю Jquery и тем более ajax поэтому и спрашиваю вас. Как мне это сделать ? Хотябы пример моего бы случая.

Gvozd 11.04.2010 16:49

ваш случай стандартен чуть менее чем полностью
для него есть куча примеров на всех возможный фреймворках, и чистом JS
даже в гугле, первой строкой по "javascript динамические списки" вылазит то, что вам нужно, только без ajax
читайте, повторяйте, учите, пробуйте
если что-то конкретное не будет получатся, то задавайте конкретные вопросы. на общий вам уже дали ответ
если у вас совсем нчиего не поулчается, то вам в раздел работа

xDMK 20.05.2010 17:55

ajaxcascade.php
$db = mysql_connect("localhost", "alloall", "12345");
mysql_select_db("alloall",$db);
 if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
if ($_GET['cod_country'] == 1) {
$a = mysql_query("SELECT id, cod_contry FROM alloall_code WHERE cod_zone=1");	

// Так как запрос возвращает несколько строк, применяем цикл
print "[";
while($b = mysql_fetch_array($a))
{
print "{value:\"".$b['id']."\",text:\"".$b['cod_contry']."\"}"; //создаем циклический список
}

print "]";
}
else {echo "mysql_error";
exit();
}
}


index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
<!--
.alloallru {
    font-family: Mistral;
    font-size: 40x;
    font-weight: bold;
}
-->
</style>

        <link href="tpl/templates/css/style.css" rel="stylesheet" type="text/css">

<script src="js/jquery-1.3.1.js" type="text/javascript"></script>

        <script type="text/javascript" src="tpl/templates/js/jquerykeypad.js"></script>


  <script type="text/javascript">




   
  (function($){
  // очищаем select
  $.fn.clearSelect = function() {
	  return this.each(function(){
		  if(this.tagName=='SELECT') {
		      this.options.length = 0;
		      $(this).attr('disabled','disabled');
		  }
	  });
  }
  // заполняем select
  $.fn.fillSelect = function(dataArray) {
	  return this.clearSelect().each(function(){
		  if(this.tagName=='SELECT') {
			  var currentSelect = this;
			  $.each(dataArray,function(index,data){
				  var option = new Option(data.text,data.value);
				  if($.support.cssFloat) {
					  currentSelect.add(option,null);
				  } else {
					  currentSelect.add(option);
				  }
			  });
		  }
	  });
  }
})(jQuery);                                  

</script>
<script type="text/javascript">
$(document).ready(function(){

  // выбор автомобиля
  function adjustAuto(){
  	var countryValue = $('#cod_country').val();
  	var tmpSelect = $('#cod_contry');
  	if(countryValue.length == 0) {
  		tmpSelect.attr('disabled','disabled');
  		tmpSelect.clearSelect();
  		adjustModel();
  	} else {
  		$.getJSON('ajaxcascade.php',{cod_country:countryValue},function(data) { tmpSelect.fillSelect(data).attr('disabled',''); adjustModel(); });
  		
  	}
  };
  // выбор модели
  function adjustModel(){
  	var countryValue = $('#cod_country').val();
  	var autoValue = $('#cod_contry').val();
  	var tmpSelect = $('#model');
  	if(countryValue.length == 0||autoValue.length == 0) {
  		tmpSelect.attr('disabled','disabled');
  		tmpSelect.clearSelect();
  	} else {
  		$.getJSON('cascadeSelectModel.php',{country:countryValue,auto:autoValue},function(data) { tmpSelect.fillSelect(data).attr('disabled',''); });
  	}
  };
	
  $('#cod_country').change(function(){
  	adjustAuto();
  }).change();
  $('#cod_contry').change(adjustModel);
  $('#model').change(function(){
  	if($(this).val().length != 0) { alert('Выбор сделан!'); }
  });

});
</script>
</head>
<body>

<h3 align="left">Введите номер для поиска</h3> 
<form action = "" method="POST" enctype="multipart/form-data"> 
 <table border="0">
 <tr>
 <td>

  <select id="cod_country">
    <option value="">Выбрать страну</option>
    <option value="1">Германия</option>
    <option value="2">Ю.Корея</option>
    <option value="3">Япония</option>
  </select>
  </div>
</td>
 <td>
<select id="cod_contry" name="cod_contry" disabled="disabled"></select>
 </td>
 <td>
<select  id="model" name="cod_def" disabled="disabled"></select>
</td>
<td width="100%">
<input type="text" name = "nkod" id="defaultKeypad">
<strong>@allo<span class="alloallru">all</span>.ru</strong>
<input type="submit" value="Поиск" name="submit">
</form>
</td>

</tr>
<tr>
<td><div id="div"></div></td>

</tr>
</table>

</body>
</html>


Покажите мне ошибку в этом коде? Я сижу не понимаю

Skipp 20.05.2010 17:55

Форматируй текст

xDMK 20.05.2010 22:46

но что форматировать.? мне нужно соединение с бд.. может кто поможет?

Gvozd 21.05.2010 00:13

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

xDMK 21.05.2010 10:49

Отформатировал код.. подскажите что нить?

SkyLight 21.05.2010 11:33

У вас создается массив объектов. А чем вы разделяете элементы? И вообще, есть функция json_encode, если что.

xDMK 21.05.2010 11:50

я как бы создал шаблон. И делаю его в цикле. А json encode нету. Пробывал по разному делать циклы и всё равно он понимает только своё. А переменные он не понимает.

SkyLight 21.05.2010 11:59

А вы начало моего сообщения принципиально не заметили? Посмотрите на текст json, который сгенерится после вашего цикла. Там ошибку и найдете.

xDMK 21.05.2010 12:10

всё вроде правильно..

if ($_GET['cod_country'] == 1) {
$db = mysql_connect("localhost", "alloall", "12345");
mysql_select_db("alloall",$db);	
	
$items=mysql_query('SELECT id, cod_contry FROM alloall_code WHERE cod_zone=1');	


print '[';
while ($a = mysql_fetch_array($items)); 
{
print "{value:\"".$a['id']."\",text:\"".$a['cod_contry']."\"},";

}
print ']';
}

не получается создать разделители... он вроде загружает но поле пустое.. хотя раньше вообще было disabled

SkyLight 21.05.2010 12:56

Вообще по правилам имена полей тоже должны быть в двойных кавычках. И зачем вы используете экранирование? Не проще ли внешние кавычки сделать одинарными? У вас же все равно подстановка не используется.

xDMK 21.05.2010 14:14

всё равно не работает.
print '{"value":'.$a['id'].'"text":'.$a['cod_contry'].'}';

SkyLight 21.05.2010 15:37

А вы каждый приведенный листинг здесь руками пишете или копируете из живого кода? Т.к. в каждом у вас ошибка и всегда разная.

Раз уж нельзя воспользоваться json_encode (с которым задача решылись бы в разы проще), придется по старинке:
$json = '';
while ($a = mysql_fetch_assoc($items)){
	$json .= ($json ? ',' : '') . '{"value" : "' . $a['id'] . '", "text" : "' . addslashes($a['cod_country']) . '"}';
}
if ($json)
	echo '[' . $json . ']';

xDMK 21.05.2010 16:21

вот что получилось в php
<?
header('Content-Type: text/html; charset=windows-1251');
 if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
$db = mysql_connect("localhost", "alloall", "12345");
mysql_select_db("alloall",$db);		 
	 
if ($_GET['cod_country'] == 1) {

	
$items=mysql_query('SELECT id, cod_contry FROM alloall_code WHERE cod_zone=1');	


$json = '';
while ($a = mysql_fetch_assoc($items)){
    $json .= ($json ? ',' : '') . '{"value" : "' . $a['id'] . '", "text" : "' . addslashes($a['cod_country']) . '"}';
}
if ($json) 
	    echo '[' . $json . ']';


 
?>

всё равно не работает.

SkyLight 21.05.2010 18:20

Не работает - это не ответ. Что именно не работает? Неправильный ответ сервера, отсутствие данных? И кстати, ответ по правилам должен быть на в windows-1251, а в UTF-8.

xDMK 21.05.2010 18:24

данные извлеклись тока самих данных нету. Тоесть появились пустые поля. и сколько их должно быть для данных.

SkyLight 21.05.2010 18:27

Ну тогда это уже сами ищите. Проверяйте правильность запроса и т.д.

xDMK 21.05.2010 18:33

всё заработало.. главное шаблон хоть есть.. остальное я попытаюсь сам сделать. А если я использую не Html Шаблон а .tpl
smarty. куда мне кидать файлы php рядом в этой же папке где .tpl? или лучше как то подругому сделать?

SkyLight 21.05.2010 20:07

Это вопрос уже совсем из другой оперы. Посмотрите как сделано подобное в распространенных cms, поищите статьи (не знаю, может и есть, сам не искал) или придумайте свое решение. Также может зависеть от конкретной задачи.

Gozar 21.05.2010 22:51

smarty must die :)

Kolyaj 22.05.2010 21:20

Цитата:

Сообщение от SkyLight
ответ по правилам должен быть на в windows-1251, а в UTF-8.

Нет таких правил.

SkyLight 22.05.2010 23:10

Правила неписанные, решает, конечно, каждый для себя. Но ИМХО лучше таки так.

Kolyaj 23.05.2010 13:26

Цитата:

Сообщение от SkyLight
Но ИМХО лучше таки так.

Лучше так, как лучше в конкретном случае. Не надо выдумывать правил на пустом месте.

SkyLight 23.05.2010 17:50

Значит я просто сам уже напутал - видать сказалось то, что мне давно не приходилось делать проекты не в юникоде...

xDMK 30.05.2010 01:06

мне нужно дописать ещё скрипт к тому что я уже здесь кидал... Чтобы не только был следующий список но и выводилось в <Div> страну..

Я думал аналогичным способом, но не получается...

function zone() {
	var countryValue = $('#cod_country').val();		
	var zoneValue = $('#zone');
	
		$.getJSON('ajaxcascadezone.php',{cod_country:countryValue},function(jsonObject){zoneValue.html("")});
		};

Mukhtar 11.11.2010 16:12

xDMK,
Добрый вечер...
У меня проблема как ваша, только я со смарти не работал вообще. Можно ваш код сюда выложить? А я вам вышлю код с загрузкой городов во второй селект через гетДЖСОН. Предлагаю бартер


Часовой пояс GMT +3, время: 00:50.