ProDomainer.ru - Клуб Домейнеров

ProDomainer.ru - Клуб Домейнеров (http://prodomainer.ru/forum/index.php)
-   Скрипты (http://prodomainer.ru/forum/forumdisplay.php?f=85)
-   -   Java Script Как сохранить выбор в select списке, сгенерированным JS? (http://prodomainer.ru/forum/showthread.php?t=3338)

UFO 08.07.2014 01:52

Как сохранить выбор в select списке, сгенерированным JS?
 
Есть скрипт, который имеет список городов в файле, разделенных по регионам. Этот список представлят из себя многомерный массив на PHP. Например:

Код:

$city = array (

'Регион' => array (
1 => 'Город1',
2 => 'Город2',
),

);

У скрипта есть два select'а - для городов и регионов:

Код:

<select name="region" onchange="loadCity(this)">
    <option></option>
         
            <?php
            // заполняем список регионов
            foreach ($city as $region => $cityList)
            {
        // вывод списка регионов
                echo '<option value="' . $region . '" ';
        // если вдруг выведенный регион совпадает с выбранным ранее в запросе, то отмечаем его
        if ($region == $_POST['region']) echo "selected";
        // закрывающий HTML блок простого вывода списка регионов
        echo '>' . $region . '</option>' . "\n";
            }
            ?>
           
        </select>
 
<select name="city" disabled="disabled">
    <option>Выберите город</option>
</select>

При выборе области, сработает функция loadCity, которая подгрузит список городов, вот она:

Код:

function loadCity(select)
{
    var citySelect = $('select[name="city"]');
 
    // посылаем AJAX запрос, который вернёт список городов для выбранной области
    $.getJSON('index.php', {action:'getCity', region:select.value}, function(cityList){
        citySelect.html(''); // очищаем список городов
 
        // заполняем список городов новыми пришедшими данными
        $.each(cityList, function(i){
            citySelect.append('<option value="' + i + '">' + this + '</option>');
        });
    });
}


Ну и PHP скрипт который отдаст в JSON формате список городов конкретной области:

Код:

<?php // файл index.php
 
require_once('city.php');
 
if (isset($_GET['action']) && $_GET['action'] == 'getCity')
{
    if (isset($city[$_GET['region']]))
    {
        echo json_encode($city[$_GET['region']]); // возвращаем данные в JSON формате;
    }
    else
    {
        echo json_encode(array('Выберите область'));
    }
 
    exit;
}
 
?>

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

Вопрос: как сохранить в списке не только регион, но и выбранный город (т.е. проблема в select name="city")?

Mendel 08.07.2014 18:02

Антон, покажи код в сборе. Мне кажется что проблема не в том что ты описал, а в другом твоем коде. Используй http://jsfiddle.net/ или что-то вроде.

Александр 09.07.2014 17:44

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

Решение говно конечно, но работать будет )

Шуранов 02.08.2014 18:26

Цитата:

echo json_encode($city[$_GET['region']]); // возвращаем данные в JSON формате;
Всегда, млять, любил такие комментарии. Ни хрена по сути, абы оставить коммент, чтобы никто не сказал, что код недокументированный.
echo "Hello"; //Пишем в стандартый output текст в кавычках.

Mendel 02.08.2014 21:41

кто-то плохо помнит что такое json_encode.
А так не самая лапша. сити.пхп создает массив сити из которого невалидированной гет-перименной достаем инфу и выводим ее в жсоне. Логично всё но говнокод и вырванный из контекста :)
т.е. я хочу сказать что коммент то понятно зачем оставили но без остального разобраться сложно.

Шуранов 03.08.2014 09:18

Макс, тебе не кажется, что человек, который даже ни разу не видел языка, из названия "json_encode" сразу догадается, что это сборка в формат JSON?

Mendel 03.08.2014 18:25

После того как Обама ввел цензуру в России - мне уже ничего не кажется.

Александр 04.08.2014 17:56

отакот

UFO 05.08.2014 18:09

Ну и старую же вы тему подняли, уже все давно исправлено:

Код:

<select name="city"
<?php // продолжение вывода select'а в случае, если город еще не выбран
// город не был выбран? т.е. возможно мы еще и регион не выбрали
if (!isset($_POST['city'])) {
// выключаем опцию выбора города, идите сначала регион выберите
echo "disabled=\"disabled\">";
// и выведем заглушку на тему того, что город то не выбран
echo "<option>Выберите город</option>";
// иначе - если город выбран, то НЕ блокируем выбор города
} else {
// т.е. закрываем тег select'а
echo ">";
// добавим опцию - это просто слово-заглушка, если региона нет
if ($_POST['region']=="null") { echo "<option value=\"no_city\">Выберите город</option>"; }
// узнаем из формы регион
$region = $_POST['region'];
// создадим переменную для массива
$tempmass = array();
// часть многомерного массива (массив городов из выбранного пользователем региона) поместим во временный массив
$tempmass = $city["$region"];
// сколько городов во временном массиве - выбранном регионе?
$allcity = count($tempmass);
// узнаем ID первого города из региона, для этого переберем все города
foreach($tempmass as $key => $value) {
// где key - индексы массива, а value - сами значения
$FirstIndex = $tempmass[$key]; // тоже значение (первое) массива
break;
// прервем выполнение на первом же элементе, т.к. нам нужен первый
} // скобка от переборки временного массива в цикле

// сколько всего в абсолютных числах городов в массиве по ID
$itogo = $key + $allcity;
// сделаем переборку от первого элемента до последнего, который является суммой кол-ва элементов и ID первого
for ($key; $key < $itogo; $key++)
{
// выводим нужную пачку городов выбранного региона:
echo "<option value=\"".$key."\" ";
// если город совпал с тем, что выбрал пользователь, то отметим его (город)
if ($cityid == $key) echo "selected";
// вывод самого города из многомерного массива
echo ">".$city[$region][$key]."</option>";
} // скобка от цикла for вывода значений
} // скобка от случая, когда пользователем уже выбран город
// далее в любом случае закрываем второй селектор
?>
</select>


Шуранов 07.08.2014 11:39

UFO, троллить знатно научился? У меня чуть пукан не взорвался от таких комментариев. *aaa*

Добавлено через 38 минут
Дошло, это первый в мире акын-программист! :az:

demon 07.08.2014 13:23

а мне теперь наконец-то все понятно.
5 за проделанную работу! :)

Александр 07.08.2014 16:24

да, код без подсветки синтаксиса – адик

UFO 08.08.2014 20:31

Цитата:

Сообщение от Шуранов (Сообщение 60640)
У меня чуть пукан не взорвался от таких комментариев.

На всякий случай, вдруг потом код дадут на рефакторинг шимпанзе.

Цитата:

Сообщение от Александр (Сообщение 60658)
да, код без подсветки синтаксиса – адик

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

demon 08.08.2014 22:03

Цитата:

Сообщение от UFO (Сообщение 60729)
Вячеслав этого не любит, но я-то кодю для шимпанзе.

а я сначала подумал, что это ты так Славу мартышкой обозвал :D

UFO 10.08.2014 14:13

Цитата:

Сообщение от demon (Сообщение 60730)
а я сначала подумал, что это ты так Славу мартышкой обозвал

Он же вроде украинец, а Шампанзе - кажется, грузинская фамилия?..

Шуранов 10.08.2014 16:52

Шампан-дзе. Это грузинская фамилия.


Часовой пояс GMT +4, время: 13:11.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot