Снова select`ы

123 4
veleg
На сайте с 30.01.2011
Offline
142
2028

Задумка такая:

В первом селекте - страны

Во втором - города

В третьем - филиалы

* При выборе значения из первого селекта, выскакивает второй( со значением по умолчанию столица страны) и третий(по умолчанию первый филиал из выборки по базе) - частично реализовал, не заполняется третий селект

* Если выбран пункт во втором селекте, но в этом городе нет филиалов, то третий селект - 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 countryCode = sel.options[sel.selectedIndex].value;
document.getElementById('dhtmlgoodies_city').options.length = 0; // Empty city select box
if(countryCode.length>0){
var index = ajax.length;
ajax[index] = new sack();

ajax[index].requestFile = 'getcities.php?countryCode='+countryCode; // 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 code
}


function getDromList(sel)
{
var cityCode = sel.options[sel.selectedIndex].value;
document.getElementById('dhtmlgoodies_drom').options.length = 0; // Empty city select box
if(cityCode.length>0){
var index = ajax.length;
ajax[index] = new sack();

ajax[index].requestFile = 'getdrom.php?cityCode='+cityCode; // 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 code
}

getcities.php

if(isset($_GET['countryCode'])){

mysqli_set_charset($db, 'utf8') or die("Can't set sharset");

$query = "SELECT region, id, city FROM city where region =".$_GET['countryCode'];

$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['cityCode'])){

mysqli_set_charset($db, 'utf8') or die("Can't set sharset");

$query = "SELECT city,name, id FROM drom where city =".$_GET['cityCode'];

$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";

}

}
Фигачу Телеграм-ботов ( https://teleg.run/veleg )
S3
На сайте с 29.03.2012
Offline
362
#1

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

veleg
На сайте с 30.01.2011
Offline
142
#2
Sly32:
первый элемент селекта - на него onchange не срабатывает видимо, поэтому и не подгружаются дальше значения

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

S3
На сайте с 29.03.2012
Offline
362
#3

veleg,

onchange() срабатывает же при СМЕНЕ селекта.

вот смотрите. Вы нажали выбор в первом селекте. сработал JS и подгрузил 2-й селект. Но он у вас по умолчанию загрузился. Третий же селект опять работает по событию onchange() А его нет! Но как только вы перевыбрали во втором селекте значение - все норм, функция сработала. Проверяйте логику работы скрипта. При изменении первого селекта должен запускаться 2-й и 3-ий а не только второй

veleg
На сайте с 30.01.2011
Offline
142
#4

Я вас понял, спасибо.

В какую сторону смотреть, у меня знания js на интуитивном уровне.

Добавил в getcities.

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

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

в html это выглядит так:

<option value="" disabled selected style='display:none;'>Выберите область</option>

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

L
На сайте с 10.02.2015
Offline
256
#5

Для начала:

PHP - отдельно

HTML - отдельно

А то даже нет желания парсить ваш поток сознания.

veleg
На сайте с 30.01.2011
Offline
142
#6
livetv:
Для начала:
PHP - отдельно
HTML - отдельно

А то даже нет желания парсить ваш поток сознания.

Окей.

Как вот это

<option value="" disabled selected style='display:none;'>Выберите область</option>

Изобразить в таком виде:

echo "obj.options[obj.options.length] = new Option('Выберите город','');\n";
S
На сайте с 30.09.2016
Offline
469
#7
veleg:
Как после выбора города, сделать этот option недоступным

Удалить его нафиг.

1) определяете глобальную переменную, например var city;

2) при выборе области задаёте ей значение city=0;

3) на второй select вешаете onchange="delfirst(this)"

Сама функция:

function delfirst(sel){

if(city==0){
sel.options[0]=null;
city=1}
}
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
veleg
На сайте с 30.01.2011
Offline
142
#8

Да не.

Все устраивает.

Единственное - как скрыть(

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

И как скрыть третий селект если филиалов в городе нет?

S
На сайте с 30.09.2016
Offline
469
#9
veleg:
Единственное - как скрыть

А я и предлагаю

Удалить его нафиг.
Вы просто внимательнее прочитайте.

А скрыть третий селект - может быть, добавить одну строчку в функцию?

function createSubCategories(index)

{
var obj = document.getElementById('dhtmlgoodies_drom');
eval(ajax[index].response); // Executing the response from Ajax as Javascript code
if(obj.options.length == 0){dhtmlgoodies_drom.style.display='none'}
}
Только зачем изначально включать в список город, где ничего нет?
veleg
На сайте с 30.01.2011
Offline
142
#10
Sitealert:
Только зачем изначально включать в список город, где ничего нет?

Тут такая картина.

Городов около 1500

В каждом из них есть по 3-8 фирм.

Базы по этим фирмам не существует.

Допустим директор одной из фирм, которая находится в Благовещенске захотел добавить событие. Мол вот проводим мероприятие. Он все заполняет и выбирает город.

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

С JS не сильно, поэтому интуитивно все вставил. city = 0; походу точно неправильно.

Первый селект

<select required id="dhtmlgoodies_country" name="dhtmlgoodies_country" onchange="getCityList(this);dhtmlgoodies_city.style.display='block';city=0;" placeholder="Выберите область" >

Второй селект

<select required style="display:none;" id="dhtmlgoodies_city" name="dhtmlgoodies_city" onchange="delfirst(this);getDromList(this);delfirst(this);">

</select>

Это убрал

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

Это сделал

function delfirst(sel){
var city;
if(city==0){
sel.options[0]=null;
city=1}
}

Работает так http://blogcode.ru/2.php

Выбираю область, Москва высвечивается по умолчанию, третий селект не хочет появляться.

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий