<?php
class SiteController extends CController
{
private function printNestedTree($tree)
{
$result = "<strong>".$tree['node']->name."</strong> (".$tree['node']->getLeftValue().",".$tree['node']->getRightValue().")";
if(is_array( $tree['children'] ))
{
$result .= "<ul>";
foreach($tree['children'] as $key => $child)
{
$result .= "<li>";
$result .= $key.": ".$this->printNestedTree($child);
$result .= "</li>";
}
$result .= "</ul>";
}
return $result;
}
/**
* This is the default 'index' action that is invoked
* when an action is not explicitly requested by users.
*/
public function actionIndex()
{
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
ob_start();
$root = Tree::model()->findByPK(1);
$newNode = new Tree();
$newNode->name = "First Node";
$root->appendChild($newNode); //You do not have to use the "save" function here.
$newNode2 = new Tree();
$newNode2->name = "Second Node";
$root->appendChild($newNode2); //You do not have to use the "save" function here.
$newNode3 = new Tree();
$newNode3->name = "GrandChild Node";
$newNode->appendChild($newNode3); //You do not have to use the "save" function here.
echo "<h3>Start Tree</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
// Let's do some modifications:
$newNode2->moveLeft(); //You do not have to use the "save" function here.
echo "<h3>Move Second Node to the left</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode3->moveUp(); //You do not have to use the "save" function here.
echo "<h3>Move the GrandChild node up</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode3->moveBelow($newNode2);
echo "<h3>Move GrandChild Down to Second</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode2->moveRight();
echo "<h3>Move Second to the right</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode3->moveBefore($newNode);
echo "<h3>Move GrandChild before the first node</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode->moveBelow($newNode2);
echo "<h3>Move First Node below the second</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode2->deleteNode();
echo "<h3>Delete only the Second Node</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode->moveBelow($newNode3);
echo "<h3>Move First Node below the GrandChild</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$newNode3->deleteNode(true);
echo "<h3>Delete the GrandChild and all children</h3>";
$tree2 = $root->getNestedTree();
foreach($tree2 as $key => $subtree)
{
echo $key.": ".$this->printNestedTree($subtree);
}
$message = ob_get_clean();
$this->render('index',array('message' => $message,'tree' => $tree2));
}
}
кстати, смутило, что в этом коде изначально было написано так:
Спасибо конечно.
Но меня интересует больше вопрос как отредактировать сохранённое в базе дерево..
А то в примере показанно как создать новое, как удалить.. и ни слова про то, как отредактировать..
Не перегружать же дерево каждый раз при добавлении нового элемента..
покажите рабочий пример..
А не подскажите как это подключать? Что-то никак не могу разобраться. Как добавлять новые элементы в дерево и т.д.
Я подключил другой экстеншн: http://www.yiiframework.com/extension/nestedset/
Правда пришлось повозиться пару дней, подправить ошибки, кой чего дописать. Зато теперь работает управление деревом - создание узлов, удаление, перемещение, так же можно выводить в CTreeView и CDropdownList До ума еще не довел, но как доделаю, выложу здесь на форуме исправленную версию, с описанием как подключать и работать с деревом.
А не подскажите как это подключать? Что-то никак не могу разобраться. Как добавлять новые элементы в дерево и т.д.
Я подключил другой экстеншн: http://www.yiiframework.com/extension/nestedset/
Правда пришлось повозиться пару дней, подправить ошибки, кой чего дописать. Зато теперь работает управление деревом - создание узлов, удаление, перемещение, так же можно выводить в CTreeView и CDropdownList До ума еще не довел, но как доделаю, выложу здесь на форуме исправленную версию, с описанием как подключать и работать с деревом.
Буду ждать с нетерпением. А как скоро это произойдёт?)
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
Сегодня решил попробовать данное расширение:
Скачал отсюда: http://www.yiiframework.com/extension/nestedset/
Подключил все по примеру, начал пробовать пример из документации, и приложение падает с ошибкой:
Класс TreeBehavior не содержит метода "getIsNewRecord".
хмм..я им не пользовался...но просто странно как-то звучит это...IsNewRecord - обычно употребляется без get а во вторых там у вас стоит l а скорей всего подразумевается i - getIsNewRecord
Вызов этого getIsNewRecord() идет внутри класса TreeBehavior, а я его не трогал.
А уж автор расширения может придумывать что хочет.
Приложение падает при: