|
|
|
| Вопрос: Прошу мне подсказать, как, на примере библиотеки Д.Котерова "JsHttpRequest" можно построить выпадающие списки, что бы добираться до последней вложенности.
Имеем: стандартную труктуру MySql таблицы:
id | parent | name
Имеем 3 файла, с помощью которых можно обойти дерево каталога двойной вложенности:
Файл select.php (в нём строим список корневых категорий ):
<?
// подключаем необходимые данные для коннекта к БД
require_once("config.php");
?>
<!--подключем библиотеку -->
<script src="JsHttpRequest.js"></script>
<!-- функция, которая отправит значение выбранного элемента из select name="root" -->
<script>
function doload(value)
{
var req=new JsHttpRequest();
req.onreadystatechange=function()
{
if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;
}
req.open(null,"select2.php",true);
req.send({root_category:value});
}
</script>
<form action="select3.php" method="POST">
<select name="root" onchange="doload(this.value);">
<option value="no" selected>Выберите категорию</option>
<?
// Достаем корневые элементы нашего дерева, т.е. элементы с parent = 0
$query = mysql_query("SELECT * FROM cat WHERE parent = 0");
while($category = mysql_fetch_array($query)) echo "<option value=\"".$category['id']."\">".$category['name']."</option>";
?>
</select>
<br>
<!-- слой, в который попадут данные, отданные из БД -->
<div id="result"></div>
<br>
<input type="submit" value="Отправить">
</form>
|
Файл select2.php (достаём вложенные подкатегории):
<?
// подключаем необходимые данные для коннекта к БД
require_once("config.php");
//Подключаем библиотеку
require("JsHttpRequest.php");
//Создаем экземпляр
$JsHttpRequest=new JsHttpRequest("windows-1251");
// если была передана переменная, то достаем элементы, у которых parent = $_POST['root']
// и стоим список с элементами 2-го уровня
if (is_numeric(@$_POST['root']))
{
$sub_cat = "<select name=sub_cat>";
$query = mysql_query("SELECT * FROM cat WHERE parent = '".$_POST['root']."'");
while($category = mysql_fetch_array($query))
{
$sub_cat .= "<option value=\"".$category['id']."\">".$category['name']."</option>";
}
$sub_cat .= "</select>";
// Отправляем в наш слой то, что получилось
echo ($sub_cat) ? $sub_cat : "";
}
?>
|
Файл select3.php (смотрим, что получилось):
<?
echo "<PRE>";
print_r ($_POST);
?>
|
Прошу помочь осуществить "проход" до последней вложенности с помощью динамически подгружаемых списков.
Заранее благодарен... | |
|
|
|
|
|
|
|
для: provodnik
(08.04.2008 в 00:42)
| | Крайне не хотелось поднимать тему искусственно, но вопрос встатёт всё острее.
Просьба актуальна... | |
|
|
|
|
|
|
|
для: provodnik
(08.04.2008 в 00:42)
| | У меня почему-то не работает твой скрипт :( Я только поменял название таблиц и пусть к config-файлу :( Но при выборе значения в первом скрике не появляется второй :( | |
|
|
|
|
|
|
|
для: DEM
(16.04.2008 в 00:25)
| | Попробуй сделать так, может поулчться (коненчо ен чоень красиво, но вроде должно работать)
<?
// подключаем необходимые данные для коннекта к БД
include_once "config.php";
//Подключаем библиотеку
require("JsHttpRequest.php");
//Создаем экземпляр
$JsHttpRequest=new JsHttpRequest("windows-1251");
// если была передана переменная, то достаем элементы, у которых parent = $_POST['root']
// и стоим список с элементами 2-го уровня
if (is_numeric(@$_POST['root']))
{
$sub_cat = "<select name=sub_cat>";
$query = mysql_query("SELECT * FROM cat WHERE parent='".$_POST['root']."'");
$a = array();
$i = 0;
while($category = mysql_fetch_array($query))
{
$sub_cat .= "<option value=\"".$category['id']."\">".$category['name']."</option>";
$query2 = mysql_query("SELECT * FROM cat WHERE parent='".$category['id']."'");
$a[$i] = "<select name='sub_sub_cat".$i."'>";
while($arr = mysql_fetch_array($query2))
{
$a[$i] .= "<option value=\"".$arr['id']."\">".$arr['name']."</option>";
}
$a[$i] .= "</select>";
$i++;
}
$sub_cat .= "</select>";
for($i2=0;$i2<count($a);$i2++)
{
echo $a[$i2];
}
// Отправляем в наш слой то, что получилось
echo ($sub_cat) ? $sub_cat : "";
}
?>
|
| |
|
|
|
|
|
|
|
для: DEM
(16.04.2008 в 00:25)
| | Делаете рекурсивный обход вашего каталога от корня вниз (ко вложенным разделам).
Вот такая функция делает селект со всеми вложеными разделами любой вложенности и визуально разделенными уровнями.
Замените названия полей и таблиц БД на свои.
<?php
build_cat_select(0, 0);
function build_cat_select($parent_id, $cat){
if ( $parent_id == 0 ) print "<option value=0> </option>";
static $spacers = 0;
$result = mysql_query("SELECT categoryID, name FROM `SS_categories` WHERE parent = '$parent_id' ORDER BY name");
while ($row = mysql_fetch_row($result)){
print "<option value=$row[0]>";
for ($i=0; $i<$spacers; $i++) print " ";
print "$row[1]</option>\n";
if ( has_child($row[0]) ){
$spacers+=3;
build_cat_select($row[0], $cat);
}
}
$spacers-=3;
}
function has_child($parent_id){
$result = mysql_query("SELECT categoryID, name FROM `SS_categories` WHERE parent = '$parent_id' ORDER BY name");
return mysql_num_rows($result);
}
?>
|
P.S.
Естественно, нужно обрамить выводимые options внутрь select'a. | |
|
|
|
|
|
|
|
для: Хулиган
(16.04.2008 в 10:30)
| | г-н Хулиган, Вы меня не совсем поняли.
У меня не вызывает затруднение обход дерева категорий на PHP. Да и притом, у меня проще для этого функция, чем привели Вы ;)
У меня затруднения с AJAX. Можно конечно заранее выбрать всё содержимое БД, и на JS строить эти списки, но этот вариант не подходит, т.к. в каталоге не одна тысяча позиций...
Требуется сделать универсальный вывод, не зависимо от вложенности каталога, но что бы селекты подгружались именно динамически, используя AJAX... | |
|
|
|
|
|
|
|
для: provodnik
(16.04.2008 в 19:49)
| | > У меня не вызывает затруднение обход дерева категорий на PHP
> что бы селекты подгружались именно динамически, используя AJAX...
Тогда не понятно, в чём проблема? Если вы можете пойти любую ветку вашего дерева, что мешает в процессе обхода заполнять ассоциативный массив значениями из БД? А на другом конце получить эти значения в массиве responseJS и на их основе сделать селект?
Или проблема в динамическом построении селекта из полученных данных?
Или проблема в передаче через ajax начальных данных для php-скрипта?
Или проблема в том, как заставить php-скрипт выдавать данные начиная с интересующего узла?
Вы бы сформулировали задачу более внятно... | |
|
|
|
|
|
|
|
для: provodnik
(08.04.2008 в 00:42)
| | Возможно это _http://phpclub.ru/faq/Tree/DemoPrintDynamic?show_comments=1 , вам каким нибуть образом поможет. | |
|
|
|
|
|
|
|
для: mikha
(17.04.2008 в 13:31)
| | mikha, спасибо за пример, но там что-то больно наворочено всё. Мой случай гораздо проще...
Хулиган - проблемы во всём, что связано с JS.
А особенно проблемы такие:
Допустим я "спустился" до 4-й вложенности и у меня уже построено 4 "селекта". И если изменить самый первый селект, то новые значения подгружаются только во второй. А в третьем и четвертом селекте остаются висеть старые данные.
Или, что еще не понятнее - как только добавляю событие onchange=\"doload(this.value);\" к селекту второго уровня, в остальных куда-то теряется значение, которое уже было выбрано.
Будьте любезны, помогите с этим вопросом. Я просто не особо понимаю - то ли мне селекты генерить в PHP, то ли необходимо еще какую-то функцию на JS дописать. Вообще логики не наблюдаю.
Я попробовал сделать нечто из кода, приведенного г-ном DEM, но опять ничего не получилось. Точнее что-то работает, а что-то нет.
Посмотрите пожалуйста. Листинги файлов (кроме select2.php) и БД в поём первом посте этой темы.
А файл select2.php немного преобразован (замучен ;) ):
<?
require_once("admin/config.php");
//Подключаем библиотеку
require("JsHttpRequest.php");
//Создаем экземпляр класса, указывая рабочую кодировку.
$JsHttpRequest=new JsHttpRequest("windows-1251");
// если было что-то выбрано в первом селекте, выводим второй
if (is_numeric(@$_POST['root']))
{
$sub_cat = "<select name=sub_cat><option value=no selected>Выберите категорию</option>";
$query = mysql_query("SELECT * FROM cat WHERE parent='".$_POST['root']."'");
$a = array();
while($category = mysql_fetch_array($query))
{
$sub_cat .= "<option value=\"".$category['id']."\">".$category['name']."</option>";
// ищем детей для этого $category['id']
$query2 = mysql_query("SELECT * FROM cat WHERE parent='".$category['id']."'");
// если есть что-то, генерим массивы с селектами
if (mysql_num_rows($query2))
{
$i = 0;
$a[$i] = "<br /><select name='sub_sub_cat".$i."' onchange=\"doload(this.value);\">
<option value=no selected>Выберите категорию</option>";
while($arr = mysql_fetch_array($query2))$a[$i] .= "<option value=\"".$arr['id']."\">".$arr['name']."</option>";
$a[$i] .= "</select>";
$i++;
}
}
$sub_cat .= "</select>";
// Отправляем в наш слой селект второго уровня
echo ($sub_cat) ? $sub_cat : "";
// и если еще что-то есть, тоже шлём
for( $i2 = 0; $i2 < count($a); $i2++ ) echo ($a[$i2]) ? $a[$i2]."<br />" : ""; //echo $a[$i2];
}
?>
|
Очень буду признателен за помощь. | |
|
|
|