Навигация по дереву (Nested Sets)

Alexos

Новичок
Навигация по дереву (Nested Sets)

Похоже в классе CDBTree нету метода для того, чтобы сделать следующее..
Короче, мне надо чтоб навигация была устроена таким образом, чтобы самый верхний уровень разделов всегда выводился и углубление шло только в рамках выбранного раздела..
как бы это объяснить по понятнее?..
т.е. нажал в списке разделов 1-го уровня на ссылку и в дереве опять таки отобразились разделы (1-го уровня) + подразделы на единицу больше по уровню вложенности (т.е. с level=2) для конкретного нажатого раздела (1-го уровня).. и так далее..
чтоб углубление в дерево шло в рамках выбранного раздела..
не знаю, может рисунок как-то компенсирует моё косноязычие:

+-1
|
+-1
|
+-1
| |
| +-2
| |
| +-2
| |
| +-3
|
+-1
|
+-1
|
+-1

Цифра указывает на уровень раздела.. каждый уровень 1-го раздела также имеет вложенные разделы.. Так выглядит дерево когда чел нажимает на раздел, выделенный здесь жирным..
и так далее..

-~{}~ 13.02.04 17:35:

блин.. парсинг сообщений на форуме карёжит мой рисунок :)
короче тройка от выделенной двойки отходит.. потому что это 3-й уровень!
 

Quidle

Полноценный новичок
И что ты хочешь ?
Чтобы тебе скрипт написали ?
Или есть более конкретные вопросы ?
 

гоша

Guest
пусть есть узел а={Va,La,Ra} (уровень, левый, правый)
дедушка этого узла есть d={Va-2,L<La,R>Ra}
дети дедушки, т.е. дяди и тети будут {Va-1,L between Ld and Rd}
 

Alexos

Новичок
гоша
да это всё понятно.
вот нашёл пример на http://www.voltra.ru/
лучше один раз увидеть
можно ли делать такой вывод разделов (слева) одним универсальным запросом? естественно с подстановкой различных переменных..
 

гоша

Guest
т.е. вывести все узлы уровня v + детей некоторого узла x?

WHERE level=v OR (r_left BETWEEN x.r_left+1 AND x.r_right)
 

Линк

Guest
Alexos, вижу что по ней) Вы почитайте статейку-то
там мнооого чего рассказано про этот метод) после прочтения ее, мне хватало ручки и бумажки, для ответа на любой вопрос о деревьях в sql)
 

bzik

Новичок
function buildActiveNode($ID = 0,$root = false){
if($node = $this->getNodeInfo($ID)){
$parents = $this->db->result2array($this->enumPath($ID));
$upparent = $this->getNodeInfo($parents[0][$this->id]);
}else{ $upparent=array(1,1); $node = array(1,2,1); }
if($root == false) $sign = ""; else $sign = "=";
$this->sql = 'SELECT * FROM '.$this->table.'
WHERE '.
$this->level.' = 1
OR ('.$this->id.' BETWEEN '.$upparent[0].' AND '.$upparent[1].' AND '.$this->level.' <= '.$node[2].' AND '.$this->level.' >'.$sign.' 0)
OR ('.$this->left.' BETWEEN '.$node[0].' AND '.$node[1].' AND '.$this->level.'='.$node[2].'+1)
AND cat_status = 1
ORDER BY '.$this->left;
return $this->db->query($this->sql);
}
 

kvf77

Red Devil
На каком-то сайте было решение твоего вопроса. Я переделал немного под себя:

// Выводим приоткрытое дерево
function tree_ajar($ID)
{
$this->sql_query="SELECT A.* FROM ".$this->table." A, ".$this->table." B WHERE B.".$this->table_id."=".$ID." AND B.".$this->table_left." BETWEEN A.".$this->table_left." AND A.".$this->table_right." ORDER BY A.".$this->table_left;
$this->sql_execute();
if ($this->sql_err) return (11);
if (($alen=$this->sql_num_rows())==0) return (20);
$i=0;
$this->sql_query="SELECT * FROM ".$this->table." WHERE ".$this->table_level."=1 ";
while ($row=$this->sql_fetch_array())
{
if ((++$i==$alen) && ($row[$this->table_left]+1)==$row[$this->table_right]) break;
$this->sql_query.=" OR (".$this->table_level."=".($row[$this->table_level]+1)." AND ".$this->table_left.">".$row[$this->table_left]." AND ".$this->table_right."<".$row[$this->table_right].")";
}
$this->sql_query.=" ORDER BY ".$this->table_left;
$this->sql_execute();
if ($this->sql_err) return (11);
return (0);
}
 

Breeze

goshogun
Команда форума
Партнер клуба
Alexos
Можно :о) Только скажу по секрету.. На Вольтре Nested Sets не используется..
 
Сверху