PEAR:DB_NestedSet кто-нибуть юзает?

Mike Klemin

Новичок
PEAR:DB_NestedSet кто-нибуть юзает?

Интересны впечатления, советы и рекомендации.
http://oss.webcluster.at - неработает, а с теми файлами которые идут в релизе не очень то все понятно.
 

crocodile2u

http://vbolshov.org.ru
Ну... не могу сказать, что я крутой спец по NestedSet, но, по-моему, в релизе все есть. В файле NestedSet подробнейшие комментарии. А если тебя интересует что-то конкретное, то надо об этом и спрашивать. PHP Club Team тебе поможет, я уверен. Да и остальные тож.
 

sokol

Zavolga.Net
Mike Klemin да вобщем неплохо.
Понравилось то, что можно иметь несколько корневых записей.
Сам класс DB_NestedSet очень хорошо документирован.

-~{}~ 13.05.04 12:06:

crocodile2u в версии 1.3.4b нашел некоторые баги, например, ИМХО некорректно формировать строку выбираемых полей вот таким образом:

implode(', ', array_keys($ar));

т.к. получается 'field1', 'filed2', 'field3', 'field4'

что MySQL естественно воспринимает как строки, а не как поля выборки. Пришлось заменить на

str_replace("'", "`", implode(', ', array_keys($ar)));

что ИМХО более правильно.

Кто нибудь еще поимел проблемы с 13.4b? Хочется выгребсти все баги и автору отправить чтобы доработал.
 

Vitaliy

Guest
Привет.
Хотя пакет действительно неплохо документирован, все же не совсем легко разобраться в его использовании "c нуля". А так как очень-очень нужно, то очень прошу тех кто юзает Nestedset хотя бы в кратце объяснить как ним пользоваться.:confused:

Спасибо.
 

crocodile2u

http://vbolshov.org.ru
С чем у тебя проблема?

Таблицу в базе создать, наверное, можешь, тем более что в пакете (по-моему, в примерах) есть SQL запросы для mysql. Есть примеры работы с классом.

Для управления деревом:
методы create...Node(), deleteNode(), moveTree().

Для выборки - методы getAllNodes(), getBranch(), getChildren(), getParent(), getParents(), getRootNodes(), в общем, get...()

Начинай работать. Лекции по использованию этого класса никто читать не будет. Когда появятся конкретные вопросы, задавай.
 

Vitaliy

Guest
Привет.

to crocodile2u .


crocodile2u
С чем у тебя проблема?
Когда появятся конкретные вопросы, задавай.
Проблема в том, что я не могу понять с чего начать. Задача такова - есть таблица clients, и для неё надо построить древовидную структуру (структура должна хранится в отдельной таблице). Не понимаю каков алгоритм добавления новой записи в clients.

Начальные данные: в clients нет ни одной записи.

Я конечно туплю, но что поделаешь:(

Заранее спасибо.

з.ы. просьба не отсылать к английской документации (я там уже был):eek:
 

he][es

Новичок
А меня хоть к английской, хоть куда!.. Хоть малюсенькую статейку...
Господа пользующие, напишите статью по типу статьи про phpDbTree!.. Я думаю это будет ОЧЕНЬ полезный материал!..
 

crocodile2u

http://vbolshov.org.ru
Для начала рекомендуется ознакомиться с основными принципами построения деревьев по методу вложенных множеств.

Затем - смотрим примеры, кот. прилагаются к дистрибутиву пакета.

Создаем таблицы my_tree_nodes, my_tree_locks, как указано в примерах (для мускуля там есть готовые запросы на создание таблиц).

Создать ноду: createRootNode, createLeftNode, createRightNode (еще раз: в исходниках подробнейшие комментарии).

Выборка - все методы, начинающиеся с get + pickNode($id).

Удалить ноду - deleteNode($id)

Перемещение - moveTree.

Давай поступим так: начинай работать - твори, выдумывай, пробуй :), а когда возникнут вопросы, задавай их здесь: постараюсь отреагировать.
 

he][es

Новичок
А с phpDBTree на него перейти как нить по "безболезненей" можно?
 

he][es

Новичок
kvf77 дык не одинаковый!..
CREATE TABLE categories (
cid int(10) unsigned NOT NULL auto_increment,
title varchar(128) NOT NULL default '',
cleft int(10) unsigned NOT NULL default '0',
cright int(10) unsigned NOT NULL default '0',
clevel int(10) unsigned NOT NULL default '0',
PRIMARY KEY (cid),
KEY cleft (cleft, cright, clevel)
) TYPE=MyISAM;
и
CREATE TABLE tb_nodes (
STRID int(11) NOT NULL auto_increment,
ROOTID int(11) NOT NULL default '0',
l int(11) NOT NULL default '0',
r int(11) NOT NULL default '0',
PARENT int(11) NOT NULL default '0',
STREH int(11) NOT NULL default '0',
LEVEL int(11) NOT NULL default '0',
STRNA char(128) NOT NULL default '',
PRIMARY KEY (STRID),
KEY ROOTID (ROOTID),
KEY STREH (STREH),
KEY l (l),
KEY r (r),
KEY LEVEL (LEVEL),
KEY SRLR (ROOTID,l,r),
KEY parent (PARENT)
) TYPE=MyISAM COMMENT='NestedSet table';
Тут ещё и парент, и много "корней" может быть...
 

crocodile2u

http://vbolshov.org.ru
Да, DB_NestedSet использует несколько добавочных полей, кот. служат для удобства. Ты можешь добавить эти поля в dbTree-таблицу, и заполнить соответствующими значениями. Это несложно сделать.

Если тебя смущает разница в названиях полей, то посмотри на третий параметр DB_NestedSet::factory();
 

he][es

Новичок
"STRNA" => "name" // Custom - specify as many fields you want
Имеется ввиду число доп. полей, или вместо этого свои писать?..

Чё то не догоняю... :(
Сделал таблицу:
CREATE TABLE structura_kks_new (
id int(11) NOT NULL auto_increment,
title tinytext NOT NULL,
root_id int(11) NOT NULL default '0',
cleft int(11) NOT NULL default '0',
cright int(11) NOT NULL default '0',
parent int(11) NOT NULL default '0',
norder int(11) NOT NULL default '0',
level int(11) NOT NULL default '0',
name tinytext,
info tinytext,
PRIMARY KEY (id),
KEY root_id (root_id),
KEY norder (norder),
KEY cleft (cleft),
KEY cright (cright),
KEY level (level),
KEY SRLR (root_id,cleft,cright),
KEY parent (parent)
) TYPE=MyISAM COMMENT='Structura kks';

Обращаюсь:
PHP:
<?php

require_once('PEAR.php');
require_once('DB.php');
require_once('DB\NestedSet.php');
require "conf_global.php";

$dsn = "mysql://".$config['user']['login'].":".$config['user']['password']."@".$config['host']."/".$config['dbase_name'];
$db = DB::connect($dsn, true);

$params = array(
    'STRID'        => 'id',
    'ROOTID' => 'root_id',
    'l'   => 'cleft',
    'r'  => 'cright',
    'STREH' => 'norder',
    'LEVEL'     => 'level',
    'STRNA'      => 'title', 
    'parent'	=> 'parent'
);
$nestedSet =& DB_NestedSet::factory('DB', $dsn, $params); 
$nestedSet->setAttr(array(
        'node_table' => 'structura_kks_new', 
        'lock_table' => 'tb_locks')
);
$data = $nestedSet->getAllNodes(true);
print_r($data);

$db->disconnect();
?>
Во первых вопрос, ч/з уже существующее соединение DB обращаться нельзя? Она делает новое?.. И 2ое, выдает:
Fatal error: DB Error: no such field in C:\php\PEAR\PEAR.php on line 842
Это как понимать? Какого поля и где ей не хватает?..
 

kvf77

Red Devil
he][es

не знаком с PEAR но думается есть какая-то возможность посмотреть полный текст ошибки, где написано чего именно не хватает
 

crocodile2u

http://vbolshov.org.ru
PEAR::setErrorHandler((см. доку по PEAR - базовые классы));
+ PEAR_Error::getMessage()
+ PEAR_Error::getUserInfo()

по приведенному примеру:

Исправь массив $params:

PHP:
$params = array(
    'id'        => 'id',
    'root_id' => 'root_id',
    'cleft'   => 'l',
    'cright'  => 'r',
    'norder' => 'norder',
    'level'     => 'level',
    'title'      => 'name',
    'parent'    => 'parent'
);
Ключи этого массива - _реальные_ названия полей в таблице. Значения - алиасы, используемые в DB_NestedSet
 

he][es

Новичок
:/ да скорее всего я чего то не то делаю... А доки ну никакой нет... :( Хоть бы малюсенькую статейку написали что ли...

-~{}~ 16.09.05 12:36:

crocodile2u аааа вон оно как!!! ... Понял! ПАСИБИЩЕ БОЛЬШУЩЕЕ!! :D
 

he][es

Новичок
А какнить автоматом проставить norder и parent нельзя в базе? А то я от старой таблици инфу залил, а там парента и norder-а не было... root_id - как я понял при одном корне будет у всех одинаковый 1(id корня)?..
 

crocodile2u

http://vbolshov.org.ru
ну как нельзя? Можно. Проставляй, разрешаю :)

Короче, пишешь скрипт и апдейтишь. Делов на 15 минут.

Да, root_id - это айдишник корневого узла, к которому принадлежит нода. Если корневой узел один - он будет одинаковый у всех.
 

he][es

Новичок
Короче, пишешь скрипт и апдейтишь. Делов на 15 минут.
Ну я думал, иожет быть там ф-ия какая нить есть... :D
Notice: Undefined index: rootid in C:\php\PEAR\DB\NestedSet.php on line 701
Хотя я рут_айди проставил для всех записей...
Fatal error: DB Error: syntax error in C:\php\PEAR\PEAR.php on line 842
Как посм. что за ошибка?..
crocodile2u может совместными силами статейку напишем по DB_NestedSet? Мои глупые вопросы + ваш опыт и знания?..
 
Сверху