X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> каскад динамических списков произвольной длины
Сергей Краснов
Сергей Краснов
Topic Starter сообщение 4.3.2011, 10:18; Ответить: Сергей Краснов
Сообщение #1


Помогите пожалуйста разобраться.

Есть вот такой код

файл test.htm
[JS]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link href="style/search.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="jquery-1.3.1.js"></script>
<title>Tutotial: jQuery, Ajax, PHP - создание каскада динамических списков</title>

<script type="text/javascript">
(function($){
/* Очищаем select */
$.fn.clearSelect = function() {
return this.each(function(){
/* Проверяем является ли элемент select`ом */
if(this.tagName=='SELECT') {
this.options.length = 0;
/* Блокируем на время заполнения */
$(this).attr('disabled','disabled');
}
});
}

/* Удаляем старшие элементы */
$.fn.clearField = function(selector) {
/**
* Ищем все элементы следующие за вызывавшим
* и удовлеторяющие переданному селектору
*/
this.nextAll(selector).remove();
return this;
}

/* Заполняем select переданными данными */
$.fn.fillSelect = function(dataArray) {
return this.clearSelect().each(function(){
/* Проверяем является ли элемент select`ом */
if(this.tagName=='SELECT') {
var currentSelect = this;
/* Добавляем пунтк меню "Выбрать..." */
var start = new Option('Выбрать...', '-1');
/* Устанавливаем этот option первым в списке */
if($.support.cssFloat) {
currentSelect.add(start,null);
} else {
currentSelect.add(start);
}
$.each(dataArray,function(index,data){
/* Если определено 'name' */
if(data.name) {
/* Создаем новый option */
var option = new Option(data.name,data.id);
/* Добавляем новый option к select`у */
if($.support.cssFloat) {
currentSelect.add(option,null);
} else {
currentSelect.add(option);
}
}
});
/* Выделяем первый элемент списка */
$(this).removeAttr('disabled').find('option:first').attr('selected', 'selected');
}
});
}
})(jQuery);

/* Функция отсылает ajax-запрос */
function getCategory(pcategory, level) {

$.ajax({
url: 'ajax/list.php',
type: 'post',
data: 'pcategory='+ pcategory +'&level='+ level,
dataType: 'JSON',

beforeSend: function(){
// Блокируем все необходимы select`ы
$('select[name^=category_]').attr('disabled', 'disabled');
},
complete: function(){ // Снимаем блокировку
$('select[name^=category_]').removeAttr('disabled');
},
success: function(response){
var data = eval('(' + response +')');
// Если количество категорий в ответе 0 либо не определено
if(data.count === 'undefined' || data.count == 0) {
// просто удаляет старшие уровни каскада
$('select[name=category_'+ (data.level - 1) +']')
.clearField('select[name^=category]')
.clearField('span');
return false;
}
if( $('select[name=category_'+ data.level +']').length ) {
// Если select этого уровня уже существует
// мы должны удалить все старшие select`ы,
// очистить старые данные и заполнить новым контентом
$('select[name=category_'+ data.level +']')
.clearField('select[name^=category]')
.clearField('span')
.fillSelect(data.item);
} else {
// Если select этого уровня не существует,
// мы должны его создать и заполнить данными
$('#categories select:last').after('<span>&gt;</span> <select name="category_'+ data.level +'"></select>');
$('select[name=category_'+ data.level +']').fillSelect(data.item);
}

/* Сбрасываем старый обработчик */
$('select[name=category_'+ data.level +']').unbind('change');
/* Вешаем новый */
$('select[name=category_'+ data.level +']').change(function(){ return clickEvent($(this)); });
return false;
},
error: function(){
// Сообщаем пользователю, что произошла ошибка
$('#msg').append('<p>Some error with categories. Please, try later ;)</p>');
return false;}
});
}

/* Добавляем обработчик событий при изменении пункта списка */
function clickEvent(select)
{
var id = select.find('option:selected').attr('value');
/**
* Если id=-1, значит выбран пункт "Выбор.."
* значит мы должны просто очистить старшие списки
*/
if (id == '-1') {
select.clearField('select[name^=category]').clearField('span');
return false;
}

var level = parseInt(select.attr('name').replace('category_', '')) + 1;
return getCategory(id, level);
}

$(document).ready(function(){
/* Развешиваем обработчики */
//$('select[name^=category] option').live("click", function(){
// var select = $(this).parents('select');
// var level = parseInt(select.attr('name').replace('category_', '')) + 1;
// return getCategory(select.find('option:selected').attr('value'), level);
//})

/* Получаем список категорий */
getCategory(0, 0);
});
</script>
</head>
<body>
<div id="wrapper">
<h1>Пример динамического каскада списков:</h1>

<div id="searchQuery">

<form name="search" action="" method="post">
<table width="973" bgcolor="#f2f2f2" border="0" cellpadding="5" cellspacing="5">
<tbody>
<tr>
<td width="218">&nbsp;</td>
<td width="735" align="right">Обрезанная форма для поиска :)</td>
</tr>
<tr>
<td><div align="right">
<div align="right">Категория:</div>
</div></td>
<td id="categories">
<select name="category_0">

</select>
</td>
</tr>
</tbody>
</table>
</form>
<p>&nbsp;</p>
</div>
<div id="msg">
<h1>Сообщения о возможных ошибках: </h1>
</div>
</body>
<html>[/JS]

и файл который выполняет ajax запрос

[PHP]<?
$dblocation = "localhost";
$dbuser = "wm27247_wm27247";
$dbpasswd = "z2ECiA12OlmpVXp";
$dbname="wm27247_trade";

//Подключение к базе данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) // Если дескриптор равен 0 соединение не установлено
{
echo("<p>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</p>");
exit();
}

if (!@mysql_select_db($dbname, $dbcnx))
{
echo( "<p>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</p>" );
exit();
}
?>
<?php

/**
* @project: SelectTutorial
* @file: ajax/list.php
* @author Alex Kachayev <kachayev@gmail.com>
* /
* @version: 1.0.0000
*
* Returns categories list from array
* This is only example for learning
* jQuery and Ajax
*/

/* Если это не AJAX.. умираем :) */
if( $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest')
die( 'Request Error!' );

/**
* @var array Здесь содержаться названия категорий:
* [идентификатор категории] => 'название'
* @todo Это только учебный пример, в реальной
* ситуации вы скорее всего воспользуетесь
* для этого базой данных или XML файлом
*/


$sql = mysql_query('SELECT * FROM jos_adsmanager_categories');
$categories = array();
$levels = array();
while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
{

$categories[$row['id']] = $row['name'];
$levels[$row['id']] = $row['parent'];
}



/**
* Получаем значение параметров из запроса
* либо устанавливаем значения по умолчанию
*/
$pcategory = isset($_POST['pcategory']) ? $_POST['pcategory'] : 0;
$level = isset($_POST['level']) ? $_POST['level'] : 0;

/**
* @var array Результирующий список категорий
* [item] => Массив категорий
* [id] => Идентификатор
* [name] => Название
* [count] => Количество категорий
* [level] => Уровень каскада
*/
$list = array();
/**
* @var array Промежуточный массив идентификаторов категорий
*/
$result = array();

/**
* Получаем идентификаторы нужных нам категорий
* @see http://www.php.net/array_keys
*/
foreach( array_keys($levels, $pcategory) as $value)
$result[] = array('id'=>$value, 'name'=>$categories[$value]);

/* Заносим категории в результирующий массив */
if(count($result))
$list['item'] = $result;

/* Указываем дополнительные параметры */
$list['count'] = count($result);
$list['level'] = $level;

/* Явно указываем формат данных */
header('Content-type: application/json');

/**
* Преобразуем в массив в JSON
* @see http://www.php.net/json_encode
*/
echo json_encode($list);

?>[/PHP]

В итоге при работе этого кода должны получится динамические селекты.
Но селект получается пустым, появляется только надпись выбрать.

Но если массивы
$categories = array();
$levels = array();

заполнить вот таким образом

$categories = array(
'x0' => 'Компьютерная техника', 'x1' => 'Персональные компьютеры',
'x2' => 'Windows', 'x3' => 'Athlon', 'x4' => 'Celeron',
'x5' => 'Pentium', 'x6' => 'Macintosh', 'x7' => 'Прочее',
'x8' => 'Ноутбуки', 'x9' => 'КПК', 'x10' => 'Периферийные устройства',
's0' => 'Бытовая техника', 's1' => 'Аудио-аппаратура',
's2' => 'Фотоаппараты', 's3' => 'Микроклиматическое оборудование',
's4' => 'Вентиляторы', 's5' => 'Кондиционеры', 's6' => 'Оконные',
's7' => 'Навесные', 's8' => 'Обогреватели', 'k0' => 'Офисное оборудование',
'k1' => 'Копировальная техника', 'k2' => 'Факсы'
);

/**
* @var array В этом массиве мы храним идентификаторы
* родительских категорий. '0' означает, что
* категория не имеет родительской
* @see $categories
*/
$levels = array(
'x0' => '0', 'x1' => 'x0',
'x2' => 'x1', 'x3' => 'x2', 'x4' => 'x2',
'x5' => 'x2', 'x6' => 'x1', 'x7' => 'x1',
'x8' => 'x0', 'x9' => 'x0', 'x10' => 'x0',
's0' => '0', 's1' => 's0',
's2' => 's0', 's3' => 's0',
's4' => 's3', 's5' => 's3', 's6' => 's5',
's7' => 's5', 's8' => 's0', 'k0' => '0',
'k1' => 'k0', 'k2' => 'k0'
);

то все работает прекрасно.

Так вот может быть я к базе делаю не правильный зарос и не правильно заполняю массивы или неправильно передаю данные.

Помогите пожалуйста второй день бьюсь.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Парсинг аудитории instagram. Фильтрация списков
Соберу лучшую аудиторию в инстаграмм
13 prolisk 9066 28.12.2016, 0:32
автор: prolisk
Открытая тема (нет новых ответов) Проблема с меню в виде списков
5 CraDy 5900 8.7.2013, 5:42
автор: -Struggle-
Открытая тема (нет новых ответов) Настройка расположения проигрывателя vkontakte с помощью списков и таблиц..
0 projger 2869 29.11.2012, 15:39
автор: -projger-
Горячая тема (нет новых ответов) Новый каскад фильтров для поднятия ТИЦ
30 merlin 9260 10.9.2010, 22:40
автор: merlin


 



RSS Текстовая версия Сейчас: 23.4.2024, 23:42
Дизайн