Nestedset extension

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Balian
Сообщения: 21
Зарегистрирован: 2009.11.19, 19:26

Nestedset extension

Сообщение Balian »

решил посмотреть на http://www.yiiframework.com/extension/nestedset/
Но уже запарился с ошибкой:

Код: Выделить всё

Undefined index: children
Source File

C:apachelocalhostwwwprotectedcontrollersSiteController.php(24)

00019:     
00020:     private function printNestedTree($tree)
00021:     {
00022:         //print_r($tree);
00023:         $result = "<strong>".$tree['node']->name."</strong> (".$tree['node']->getLeftValue().",".$tree['node']->getRightValue().")";
00024:         if(is_array( $tree['children'] ))
00025:          {
00026:              $result .= "<ul>";
00027:              foreach($tree['children'] as $key => $child)
00028:              {
00029:                  $result .= "<li>";
00030:                  $result .= $key.": ".$this->printNestedTree($child);
00031:                  $result .= "</li>";
00032:              }
00033:              $result .= "</ul>";
00034:         }
00035:        
00036:         return $result; 
вроде тут были товарищи, использовавшие данное расширение?
не подскажете, как справиться? Рапечатывал $tree-children присутствует
Последний раз редактировалось Balian 2009.11.25, 15:18, всего редактировалось 1 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Nestedset extension

Сообщение samdark »

Версия какая? Покажите код контроллера, который даёт ошибку.
Balian
Сообщения: 21
Зарегистрирован: 2009.11.19, 19:26

Re: Nestedset extension

Сообщение Balian »

Yii-1.0.10

код, собственно, из примера, приложенного автором расширения..

Код: Выделить всё

<?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));
        }
    
} 

кстати, смутило, что в этом коде изначально было написано так:

Код: Выделить всё

public function actionIndex(){
    public function actionIndex()
        { 
        //...
            }
} 
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Nestedset extension

Сообщение haiflive »

Подскажите как отредактировать дерево из БД
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Nestedset extension

Сообщение samdark »

Можно попробовать воспользоваться http://code.google.com/p/yiiext/source/ ... odel/trees. Версия пока без документации, но должна быть стабильнее той, что в начале топика.
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Nestedset extension

Сообщение haiflive »

Спасибо конечно.
Но меня интересует больше вопрос как отредактировать сохранённое в базе дерево..

А то в примере показанно как создать новое, как удалить.. и ни слова про то, как отредактировать..
Не перегружать же дерево каждый раз при добавлении нового элемента..
покажите рабочий пример..
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Nestedset extension

Сообщение haiflive »

Вот к примеру код из примера

Код: Выделить всё

        $newNode = new Tree();
        $newNode->name = "First Node";
        $root->appendChild($newNode); //You do not have to use the "save" function here.
 
Вопрос, как получить указалель $Node из базы, а не создавать новый.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Nestedset extension

Сообщение samdark »

Например, так:

Код: Выделить всё

$node = Tree::model()->findByPK(197);
 
haiflive
Сообщения: 38
Зарегистрирован: 2010.02.10, 09:32

Re: Nestedset extension

Сообщение haiflive »

Спасибо, собственноя я так и предпологал.. навеяло во сне =)
Archmage
Сообщения: 78
Зарегистрирован: 2010.03.03, 03:07
Откуда: Иркутск

Re: Nestedset extension

Сообщение Archmage »

Sam Dark писал(а):Можно попробовать воспользоваться http://code.google.com/p/yiiext/source/ ... odel/trees. Версия пока без документации, но должна быть стабильнее той, что в начале топика.
А не подскажите как это подключать? Что-то никак не могу разобраться. Как добавлять новые элементы в дерево и т.д.
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Nestedset extension

Сообщение timlar »

Archmage писал(а):
Sam Dark писал(а):Можно попробовать воспользоваться http://code.google.com/p/yiiext/source/ ... odel/trees. Версия пока без документации, но должна быть стабильнее той, что в начале топика.
А не подскажите как это подключать? Что-то никак не могу разобраться. Как добавлять новые элементы в дерево и т.д.
Я подключил другой экстеншн: http://www.yiiframework.com/extension/nestedset/
Правда пришлось повозиться пару дней, подправить ошибки, кой чего дописать. Зато теперь работает управление деревом - создание узлов, удаление, перемещение, так же можно выводить в CTreeView и CDropdownList :) До ума еще не довел, но как доделаю, выложу здесь на форуме исправленную версию, с описанием как подключать и работать с деревом.
Twitter: @timlar_ua
Archmage
Сообщения: 78
Зарегистрирован: 2010.03.03, 03:07
Откуда: Иркутск

Re: Nestedset extension

Сообщение Archmage »

Timlar писал(а):
Archmage писал(а):
Sam Dark писал(а):Можно попробовать воспользоваться http://code.google.com/p/yiiext/source/ ... odel/trees. Версия пока без документации, но должна быть стабильнее той, что в начале топика.
А не подскажите как это подключать? Что-то никак не могу разобраться. Как добавлять новые элементы в дерево и т.д.
Я подключил другой экстеншн: http://www.yiiframework.com/extension/nestedset/
Правда пришлось повозиться пару дней, подправить ошибки, кой чего дописать. Зато теперь работает управление деревом - создание узлов, удаление, перемещение, так же можно выводить в CTreeView и CDropdownList :) До ума еще не довел, но как доделаю, выложу здесь на форуме исправленную версию, с описанием как подключать и работать с деревом.
Буду ждать с нетерпением. А как скоро это произойдёт?)
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Nestedset extension

Сообщение AbS_ »

Сегодня решил попробовать данное расширение:
Скачал отсюда: http://www.yiiframework.com/extension/nestedset/
Подключил все по примеру, начал пробовать пример из документации, и приложение падает с ошибкой:
Класс TreeBehavior не содержит метода "getIsNewRecord".
И что то как то грустно стало.
vlastachu
Сообщения: 50
Зарегистрирован: 2010.03.01, 20:15

Re: Nestedset extension

Сообщение vlastachu »

хмм..я им не пользовался...но просто странно как-то звучит это...IsNewRecord - обычно употребляется без get а во вторых там у вас стоит l а скорей всего подразумевается i - getIsNewRecord
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Nestedset extension

Сообщение AbS_ »

Вызов этого getIsNewRecord() идет внутри класса TreeBehavior, а я его не трогал.
А уж автор расширения может придумывать что хочет.
Приложение падает при:

Код: Выделить всё

appendChild($newNode) 
Вот сижу гадаю, или это баг или фича.

Странно что если тупо написать этот метод и вернуть false то работает, но это ж не правильно.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Nestedset extension

Сообщение timlar »

Я здесь выкладывал рабочую версию с примерами: viewtopic.php?f=9&t=804
Twitter: @timlar_ua
Ответить