Каскадные выпадающие списки jQuery 


Каскадные выпадающие списки jQuery

Опубликовано

Введение

Каскадные выпадающие списки – это совокупность из множества списков, данные в которых связаны друг с другом, т.е. при выборе значения в одном списке, содержимое последовательно изменяются и в других. Ярким примером каскадных списков может служить выбор географического местоположения, т.е. последовательного выбора страны, региона, города. Или другой пример, выбор товара по категориям, который будет рассмотрен в статье.

Кратко реализацию инструмента “выбор товара по категориям” можно описать так. Входящая в состав библиотеки jQuery, функция $.ajax() обращается на сервер к подготовленному PHP сценарию, который запрашивает данные из MySQL, получает их и формирует в формате JSON, после передает обратно функции. На основе полученных данных динамически создаются каскадные списки с неограниченной вложенностью.

MYSQL

Все категории товара хранятся в одной таблице, под названием “categories”, ее структура:

Таблица categories

Запрос для создания таблицы:

CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Данные

Заполняя данными таблицу, корневым категориям необходимо установить значение parent = 0, для остальных категорий любой вложенности в значении parent будет указана id категории родителя.

Таблица с категориями

Корневые категории всегда имеют значение parent=0, все остальные категории могут быть как родительскими, так и дочерними. К примеру категория “DVD-плееры” (id=44), считается дочерней по отношению к категории “Домашняя аудио-, видео- техника” (id=36), поэтому категория “DVD-плееры” имеет значение (parent=36), но она также является родительской для нескольких категорий “Blur-ray-проигрыватели” (id=52), “DVD+VHS видеомагнитофоны” (id=53) и “Прочие DVD проигрыватели” (id=58) и т.д.

HTML

В теле документа поместите блок с уникальным ID=selectBox. В данный блок будут помещаться элементы каскадных выпадающих списков select, которые будет генерировать jQuery скрипт рассмотренный ниже. А также блок, где будет отображаться служебная информация ID=selectBoxInfo.

<div id="selectBox"></div>
<div id="selectBoxInfo"></div>

PHP

Создайте файл и поместите в него следующий php сценарий, задача которого запрашивать из базы категории по указанному параметру `parent`=idcategory. Данные, которые генерирует сценарий, используются для формирования выпадающего меню select

<?
header('Content-Type: text/html; charset=utf-8');
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
 $idcategory=intval($_GET["idcategory"]);
 $sql="
  SELECT `id`,`name`
  FROM `categories` 
  WHERE `parent`='{$idcategory}'
  ORDER BY `name`
 ";
 
 $db = mysql_connect($DBhost, $DBuser, $DBpass);
 mysql_select_db($DBName);
 mysql_query("SET NAMES UTF8");
 
 $result = mysql_query($sql);
 mysql_close($db);
 
 //Формирование строки данных в формате JSON
 $return="";
 while ($row = mysql_fetch_array($result,MYSQL_BOTH)){
  $return.="{value:'{$row["id"]}', caption:'{$row["name"]}'} ,";
 }
 //Исключение запятой стоящей в конце строки
 $return=substr($return,0,(strlen($return)-1));
 $return="[{$return}]";
 
 print $return;
}
?>

Переменная $return формирует строку с данными в формате JSON:

[{
{value:"1",caption:"Аудио, видео техника"},
{value:"3",caption:"Бытовая техника для дома"},
….
{value:"10",caption:"Компьютерная техника и ПО"}
}]

jQuery

Рассмотрим jQuery скрипт, задача которого с помощью функции $.ajax() запросить у сервера данные, а затем создать и заполнить выпадающий список.

Разместите в заголовке документа или создайте отдельный скриптовой js файл и поместите в него следующее сценарий:

<script type="text/javascript">
$(function(){

 //Первоначальная загрузка корневых категорий
 getCategory(0);

});

function getCategory(idcategory){
 $.ajax({
  url:"getCategory.php",
  cache:false,
  data:{idcategory:idcategory},
  success:function(data){

   //Создание объекта формата JSON
   var optionsObj=eval( "("+data+")" );

   //Проверка на непустой объект
   if (!$.isEmptyObject(optionsObj)){

    //Создание элемента select
    $("#selectBox").append("<select size='15'></select>");

    //Ссылка на созданный select
    var select=$("#selectBox select:last");

    //Итерация объекта optionsObj, с последующим наполнение элемента select опциями 
    $.each(optionsObj, function(i, val) {
     select.append("<option value='"+ val.value +"'>"+ val.caption +"</option>");
    });

    // События для созданного select
    select.change(function(){

     //Удаление последующих категорий
     $(this).nextAll().remove();

     //Зацикливание
     getCategory($(this).val())
    });

   }else{
    //Информирует пользователя если подкатегорий, для выбранной категории не существует
    $("#selectBoxInfo").html("Подкатегорий, для выбранной категории не существует").
    fadeIn(1500,function(){
     $(this).fadeOut(1500);
    });
   }
  }
 });
}
</script>