Досить часто на сайтах зустрічаються дані, які можна візуально представити у вигляді структури дерева. Дерево по своїй структурі передбачає залежність одних підлеглих елементів, від інших, кореневих. Іноді на формах потрібно зробити залежні списки, говорячи простою мовою, це коли значення одного списку залежать від вибраного значення іншого. Для наочності розглянемо приклад, як можна зробити такі списки вибору.
Завдання така, на формі повинні бути присутніми два випадаючих списків. Перший з них буде містити марки автомобілів, другий буде змінюватися динамічно за допомогою 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.Модифікація моделі.
Спасибі!
Відповісти
23.03.2015 в 15:21
Добрий день. Додав посилання на другий пост в кінці статті.
Відповісти
24.03.2015 у 21:10
Для файлу form.php я приробив форму, метод post. Для прийому створив файл b.php. Замість моделей я зробив області і пов’язав їх з містами. В результаті файл b.php отримує область і номер міста, а не саме місто. Я не знаю яваскрипт, тому підкажіть як отримувати місто, а не його номер.
Відповісти
24.03.2015 у 21:26
наприклад у нас змінні:
$_POST[‘model’] в ній значення ‘BMW’;
$_POST[‘series’] в ній значення 2;
// підключаємо файл з даними
require_once(‘cars.php’);
// а значення елемента масиву отримуємо так
echo $arModels[$_POST[‘model’]][$_POST[‘series’]]; // результат ‘3-series’
Відповісти
23.04.2015 у 17:01
Доброго дня. Теж цікавить питання що вище.. Ніяк не можу робити так, щоб замість замість номера отримати назву серії в option value=» «. Код взяв у Вас, підкажіть будь ласка де дописати ту сходинку яка допоможе?
Відповісти
23.04.2015 в 23:24
Здрастуйте, для цього в js функції loadCar() потрібно підправити
carSelect.append(” + this + “);
Відповісти
04.05.2015 в 08:50
Добрий день!
Дякую за статтю, дуже допомогло реалізувати.
Все працює, все класно, крім одного маленького нюансу.
Списки темизированы з допомогою плагіна core-ui-select
Плагін завантажується з завантаженням сторінки, списки красиві. Але після вибору в першому списку, другий перевантажується з аяксу, та гарний дизайн скидається, а оскільки сторінка не перевантажується, то плагін та не підключається знову, і список виходить потворним.
Підкажіть, що і де потрібно прописати, щоб плагін знову підвантажуються після аякс-перезавантаження?
Приклад тут: zaphub.ru (фільтр по моделям авто).
Відповісти
07.05.2015 у 08:25
Добрий день. Можна спробувати викликати
$(‘select’).coreUISelect();
після того як список, створений за допомогою Ajax.
Відповісти
30.11.2015 в 15:26
Добрий день. Підкажіть як зробити, щоб ці дані видобувалися з бд. В моєму випадку є 2 таблиці з товаром (одяг) і размеры_цвета. Необхідно, щоб при виборі кольору, також видобувалися розміри (від вибору кольору). Спасибі!
Відповісти
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 пишемо вручну розмір і колір)
Відповісти
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
Мене також цікавить як отримати ці дані і записати їх в масив?
Відповісти
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));
Відповісти
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, що пишеться?
02.12.2015 в 00:23
Додайте при вибірці розмірів з таблиці colosize, ще одне поле cs_id.
Тобто ви вибрали колір, ajax до вас буде повертатися масив з cs_id і cs_size.
Формуєте з цих даних такий список:
cs_size
…
При додаванні в кошик так само як і параметр tid, відправляєте cs_id
var cs_id = $(“#size”).val();
Відповісти
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 нічого не виходить…
Відповісти