Nested Sets + CTreeView, CDropdownList, CListBox

Выкладываем свои наработки
an19drey
Сообщения: 7
Зарегистрирован: 2012.01.21, 17:32

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение an19drey » 2012.01.21, 17:38

Здравствуйте, вроде установил все как в примере (скачан с первой страницы поста), но при запуске возникает ошибка

PHP warning
include(CNestedSetBehavior.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory
Z:\home\localhost\www\yii\framework\YiiBase.php(418)


Подскажите, что сделал не так, что проверить.

Заранее благодарен, Андрей

esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение esche » 2012.01.21, 18:27

Файл CNestedSetBehavior не найден (КО) - импорт прописан? файл есть?
Не исключено, что он потерял первую букву (или по другой причине ошибка.. т.к. описание было сделано довольно давно, а расширение дорабатывалось)

А лучше пользоваться https://github.com/yiiext - там всегда последние версии и актуальные доки для разработчика
...

an19drey
Сообщения: 7
Зарегистрирован: 2012.01.21, 17:32

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение an19drey » 2012.01.21, 19:40

А где прописать импорт (в примере про это ни слова нет)? Расширениями просто не пользовался никогда.

esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение esche » 2012.01.21, 19:54

https://github.com/yiiext/nested-set-behavior - тут последняя версия... там же и readme имеется.
...

an19drey
Сообщения: 7
Зарегистрирован: 2012.01.21, 17:32

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение an19drey » 2012.01.21, 19:55

Спасибо

an19drey
Сообщения: 7
Зарегистрирован: 2012.01.21, 17:32

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение an19drey » 2012.01.23, 11:54

Подскажите, как использовать расширение nestedsetbehavior (https://github.com/yiiext/nested-set-behavior/)?

Прописал в модели
public function behaviors()
{
return array(
'NestedSetBehavior'=>array(
'class'=>'ext.yiiext.behaviors.model.trees.NestedSetBehavior',
'leftAttribute'=>'lft',
'rightAttribute'=>'rgt',
'levelAttribute'=>'level',
);
}

Следующая функция от меня (может с ошибкой)
public static function selectAllFromTree(){
NestedSetBehavior::roots();
}

а что прописать в views чтобы оно хоть что-то показало.

Заранее благодарен

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

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение timlar » 2012.01.23, 11:57

Там же есть readme файл, где все описано: https://github.com/yiiext/nested-set-be ... adme_ru.md
Twitter: @timlar_ua

wolfandman
Сообщения: 33
Зарегистрирован: 2012.06.04, 19:52

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение wolfandman » 2012.06.04, 20:25

Помогите пожалуйста!
У меня такая же проблема как у Negredo, у меня не получается сохранить модель, т.к. подключил через бехейвиор Nested Sets. Ошибка такая:
You should not use CActiveRecord::save() method when NestedSetBehavior attached.

Пользователю Negredo помог совет с использованием saveNode(), но я не понял что это значит. Я знаю, что в NestedSetBehavior есть save() и saveNode(), я даже не успел их где-то задействовать, а просто попытался сохранить форму.

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

    public function actionCreate($id=false)
    {
        
        $model=new Catalog;
        
        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if(isset($_POST['Catalog']))
        {
            $model->attributes=$_POST['Catalog'];
            if($model->save()) echo 'СОХРАНЕНО';
        }

        $this->render('create',array(
            'model'=>$model,
        ));
    } 
Может быть я пока просто не врубился в MVC. В поём понимании, модель в данном случае - это объект-запись, наделённая свойствами и методами для её изменения и сохранения. NestedSets подключаю в эту модель для перемещения её вместе с её детьми.
Помогите пожалуйста. Как сохранить форму?

wolfandman
Сообщения: 33
Зарегистрирован: 2012.06.04, 19:52

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение wolfandman » 2012.06.09, 11:41

Спасибо, я разобрался.
Если кому-то пригодится, то если nested sets подключены, то стандартные методы сохранения/добавления не работают, даже не пытайтесь. Вместо этого нужно пользоваться neested`овыми методами добавления в базу (appendTo), сохранения (saveNode). Они запускают те же самые механизмы, что и родные, добавляя к ним свои внутренние. Вот и всё. Хитрить не нужно

<Flash>
Сообщения: 56
Зарегистрирован: 2012.10.02, 18:16

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение <Flash> » 2012.12.05, 15:15

Всем привет. Столкнулся с проблемой an19drey, делая все как написано в первом посте, наткнулся на ошибку о не существующем файле или директории. Следуя советам, скачал актуальный NestedSet https://github.com/yiiext/nested-set-behavior, установил, следуя инструкциям. Однако оказалось, что TreeViewTreebehavior совсем не контактирует с NestedSetBehavior, после нескольких раздумий добил его до такого вида:

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

<?php

class TreeViewTreebehavior extends NestedSetBehavior
{
    public function getTreeViewData($returnrootnode = true, $keyfield = null)
    {
        if($keyfield == null)
        {
            $keyfield = 'id';
        }
        // Fetch the flat tree
        $rawtree = Sections::model()->findByPk(1);
        //$this->getTree(true);
        // Init variables needed for the array conversion
        $tree = array();
        $node =& $tree;
        $position = array();
        $lastitem = '';
        $depth = $this->levelAttribute;
        
        foreach($rawtree as $rawitem)
        {
            // If its a deeper item, then make it subitems of the current item
            if ($rawitem->levelAttribute > $depth)
            {
                $position[] =& $node; //$lastitem;
                $depth = $rawitem->levelAttribute;
                $node =& $node[$lastitem]['children'];
            }
            // If its less deep item, then return to a level up
            else
            {
                while ($rawitem->levelAttribute < $depth)
                {
                    end($position);
                    $node =& $position[key($position)];
                    array_pop($position);
                    $depth = $node[key($node)]['node']->levelAttribute;
                }
            }
            
            if(!$rawitem->hasChildNodes())
                $rawitem->owner->name = '<a href="/category/'.$rawitem->owner->id.'">'.$rawitem->owner->name.'</a>';
            else
                $rawitem->owner->name = '<span>'.$rawitem->owner->name.'</span>';
            
            // Add the item to the final array
            $node[$rawitem->$keyfield]['node'] = $rawitem;
            $node[$rawitem->$keyfield]['id'] = 'node'.$rawitem->owner->id;
            $node[$rawitem->$keyfield]['text'] = $rawitem->owner->name;
            // save the last items' name
            $lastitem = $rawitem->$keyfield;
        }
        // we don't care about the root node
        if (!$returnrootnode)
        {
            reset($tree);
            $tree = $tree[key($tree)]['children'];
            //array_shift($tree);
        }
        
        return $tree;
    }
}
 
Однако все-равно вылетает ошибка:

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

Внутренняя ошибка сервера

key() expects parameter 1 to be array, null given
В ходе обработки вашего запроса произошла внутренняя ошибка сервера. Вы можете сообщить об ошибке по адресу the webmaster.
Спасибо. 
Кто сталкивался с данной проблемой? Какие пути решения существуют?

glamurchik
Сообщения: 65
Зарегистрирован: 2011.04.27, 21:39

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение glamurchik » 2013.01.17, 19:15

а где увидеть рабочее решение?

Аватара пользователя
howard
Сообщения: 528
Зарегистрирован: 2012.11.16, 18:55
Откуда: Україна, Вінниця

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение howard » 2013.07.22, 21:36

писал как-то для свои целей, могу выложить
Агрегатор цен на услуги хостинга - https://hostcost.net

Жирик
Сообщения: 1
Зарегистрирован: 2015.04.07, 12:57

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение Жирик » 2015.04.07, 13:00

Все работает, кроме вставки кагории - вь1дает ошибку:
Error 500

Invalid argument supplied for foreach()
помогите

Ответить