Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Динамический селект + Ajax + каталог неограниченной вложенности
 
 автор: provodnik   (08.04.2008 в 00:42)   письмо автору
 
 

Вопрос: Прошу мне подсказать, как, на примере библиотеки Д.Котерова "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   (15.04.2008 в 16:48)   письмо автору
 
   для: provodnik   (08.04.2008 в 00:42)
 

Крайне не хотелось поднимать тему искусственно, но вопрос встатёт всё острее.
Просьба актуальна...

   
 
 автор: DEM   (16.04.2008 в 00:25)   письмо автору
 
   для: provodnik   (08.04.2008 в 00:42)
 

У меня почему-то не работает твой скрипт :( Я только поменял название таблиц и пусть к config-файлу :( Но при выборе значения в первом скрике не появляется второй :(

   
 
 автор: DEM   (16.04.2008 в 00:30)   письмо автору
 
   для: 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 "";
}
?>

   
 
 автор: Хулиган   (16.04.2008 в 10:30)   письмо автору
 
   для: DEM   (16.04.2008 в 00:25)
 

Делаете рекурсивный обход вашего каталога от корня вниз (ко вложенным разделам).
Вот такая функция делает селект со всеми вложеными разделами любой вложенности и визуально разделенными уровнями.

Замените названия полей и таблиц БД на свои.

  
<?php
        build_cat_select
(00);
      
        function 
build_cat_select($parent_id$cat){
            if ( 
$parent_id == ) 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 "&nbsp;&nbsp;";
                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.

   
 
 автор: provodnik   (16.04.2008 в 19:49)   письмо автору
 
   для: Хулиган   (16.04.2008 в 10:30)
 

г-н Хулиган, Вы меня не совсем поняли.
У меня не вызывает затруднение обход дерева категорий на PHP. Да и притом, у меня проще для этого функция, чем привели Вы ;)
У меня затруднения с AJAX. Можно конечно заранее выбрать всё содержимое БД, и на JS строить эти списки, но этот вариант не подходит, т.к. в каталоге не одна тысяча позиций...

Требуется сделать универсальный вывод, не зависимо от вложенности каталога, но что бы селекты подгружались именно динамически, используя AJAX...

   
 
 автор: Хулиган   (16.04.2008 в 20:40)   письмо автору
 
   для: provodnik   (16.04.2008 в 19:49)
 

> У меня не вызывает затруднение обход дерева категорий на PHP

> что бы селекты подгружались именно динамически, используя AJAX...

Тогда не понятно, в чём проблема? Если вы можете пойти любую ветку вашего дерева, что мешает в процессе обхода заполнять ассоциативный массив значениями из БД? А на другом конце получить эти значения в массиве responseJS и на их основе сделать селект?

Или проблема в динамическом построении селекта из полученных данных?
Или проблема в передаче через ajax начальных данных для php-скрипта?
Или проблема в том, как заставить php-скрипт выдавать данные начиная с интересующего узла?

Вы бы сформулировали задачу более внятно...

   
 
 автор: mikha   (17.04.2008 в 13:31)   письмо автору
 
   для: provodnik   (08.04.2008 в 00:42)
 

Возможно это _http://phpclub.ru/faq/Tree/DemoPrintDynamic?show_comments=1 , вам каким нибуть образом поможет.

   
 
 автор: provodnik   (24.04.2008 в 01:42)   письмо автору
 
   для: 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];     
}
?>


Очень буду признателен за помощь.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования