Welcome to php club

PHP FAQ from PHPclub.ru: Tree/NsLibPhpdbtree ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Деревья в базах данных => Вложенные множества => Готовые библиотеки => phpDbTree

phpDbTree


Название библиотеки: phpDbTree
Автор библиотеки: su1d
Сайт библиотеки: http://dev.e-taller.net/dbtree/

Содержание




Деревья в базах данных => Вложенные множества => Готовые библиотеки => phpDbTree => Часто задаваемые вопросы

Часто задаваемые вопросы



Как получить всех детей заданного элемента?

su1d:
enumChildren(), enumChildrenAll()


Что возвращает enumChildrenAll()?

Что должна вернуть enumChildrenAll()? По логике эта функция должна вернуть массив, а возвращает строку: «Resource id #8».


.des.:
Эта функция возвращает указатель на ресурс, а не массив.
Массив Вам нужно получить методом $db->fetch_array() (это враппер для функции mysql_fetch_array).


popoff:
Если Вы используете базу данных My SQL?, то этот указатель следует в цикле передавать в качестве аргумента функции mysql_fetch_array.


Как с помощью этого класса построить все дерево целиком?

Подскажите пожалуйста, если можно, как с помощью этого класса построить все дерево целиком? Не нашел данного метода.


Макс:
Этот класс удобно использовать именно для добавления новых узлов в дерево (или удаление/редактирование). А вывод дерева или его части удобнее делать самому простыми SQL-запросами. В данном случае это наверное будет
SELECT * FROM tree_table ORDER BY cat_left;


Как вывести все элементы первого уровня и только для одной выбранной ветки – все дочерние элементы?

//Как вывести все элементы первого уровня и только для одной выбранной ветки – все подразделы? Например:
##раздел1
раздел2
  подраздел1
  подраздел2
раздел3##//


Макс:
Нужно использовать 2 запроса:


1. получить cat_left и cat_right для элемента первого уровня с указанным ID
SELECT cat_left, cat_right FROM tree_table WHERE id = $id


2. Получаем дерево:
SELECT * FROM tree_table WHERE cat_level = 1 OR (cat_left BETWEEN cat_left AND cat_right) ORDER BY cat_left;


su1d:

<?php
    $sql
="SELECT are_id, are_left, are_right, are_level, are_titulo FROM are "
        
."WHERE are_level > 0 "
        
."ORDER BY are_left "
    
;
    
$q = $db->query($sql) or die("SQL error: ".$db->error());
    
$ARE_RIGHT = array(0);
    echo(
"<select name=are_select style='font: x-small Courier New;'><option></option>");
    while(
$D = $db->fetch_array($q)) {
        
extract($D);
        echo(
"<option value=$are_id>");
        if(
$are_level > 1) {
            
$PAD = $are_right+1 == $ARE_RIGHT[$are_level-1] ? '&#9492;' : '&#9500;';
            for(
$is_last = true ,$i = $are_level-1; $i > 1; $i--) {
                
$PAD = @(($ARE_RIGHT[$i-1]-1 != $ARE_RIGHT[$i]) ? "&#9474;" : "&nbsp;") . $PAD;
            }
            echo
$PAD;
        }

        
$ARE_RIGHT[$are_level] = $are_right;
        
$ARE_RIGHT = array_slice($ARE_RIGHT, 0, $are_level+1);
        echo(
$are_titulo);
        echo(
"</option>");
    }

    echo(
"</select>");
?>


Можно ли при помощи moveAll перемещать узлы в пределах одного уровня?

su1d
Так уж получилось, что упорядочивание элементов одного уровня — задача приложения, а не библиотеки, т.к. пока для общего случая (а частные в библиотеки вроде как не должны попадать) я ещё не придумал хорошего (читай: одновременно удобного и эффективного) механизма работы.


Как грамотно добавлять информацию в случае использования двух таблиц?

Скажите, пожалуйста, как грамотно добавлять категории в случае использования двух таблиц (структура дерева и содержание для разделов)? Правильно ли я понимаю, что для этого нужно придерживаться следующей последовательности в написании скрипта:
1. Заносим новый раздел в таблицу со структурой;
2. Запрашиваем идентификатор внесенной записи;
3. Добавляем описание для созданного раздела в таблицу с содержанием, причем запись создаем с сid, полученным из пункта 2.
Иначе говоря,
1. insert
2. select
3. insert


Макс
Все верно, только метод $tree->insert() возвращает ID вставленной записи, так что select делать не надо.



Деревья в базах данных => Вложенные множества => Готовые библиотеки => phpDbTree => Дополнительная информация

Дополнительная информация


Расширения библиотеки


  • http://php.russofile.ru/ru/authors/sql/nestedsets01/
    Все запросы переписаны согласно стандартам ANSI и работают без изменений на подавляющем большинстве баз данных.

Поддержка транзакций на основе класса ADODB. Если вы не хотите использовать ADODB, но хотите поддерживать механизм транзакций на основе используемого вами драйвера базы данных, реализуйте их самостоятельно, переписав соответствующие функции в прилагаемом драйвере-примере для базы MySql.


Библиотека поддерживает кэширование SQL запросов на на основе класса ADODB, но если хотите поддержать кэширование на основе используемого вами драйвера базы данных, реализуйте его самостоятельно, переписав соответствующие функции в прилагаемом драйвере-примере для базы MySql.


Библиотека работает с поддержкой технологии GetText. Эта возможность опциональна. Класс сам определит подключено ли соответствующее расширение. Если GetText отсутствует, класс будет выводить сообщения средствами PHP.


Добавлена полномасштабная демонстрация возможностей библиотеки (смотрите в скаченном архиве в каталоге 'demo'). Данная демонстрация наглядно показывает ту легкость, с которой вы можете работать с деревьями в своих скриптах. Пример написан так, что вы получаете практически готовое решение для своих нужд: создание, редактирование, перемещение и удаление разделов, а также разнообразные примеры навигации по сайту призваны максимально донести до программиста возможности библиотеки и дать практические рекомендации по ее использованию!

  • http://download.popoff.donetsk.ua/phpclub/phpDbTree-1.5.zip
    Модифицированная версия библиотеки phpDbTree 1.4, в которую включена функция обмена двух узлов. Работает за счет последовательного вызова функций вставки, перемещения и удаления узлов в дереве.


 
Комментариев нет. [Показать комментарии/форму]