@KushnirMV
Начинающий разработчик

Как реализовать PHP код для создания взаимосвязанных списков типа "выберите категорию"-"выберите подкатегорию"-итд.?

Здравствуйте.

Задача :
Есть БД "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?
  • Вопрос задан
  • 360 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы