Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Снова про селекты (https://javascript.ru/forum/dom-window/66314-snova-pro-selekty.html)

veg 08.12.2016 04:53

Снова про селекты
 
Задумка такая:
В первом селекте - страны
Во втором - города
В третьем - филиалы
* При выборе значения из первого селекта, выскакивает второй( со значением по умолчанию столица страны) и третий(по умолчанию первый филиал из выборки по базе) - частично реализовал, не заполняется третий селект
* Если выбран пункт во втором селекте, но в этом городе нет филиалов, то третий селект - display:none;. Если перевыбрать город, естественно третий селект тоже обновляется.

Если выбрать московскую область, то во втором селекте сразу заполняется город - Москва, а третий селект так и пустует. Но если выбрать другой город, а потом снова Москва, то третий селект заполнится.
Как это работает сейчас: blogcode.ru/2.php

2.php
function get_country(){
	
	global $db;

	$query = "SELECT id, name FROM country";
	
	$res = mysqli_query($db, $query);
	
	return mysqli_fetch_all($res, MYSQLI_ASSOC);
}
?>
<script type="text/javascript" src="/js/ajax.js"></script>
<script type="text/javascript" src="/js/chained.js"></script>

<select required id="dhtmlgoodies_country" name="dhtmlgoodies_country" onchange="getCityList(this);dhtmlgoodies_city.style.display='block';dhtmlgoodies_drom.style.display='block'" placeholder="Выберите область" >
		
		<option value="" disabled selected style='display:none;'>Выберите область</option>
		
		<?php $res=get_country();
		
		foreach($res as  $key){?>
		
			<option value="<?php echo $key['id']; ?>"><?php echo $key['name']; ?></option>
		
		<?php } ?>
		
</select>
		
<select required style="display:none;" id="dhtmlgoodies_city" name="dhtmlgoodies_city" onchange="getDromList(this)">
		
</select>
		
<select style="display:none;" id="dhtmlgoodies_drom" name="dhtmlgoodies_drom">
		
</select>


chained.js
var ajax = new Array();

function getCityList(sel)
{
	var countryJS = sel.options[sel.selectedIndex].value;
	document.getElementById('dhtmlgoodies_city').options.length = 0;	// Empty city select box
	if(countryJS.length>0){
		var index = ajax.length;
		ajax[index] = new sack();
		
		ajax[index].requestFile = 'getcities.php?countryJS='+countryJS;	// Specifying which file to get
		ajax[index].onCompletion = function(){ createCities(index) };	// Specify function that will be executed after file has been found
		ajax[index].runAJAX();		// Execute AJAX function
	}
}

function createCities(index)
{
	var obj = document.getElementById('dhtmlgoodies_city');
	eval(ajax[index].response);	// Executing the response from Ajax as Javascript JS	
}


function getDromList(sel)
{
	var cityJS = sel.options[sel.selectedIndex].value;
	document.getElementById('dhtmlgoodies_drom').options.length = 0;	// Empty city select box
	if(cityJS.length>0){
		var index = ajax.length;
		ajax[index] = new sack();
		
		ajax[index].requestFile = 'getdrom.php?cityJS='+cityJS;	// Specifying which file to get
		ajax[index].onCompletion = function(){ createSubCategories(index) };	// Specify function that will be executed after file has been found
		ajax[index].runAJAX();		// Execute AJAX function
	}
}
function createSubCategories(index)
{
	var obj = document.getElementById('dhtmlgoodies_drom');
	eval(ajax[index].response);	// Executing the response from Ajax as Javascript JS	
}



getcities.php
if(isset($_GET['countryJS'])){
	
	mysqli_set_charset($db, 'utf8') or die("Can't set sharset");
	
	$query = "SELECT region, id, city FROM city where region =".$_GET['countryJS'];
	
	$res = mysqli_query($db, $query);
	
	$res =  mysqli_fetch_all($res, MYSQLI_ASSOC);
  
	foreach($res as $key){
		
		echo "obj.options[obj.options.length] = new Option('$key[city]','$key[id]');\n";
     
   }
   
}



getdrom.php
if(isset($_GET['cityJS'])){
	
	mysqli_set_charset($db, 'utf8') or die("Can't set sharset");
	
	$query = "SELECT city,name, id FROM drom where city =".$_GET['cityJS'];
	
	$res = mysqli_query($db, $query);
	
	$res =  mysqli_fetch_all($res, MYSQLI_ASSOC);
  
	foreach($res as $key){
		
		echo "obj.options[obj.options.length] = new Option('$key[name]','$key[id]');\n";
     
   }
   
}

Rise 08.12.2016 06:00

veg, тебе сюда Работа

veg 08.12.2016 06:06

Цитата:

Сообщение от Rise (Сообщение 437384)
veg, тебе сюда Работа

Нет, спасибо, я не ищу работу.

Столько кода выложил для полноты картины, а то начинается: "тут нет экстрасенсов" и прочее нытье и недовольство.

Сейчас это работает так blogcode.ru/2.php там всего то мелочь какая-то, я уверен в этом)

veg 08.12.2016 06:06

Цитата:

Сообщение от Rise (Сообщение 437384)
veg, тебе сюда Работа

Нет, спасибо, я не ищу работу.

Столько кода выложил для полноты картины, а то начинается: "тут нет экстрасенсов" и прочее нытье и недовольство.

Сейчас это работает так blogcode.ru/2.php там всего то мелочь какая-то, я уверен в этом)

laimas 08.12.2016 06:45

veg,
зачем для выбора в общем то "родственных" данных у вас три раздельных серверных файла, что требует и более сложного сценария на клиенте?

veg 08.12.2016 10:45

Цитата:

Сообщение от Rise (Сообщение 437384)
veg, тебе сюда Работа

Цитата:

Сообщение от laimas (Сообщение 437387)
veg,
зачем для выбора в общем то "родственных" данных у вас три раздельных серверных файла, что требует и более сложного сценария на клиенте?

каждый файл под конкретный селект

laimas 08.12.2016 12:38

Цитата:

Сообщение от veg
каждый файл под конкретный селект

А если предполагается с десяток списков, то и десять файлов под них? :)
Ну это же глупо, так как ваши списки есть связанные списки, которые в общем то можно хранить и в одной sql-таблице, а не в трех. Но даже если и в трех, то серверу достаточно одного сценария, чтобы выбрать значения для затребованного списка, и это он может запросто узнать из параметров запроса, который отправляет клиент, также одним сценарием, в котором же и строит списки по полученным данным.

veg 08.12.2016 13:20

Цитата:

А если предполагается с десяток списков, то и десять файлов под них?
Нет, не предполагается. Всего два нужно.

veg 08.12.2016 13:22

Добавил в getcities.

echo "obj.options[obj.options.length] = new Option('Выберите город','');\n";


Все работает. Как после выбора города, сделать этот option недоступным?

в html это выглядит так:
<option value="" disabled selected style='display:none;'>Выберите область</option>


а в первом коде как реализовать?

laimas 08.12.2016 14:30

Цитата:

Сообщение от veg
Нет, не предполагается. Всего два нужно.

И что, это аргумент плодить на каждый запрос/ответ которые практически не отличаются свой файл со сценарием?

veg 08.12.2016 15:12

Почему нет?

laimas 08.12.2016 15:42

Цитата:

Сообщение от veg
Почему нет?

Потому, что рациональности в этом ноль. Вы внимательно на код свой посмотрите, как на серверный, так и на клиентский, в каждом из них двойняшки, а зачем?

veg 08.12.2016 21:55

Да действительно, хорошим тоном это не назовешь.
В php то разберусь как сделать в один файл, а каким образом в клиентском коде сократить вдвое код?

laimas 09.12.2016 11:45

Цитата:

Сообщение от veg
В php то разберусь как сделать в один файл, а каким образом в клиентском коде сократить вдвое код?

Не в один файл, а в один скрипт обработчик, и тоже самое на клиенте. Ведь списки то связанные, а это означает, что при выборе в каждом из них справедливо правило - списки последующие за текущим очищаются, делается запрос данных для списка следующего за текущим (этот параметр определяет какое поле/таблица запрашивается), а если есть кеширование запросов на клиенте, то вместо запроса брать из кеша, если запрашиваемые данные есть в нем. И построение самого списка на клиенте одинаково для всех.

Чтобы и серверу было легче, уж коли связанные данные разнесены по разным таблицам, то хотя бы имена тождественных полей нужно делать одинаковыми, что важно для клиента (одни и те же имена свойств), либо отдавать данные как индексированный массив с одним и тем же расположением элементов в нем, то есть id, name, и т.д., а не отдавать с каждым запросом свой набор.

Вот собственно и все.

veg 10.12.2016 21:48

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

Rise 10.12.2016 23:14

veg, тебе пойдет не сомневайся)

laimas 11.12.2016 03:42

Цитата:

Сообщение от veg
Пока, что работает как есть и меня это устраивает и как адмниа и как пользователя.

Дык зачем тогда к примеру машину покупать, на телеге тоже можно, однако ...

veg 11.12.2016 11:14

Цитата:

Сообщение от laimas (Сообщение 437621)
Дык зачем тогда к примеру машину покупать, на телеге тоже можно, однако ...

Если песок перевозить с одного угла в другой, то и телеги многовато будет, достаточно и строительной тачки.

veg 11.12.2016 11:16

Цитата:

Сообщение от Rise (Сообщение 437614)
veg, тебе пойдет не сомневайся)

О кто вылез. Тебя тут как раз не хватало.

Rise 11.12.2016 11:30

veg, ты можешь и в карманах песок перетаскивать или во рту)))

laimas 11.12.2016 12:36

Цитата:

Сообщение от veg
Если песок перевозить с одного угла в другой, то и телеги многовато будет, достаточно и строительной тачки.

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

dimasti 27.12.2016 14:30

Да, привычки иногда могут управлять человеком. На востоке Москвы находится район Бибирево, а проспект Андропова юге и юго-востоке Москвы.


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