Здравствуйте.
Задача :
Есть БД "catalog" в которой перечислены все категории, подкатегории, подподкатегории и тд. (всего 4 уровня вложенности)
связаны они как id , parent, title
Необходимо сделать взаимосвязанные списки, что бы при выборе категории в первом списке, во втором выводились его подкатегории, потом при выборе подкатегории во втором списке выводились подкатегории этой подкатегории
на данный момент функцию обработки я реализовал таким образом:
</select>
</li>
<li >
<label>Подкатегория 1</label>
<select name="first_subcategory" id="first_subcategory" size="1" disabled>
<option value="0" >-Выберите подкатегорию товара-</option>
</select>
</li>
<li >
<label>Подкатегория 2</label>
<select name="duble_subcategory" id="duble_subcategory" size="1" disabled>
<option value="" >-Выберите подкатегорию товара-</option>
</select>
</li>
<li >
<label>Подкатегория 3</label>
<select name="three_subcategory" id="three_subcategory" size="1" disabled>
<option value="" >-Выберите подкатегорию товара-</option>
</select>
</li>
<li >
<label>Подкатегория 4</label>
<select name="four_subcategory" id="four_subcategory" size="1" disabled>
<option value="" >-Выберите подкатегорию товара-</option>
</select>
</li>
Сначала идет обработка через javascript
$( '#group_category' ).change(function () {
// При изменении значения первого списка мы должны удалить
// все имеющиеся значения во втором и третьем, а также
// сделать их неактивными
$( '#first_subcategory, #duble_subcategory, #three_subcategory, #four_subcategory' ).find( 'option:not(:first)' ) // Ищем все теги option, не являющиеся тегом по умолчанию
.remove() // Удаляем эти теги
// Чтобы сделать поля неактивными, неправильно менять значение атрибута disabled
// Теперь нам нужно изменять значение свойства disabled объектов полей списка,
// так как мы работаем с ними через библиотеку jQuery
.end() // Возвращаемся к исходному объекту
.prop( 'disabled',true ); // Делаем поля неактивными
// Сохраним выбранное значение списка в переменную
var first_id = $( this ).val();
// Если выбрано значение по умолчанию, ничего не делаем
if (first_id == 0) { return; }
// В ином случае нам необходимо отправить запрос на сервер
// AJAX-запрос к серверу мы выполним, используя метод jQuery ajax()
$.ajax({
type: "POST", // Тип запроса
url: "./include/querycat.php", // Путь к сценарию, обработающему запрос
dataType: "json", // Тип данных, в которых сервер должен прислать ответ
data: "query=getFirst&first_id=" + first_id, // Строка POST-запроса
error: function () { // Обработчик, который будет запущен в случае неудачного запроса
alert( "При выполнении запроса произошла ошибка :(" ); // Сообщение о неудачном запросе
},
success: function ( data ) { // Обработчик, который будет запущен после успешного запроса
// В ответ на наш запрос сервер должен прислать массив значений
// Мы его вставим в поле второго списка с помощью цикла for
for ( var i = 0; i < data.length; i++ ) {
// Каждое полученное значение вставим в список видов транспорта
$( '#first_subcategory' ).append( '<option value="' + data[i].kind_id + '">' + data[i].kind + '</option>' );
}
// После того, как мы сформировали список, мы можем сделать его активным
// обратившись к его свойству disabled
$( '#first_subcategory' ).prop( 'disabled', false ); // Включаем поле
}
});
});
это обработчик который посылает значение подкатегории
$firsts = array(
1 => array(
// Наземный транспорт
1 => 'Железнодорожный транспорт',
2 => 'Автомобильный транспорт',
3 => 'Ручной транспорт'
),
2 => array(
// Водный транспорт
1 => 'Речной транспорт',
2 => 'Морской транспорт',
3 => 'Подводный транспорт'
),
3 => array(
// Воздушный транспорт
1 => 'Самолеты',
2 => 'Вертолеты',
3 => 'Ракета (шаттл)'
)
);
$kinds = array(
// Наземный транспорт
1 => array(
// Железнодорожный транспорт
1 => array(
1 => 'Электропоезд',
2 => 'Дизельный поезд',
3 => 'Дрезина'
),
// Автомобильный транспорт
2 => array(
1 => 'Легковой автомобиль',
2 => 'Грузовой автомобиль',
3 => 'Автобус'
),
// Ручной транспорт
3 => array(
1 => 'Тачка',
2 => 'Тележка',
3 => 'Велосипед'
)
),
// Водный транспорт
2 => array(
// Речной транспорт
1 => array(
1 => 'Трамвай',
2 => 'Теплоход',
3 => 'Ракета'
),
// Морской транспорт
2 => array(
1 => 'Крейсер',
2 => 'Круизный лайнер',
3 => 'Баржа'
),
// Подводный транспорт
3 => array(
1 => 'Подводная лодка',
2 => 'Батискаф',
3 => 'Капсула смерти'
)
),
// Воздушный транспорт
3 => array(
// Самолет
1 => array(
1 => 'Боинг',
2 => 'Аэробус',
3 => 'Руслан'
),
// Вертолеты
2 => array(
1 => 'МИ',
2 => 'Апач',
3 => 'Черная акула'
),
// Ракета (шаттл)
3 => array(
1 => 'Союз',
2 => 'Апполон',
3 => 'Дискавери',
4 => 'Буран'
)
)
);
// Проверяем наличие переменной, которая укажет данному сценарию какие именно данные нужны
if (!isset($_POST['query']) || !$_POST['query']) {
exit("Нет данных определяющих тип запроса");
}
else {
// Сохраняем строку запроса данных в отдельной переменной
$query = trim($_POST['query']); // Очищаем от лишних пробелов
// Определяем тип запроса
switch($query) {
case 'getFirst': // Запрос на получение 1ой подкатегории
// Сохраним в переменную значение выбранного типа
$first_id = trim($_POST['first_id']); // Очистим его от лишних пробелов
// Формируем массив с ответом
$result = NULL;
$i = 0;
foreach ($firsts[$first_id] as $kind_id => $kind) {
$result[$i]['kind_id'] = $kind_id;
$result[$i]['kind'] = $kind;
$i++;
}
break;
case 'getCategories': // Запрос на получение видов транспорта
// Сохраним в переменные значения выбранных типа транспорта и вида транспорта
$type_id = trim($_POST['type_id']); // Очистим их от лишних пробелов
$kind_id = trim($_POST['kind_id']);
// Формируем массив с ответом
$result = NULL;
$i = 0;
foreach ($kinds[$type_id][$kind_id] as $category_id => $category) {
$result[$i]['category_id'] = $category_id;
$result[$i]['category'] = $category;
$i++;
}
break;
default:
// Если данные не определены
$result = NULL;
break;
}
}
// Преобразуем данные в формат json, чтобы их смог обработать JavaScript-сценарий, приславший запрос
echo json_encode($result);
И в чём собственно вопрос,
на данный момент, массивы с подкатегориями заданы "статичными" ,
то-есть предопределены и не привязаны к Базе Данных
как вывести такой массив циклом из БД, учитывая его структуру id, parent?