Досить часто на сайтах зустрічаються дані, які можна візуально представити у вигляді структури дерева. Дерево по своїй структурі передбачає залежність одних підлеглих елементів, від інших, кореневих. Іноді на формах потрібно зробити залежні списки, говорячи простою мовою, це коли значення одного списку залежать від вибраного значення іншого. Для наочності розглянемо приклад, як можна зробити такі списки вибору.

Завдання така, на формі повинні бути присутніми два випадаючих списків. Перший з них буде містити марки автомобілів, другий буде змінюватися динамічно за допомогою Ajax запитів, тим самим отримуючи дані з конкретної моделі.

Створимо три файлу: cars.php, form.php, ajax.php.
У файлі cars.php будуть зберігатися дані у вигляді масиву, цей файл нам знадобиться для підключення до двох інших файлів. Файл form.php містить форму зі списками, a ajax.php буде обробляти Ajax-запити, надіслані з форми.

Файл cars.php:

array(
0 => ‘1-series’,
1 => ‘2-series’,
2 => ‘3-series’,
// …
),
‘Mercedes-Benz’ => array(
0 => ‘A-клас’,
1 => ‘B-клас’,
2 => ‘C-клас’,
// …
),
// і т. д.
);
?>

Ключі масиву – це моделі автомобілів в нашому уявленні, вкладені масиви – серії для конкретних моделей.

Файл form.php:

Модель
$series){
echo ” . $model . “. “\n”;
}
?>
Виберіть модель
function loadCar(select){
var carSelect = $(‘select[name=”series”]’);
$.getJSON(‘ajax.php’, {
action:’getModels’,
model:select.value
}, function(seriesList){
carSelect.html(“);
$.each(seriesList, function(i){
carSelect.append(” + this + “);
});
});
}

Для роботи з формою ми будемо використовувати фреймворк JQuery, який слід підключати перед самою формою. Перший список містить обробник події OnChange, він ініціалізує код для запиту даних для другого списку.

Файл ajax.php:

Файл, як раніше вже говорилося, буде відповідати на Ajax-запитів, і повертати результат у форматі Json.
Приклад і исходники

UPD: В продовження теми: як реалізувати 3 залежних списку?

Додав: htmaker, 10.10.2014 р.
(1 голосів, середній: 5,00 з 5)

Завантаження…

Діліться з друзями:

См. також:


Мета тег robots, приклади використання
Рубрика: Html, CSS, Javascript, SEO

Stimed – задаємо CSS-стилі по часу
Рубрика: Html, CSS, Javascript

Небезпека використання атрибуту target=”_blank”
Рубрика: Html, CSS, Javascript, Інф. безпека

Нескінченна анімація обертання на CSS
Рубрика: Html, CSS, Javascript

Анімація обертання при наведенні курсору
Рубрика: Html, CSS, Javascript

Стилізація виділення номера телефону до мобільних браузерах
Рубрика: Html, CSS, Javascript

Список вибору на JQuery
Рубрика: Html, CSS, Javascript

Фіксований заголовок таблиці HTML
Рубрика: Html, CSS, Javascript

Ефекти кнопок для сайту
Рубрика: Html, CSS, Javascript

Коментарі

  • Валентин пише:
    23.03.2015 у 02:44

    Добрий день! Підкажіть, як реалізувати 3 залежних списку. Третій від другого, другий від першого: 1.Марка 2.Модель 3.Модифікація моделі.

    Спасибі!

    Відповісти

  • htmaker пише:
    23.03.2015 в 15:21

    Добрий день. Додав посилання на другий пост в кінці статті.

    Відповісти

  • юрій пише:
    24.03.2015 у 21:10

    Для файлу form.php я приробив форму, метод post. Для прийому створив файл b.php. Замість моделей я зробив області і пов’язав їх з містами. В результаті файл b.php отримує область і номер міста, а не саме місто. Я не знаю яваскрипт, тому підкажіть як отримувати місто, а не його номер.

    Відповісти

  • htmaker пише:
    24.03.2015 у 21:26

    наприклад у нас змінні:
    $_POST[‘model’] в ній значення ‘BMW’;
    $_POST[‘series’] в ній значення 2;

    // підключаємо файл з даними
    require_once(‘cars.php’);

    // а значення елемента масиву отримуємо так
    echo $arModels[$_POST[‘model’]][$_POST[‘series’]]; // результат ‘3-series’

    Відповісти

  • Nts пише:
    23.04.2015 у 17:01

    Доброго дня. Теж цікавить питання що вище.. Ніяк не можу робити так, щоб замість замість номера отримати назву серії в option value=» «. Код взяв у Вас, підкажіть будь ласка де дописати ту сходинку яка допоможе?

    Відповісти

  • htmaker пише:
    23.04.2015 в 23:24

    Здрастуйте, для цього в js функції loadCar() потрібно підправити
    carSelect.append(” + this + “);

    Відповісти

  • Ольга пише:
    04.05.2015 в 08:50

    Добрий день!
    Дякую за статтю, дуже допомогло реалізувати.
    Все працює, все класно, крім одного маленького нюансу.
    Списки темизированы з допомогою плагіна core-ui-select
    Плагін завантажується з завантаженням сторінки, списки красиві. Але після вибору в першому списку, другий перевантажується з аяксу, та гарний дизайн скидається, а оскільки сторінка не перевантажується, то плагін та не підключається знову, і список виходить потворним.
    Підкажіть, що і де потрібно прописати, щоб плагін знову підвантажуються після аякс-перезавантаження?
    Приклад тут: zaphub.ru (фільтр по моделям авто).

    Відповісти

  • htmaker пише:
    07.05.2015 у 08:25

    Добрий день. Можна спробувати викликати

    $(‘select’).coreUISelect();

    після того як список, створений за допомогою Ajax.

    Відповісти

  • Олександр пише:
    30.11.2015 в 15:26

    Добрий день. Підкажіть як зробити, щоб ці дані видобувалися з бд. В моєму випадку є 2 таблиці з товаром (одяг) і размеры_цвета. Необхідно, щоб при виборі кольору, також видобувалися розміри (від вибору кольору). Спасибі!

    Відповісти

  • htmaker пише:
    01.12.2015 в 11:34

    Добрий день. Не могли б ви описати структуру таблиць в базі

    Відповісти

  • Олександр пише:
    01.12.2015 у 20:57

    таблиця stuff:
    id
    title
    price
    brand
    datetime
    type_tovara //тут записується, наприклад футболка з type (category)

    таблиця category:
    cat_id
    type
    brand

    таблиця colosize:
    cs_id
    cs_product_id //тут записується id тавара
    cs_size
    cs_color

    приклад заповнення для останньої таблиці 3 останніх стовпців
    3
    M
    Червоний

    3
    S
    Зелений

    3
    S
    Синій

    4
    1
    S
    Помаранчевий

    1
    S
    Коричневий

    1
    M
    Коричневий

    1
    xxl
    Коричневий

    1
    l
    Жовтий

    А додаються розміри і кольору — через товар (вибираємо товар, id передається методом get, через 2 inputa пишемо вручну розмір і колір)

    Відповісти

  • htmaker пише:
    01.12.2015 в 22:15

    Отже, вважаю потрібна таблиця colosize, а конкретніше наступні поля:
    cs_product_id // id товару
    cs_size // розмір
    cs_color // колір

    Для товару нам належить первинно дізнатися список доступних кольорів.
    1. Вибір списку доступних кольорів товару. В якості змінної спочатку у нас є ID_товара. Робимо вибірку квітів з таблиці:
    SELECT DISTINCT cs_color FROM colosize WHERE cs_product_id = ‘ID_товара’
    Команда DISTINCT — фільтрує повторювані у вибірці запису, таким чином, список записів буде унікальним.

    2. Другий запит увазі що у нас є вже 2 змінні це: ‘ID_товара’ і ‘значение_цвета’, які передаються за допомогою ajax-запиту. Вибираємо доступні розміри товару згідно з обраним кольором:
    SELECT cs_size FROM colosize WHERE cs_product_id = ‘ID_товара’ AND cs_color = ‘значение_цвета’

    Як в першому так і в другому випадку результат передаєте у форматі json.

    Відповісти

  • Олександр пише:
    01.12.2015 в 22:30

    Мене також цікавить як отримати ці дані і записати їх в масив?

    Відповісти

  • htmaker пише:
    01.12.2015 в 22:35

    Як ви працюєте з базою даних в своєму проекті? Опишіть ваші методи роботи з базою.

    Відповісти

  • Олександр пише:
    01.12.2015 у 22:44

    $result1 = mysql_query(“SELECT * FROM stuff WHERE id=’$id’ “, $link);
    if (mysql_num_rows($result1) > 0)
    {
    $row1 = mysql_fetch_array($result1);

    do
    {
    // виводиться вся інформація про товар c картинками
    echo “Виберіть колір і розмір”;
    echo “”;
    $result7 = mysql_query(“SELECT * FROM colosize WHERE cs_product_id=’$id’ ORDER BY cs_color”, $link);

    if (mysql_num_rows($result7) > 0)
    {
    $row = mysql_fetch_array($result7);
    do
    {
    echo ‘

    ‘.$row[“cs_color”].’ – ‘.$row[“cs_size”].’

    ‘;
    }
    while ($row = mysql_fetch_array($result7));
    }
    echo “”;
    }
    }
    while ($row1 = mysql_fetch_array($result1));

    Відповісти

  • htmaker пише:
    01.12.2015 в 23:05
    $arResult = array();
    if (isset($_GET[‘id’]) && isset($_GET[‘color’])){
    // наводимо переданий id до типу int
    $id = (int)$_GET[‘id’];
    // переводимо всі зайві символи в html сутності
    $color = htmlspecialchars($_GET[‘color’],ENT_QUOTES);
    // виконуємо запит
    $res = mysql_query(“SELECT cs_size
    FROM colosize
    WHERE cs_product_id = ‘$id’
    AND cs_color = ‘”.mysql_escape_string($color).”‘”, $link);
    if ($res){
    if (mysql_num_rows($res) > 0){
    while($arr = mysql_fetch_assoc($res)){
    $arResult[] = $arr;
    }
    }
    }
    }
    // віддаємо результат
    echo json_encode($arResult);
    Відповісти

  • Олександр пише:
    01.12.2015 в 23:28

    Все зрозумів. І таке ще питання (трохи не по темі): У мене після вибору товару передаються дані (а саме тільки один id кошик, яка також додається до бд: її структура — cart_id, cart_id_product,cart_price,cart_count,cart_datetime,cart_ip ). Звернення йде через посилання з класом add-cart і додаткових атрибутів — tid=”‘.$row1[“product_id”].’ Ніяких форм немає, потім з’явиться вибір кольору/розміру. Необхідно, щоб в цю таблицю додавався cs_id через посилання. Два javascripta :

    $(‘.add-cart’).click(function(){
    alert(‘Товар доданий в корзину.’);

    var tid = $(this).attr(“tid”);

    $.ajax({
    type: “POST”,
    url: “include/addtocart.php”,
    data: “id=”+tid,
    dataType: “html”,
    cache: false,
    success: function(data) {
    loadcart();
    }
    });

    });

    function loadcart(){
    $.ajax({
    type: “POST”,
    url: “include/loadcart.php”,
    dataType: “html”,
    cache: false,
    success: function(data) {

    if (data == “0”)
    {
    $(“#block-basket > a”).html(“Корзина порожня”);
    }
    else
    {
    $(“#block-basket > a”).html(data);
    }
    }
    });
    }

    addtocart:
    $id = $_POST[“id”];

    $result = mysql_query(“SELECT * FROM cart WHERE cart_ip = ‘{$_SERVER[‘REMOTE_ADDR’]}’ AND cart_id_product = ‘$id'”, $link);
    if (mysql_num_rows($result) > 0)
    {
    $row = mysql_fetch_array($result);
    $new_count = $row[“cart_count”] + 1;
    $update = mysql_query (“UPDATE cart SET cart_count=’$new_count’ WHERE cart_ip = ‘{$_SERVER[‘REMOTE_ADDR’]}’ AND cart_id_products =’$id'”, $link);
    }
    else
    {
    $result = mysql_query(“SELECT * FROM tovarWHERE product_id = ‘$id'”, $link);
    $row = mysql_fetch_array($result);

    mysql_query(“INSERT INTO cart(cart_id_products,cart_price,cart_datetime,cart_ip)
    VALUES(
    ‘”.$row[‘product_id’].”‘,
    ‘”.$row[‘price’].”‘,
    NOW(),
    ‘”.$_SERVER[‘REMOTE_ADDR’].”‘
    )”, $link);
    }
    }

    Необхідно, щоб передалося cs_id в кошик

  • Олександр пише:
    02.12.2015 в 00:46

    а в цьому рядку (data: “id=”+tid, що пишеться?

  • htmaker пише:
    02.12.2015 в 00:23

    Додайте при вибірці розмірів з таблиці colosize, ще одне поле cs_id.
    Тобто ви вибрали колір, ajax до вас буде повертатися масив з cs_id і cs_size.

    Формуєте з цих даних такий список:

    cs_size

    При додаванні в кошик так само як і параметр tid, відправляєте cs_id
    var cs_id = $(“#size”).val();

    Відповісти

  • htmaker пише:
    02.12.2015 в 01:02

    Замість

    data: “id=”+tid,

    Слід вказати

    data: {
    id: tid,
    csid: cs_id
    },
    Відповісти

  • Олександр пише:
    02.12.2015 в 01:14

    Я, звичайно Вас замордував), але трохи не виходить. Подивіться якщо я загружу лістинги? Можна через зворотний зв’язок?

    Відповісти

  • Ігор пише:
    10.04.2017 у 21:11

    Хлопці підкажіть будь ласка як ці файли додати в звичайний html нічого не виходить…

    Відповісти