Nested Sets + CTreeView, CDropdownList, CListBox

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

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение samdark »

Timlar,
Не пробовал автору отправить исправленный вариант, чтобы народ не мучался?
UX.InfoGate
Сообщения: 5
Зарегистрирован: 2010.05.06, 22:19
Откуда: Lutsk, Ukraine
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение UX.InfoGate »

Timlar писал(а):Это не форк :) Там всего лишь исправлены ошибки для работы с новыми версиями фреймворка. :)
Это пока-что не форк... Пока ты или автор не решили сделать пару улучшений =)
Кстати, отправить автору новый вариант было бы хорошо, или сделать официальный форк и самому его поддерживать, хотя первый вариант получше в данном случае.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение timlar »

Если бы автор был заинтересован, он сам давно исправил бы. Лично мне не хочется этим заниматься. Да и в разговорном английском я не силен :) Могу только на русский переводить и все :) Если у кого-то есть желание пообщаться с автором - пообщайтесь. :)
Twitter: @timlar_ua
UX.InfoGate
Сообщения: 5
Зарегистрирован: 2010.05.06, 22:19
Откуда: Lutsk, Ukraine
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение UX.InfoGate »

Со временем надо будет перелопатить код этого екстеншена ибо код плохо читаемый (как по мне), не стандартизирован, и т. д. А кода там есть так немного =)
NetStranger
Сообщения: 107
Зарегистрирован: 2010.03.17, 12:54

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение NetStranger »

Подскажите пожалуйста как из этих данных сделать вывод в массив, понятный для CMENU ?

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

$items=array(
                array('label'=>'Home', 'url'=>array('/')),
                array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
                array('label'=>'Contact', 'url'=>array('/site/contact'),'items'=>array(
                                        array('label'=>'Home', 'url'=>array('/'))
                                    )),
)
 
Вот, что можно сделать с помощью Yii - Teutonick.ru
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение AbS_ »

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

<?php
class ArrayTreeBehavior extends TreeBehavior {

    public function getCMenuArray ($param = array()) {

        if (isset($param['rootaslink'])) {
            $rootaslink = $param['rootaslink'];
        } else {
            $rootaslink = false;
        }

        if (isset($param['returnrootnode'])) {
            $returnrootnode = $param['returnrootnode'];
        } else {
            $returnrootnode = false;
        }
        if (isset($param['keyfield'])) {
            $keyfield = $param['keyfield'];
        } else {
            $keyfield = '_id';
        }

        // Fetch the flat tree
        $rawtree = $this->getTree($returnrootnode);
        // Init variables needed for the array conversion
        $tree = array();
        $node =& $tree;
        $position = array();
        $lastitem = '';
        $depth = $this->getLevelValue();

        foreach($rawtree as $rawitem)
        {
            // If its a deeper item, then make it subitems of the current item
            if ($rawitem->getLevelValue() > $depth)
            {
                $position[] =& $node; //$lastitem;
                $depth = $rawitem->getLevelValue();
                $node =& $node[$lastitem]['items'];
            }
            // If its less deep item, then return to a level up
            else
            {
                while ($rawitem->getLevelValue() < $depth)
                {
                    end($position);
                    $node =& $position[key($position)];
                    array_pop($position);
                    $depth = $node[key($node)]['node']->getLevelValue();
                }
            }

            // Add the item to the final array
            $node[$rawitem->$keyfield]['node'] = $rawitem;
            if(!$rawitem->hasChildNodes() || $rootaslink)
                $node[$rawitem->$keyfield]['url'] = array($rawitem->owner->_url);
            $node[$rawitem->$keyfield]['label'] = $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)]['items'];
            //array_shift($tree);
        }

        return $tree;
    }
} 
Расширение подключаем в модель для которой строиться дерево:

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

    public function behaviors(){
        return array(
            'TreeBehavior' => array(
                'class' => 'application.extensions.nestedset.TreeBehavior',
            ),
            'ArrayTreeBehavior' => array(
                'class' => 'application.extensions.nestedset.ArrayTreeBehavior',
            ),
    ); 
Ну и далее, загружаем в контроллере нужны корень передаем его в отображение и

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

$this->widget('zii.widgets.CMenu', array(
        'items'=>$root->getCMenuArray(array(
                        'returnrootnode'=>true,
                   )),
    )); 
п.с. Не забудьте учесть что, в моем варианте label в модели представлен как _name, url как _url
Короче присмотритесь к куску кода:

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

class ArrayTreeBehavior extends TreeBehavior {

    public function getCMenuArray ($param = array()) {
.................................
            // Add the item to the final array
            $node[$rawitem->$keyfield]['node'] = $rawitem;
            if(!$rawitem->hasChildNodes() || $rootaslink)
                $node[$rawitem->$keyfield]['url'] = array($rawitem->owner->_url);
            $node[$rawitem->$keyfield]['label'] = $rawitem->owner->_name;
            // save the last items' name
            $lastitem = $rawitem->$keyfield;
....................
     }
} 
NetStranger
Сообщения: 107
Зарегистрирован: 2010.03.17, 12:54

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение NetStranger »

вот это спасибо! буду кумекать!
Вот, что можно сделать с помощью Yii - Teutonick.ru
Archmage
Сообщения: 78
Зарегистрирован: 2010.03.03, 03:07
Откуда: Иркутск

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение Archmage »

А можно ли отсортировать узлы деревьев? По определенному параметру. Допустим у меня есть дерево

2
-2
-1
1
-2
--2
--1
-1

А я хочу получить:
1
-1
-2
--1
--2
2
-1
-2
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
NetStranger
Сообщения: 107
Зарегистрирован: 2010.03.17, 12:54

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение NetStranger »

Все что поддается сортировки описано тут
http://www.getinfo.ru/article610.html
Вот, что можно сделать с помощью Yii - Teutonick.ru
Archmage
Сообщения: 78
Зарегистрирован: 2010.03.03, 03:07
Откуда: Иркутск

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение Archmage »

Мне подойдет сортировка только для отображения дерева, в самой базе ничего менять не нужно)
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
Archmage
Сообщения: 78
Зарегистрирован: 2010.03.03, 03:07
Откуда: Иркутск

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение Archmage »

Можете подсказать где искать решение проблемы. Я подключаю виджет:

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

<?php $this->widget('application.modules.catalog.components.Tree'); ?>
Но он отображается как обычный список <ul>, я проверил файл css <link rel="stylesheet" type="text/css" href="/css/treeview/jquery.treeview.css" /> подключается. Может быть проблема в том, что список генерируется вот так:

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

<ul id="yw0"> 
<li id="node4"><a href="/admin/product/category/id4">1</a></li> 
<li id="node5"><a href="/admin/product/category/id5">2</a></li> 
<li id="node6"><a href="/admin/product/category/id6">3</a></li> 
<li id="node7"><a href="/admin/product/category/id7">4</a></li> 
</ul>
 
А должно быть так (посмотрел в другом проекте, в котором все работает):

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

<ul id="yw0" class="treeview"> 
<li id="node4"><a href="/admin/product/category/id4">1</a></li> 
<li id="node5"><a href="/admin/product/category/id5">2</a></li> 
<li id="node6"><a href="/admin/product/category/id6">3</a></li> 
<li id="node7"><a href="/admin/product/category/id7">4</a></li> 
</ul>
 
Но почему не добавляется класс, и как его добавить самому я понять не могу
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение timlar »

Это указывается в компоненте (виджете) в свойстве htmlOptions:

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

<?php
$this->widget('CTreeView', array(
        'data'=>$tree,
        'animated'=>'medium',
        'collapsed'=>true,
        'persist'=>'mixed',
        'unique'=>true,
        'cssFile'=>'/css/treeview/jquery.treeview.css',
        'htmlOptions'=>array('id'=>'tree','class'=>'treeview'),
    ));
?>
Twitter: @timlar_ua
Archmage
Сообщения: 78
Зарегистрирован: 2010.03.03, 03:07
Откуда: Иркутск

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение Archmage »

Спасибо, помогло :)
Animum rege, qui nisi paret, imperat. (Управляй своим настроением, ибо оно, если не повинуется, то повеливает)
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение pr_o »

Я подключил ваше расширение в модуль... Не могу вылечить ошибку :(

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

YiiBase::include(CNestedSetBehavior.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory
Что делать? Как с путями разобраться?
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение timlar »

Проблема описана в тексте ошибки: No such file or directory - Не существует файл или директория. Т.е. фреймворк не может найти указанный файл. Возможно, где-то ошибка в путях при подключении расширения.
Twitter: @timlar_ua
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение pr_o »

Дело в том, что файл "TreeViewTreebehavior.php" находит и подключает... А дальше уже "CNestedSetBehavior.php" не находит :(
Может че и наковыряю)
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение pr_o »

Решение моей проблемы...
В файле "TreeBehavior.php" в начале я добавил строчку:

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

include dirname(__FILE__).'/'.'CNestedSetBehavior.php';
теперь Yii не ругается :)

правильно ли я поступил?

--------
ВСЕ РАБОТАЕТ!
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение R3D3 »

Небольшое замечание

Лучше вместо

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

 if($_POST['tree'] == 'manage') {
            
 
написать

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

 if(isset($_POST['tree']) && $_POST['tree'] == 'manage') {
            
 
а также вместо проверок типа

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

if($_POST['add']) {
 
делать

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

if(isset($_POST['add'])) {
 
Так как у меня на максимальных настройках вывода ошибок Yii валится с ошибками.
Yii Jabber Conference: yii@conference.jabber.ru
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение Svyatov »

А еще лучше делать проверку строк тремя равно "===", ибо с двумя можно нарваться на багу.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Nested Sets + CTreeView, CDropdownList, CListBox

Сообщение SpiLLeR »

Если проверять на ===, то перед этим все переменные нужно приводить ручками к нужному типу, т.к. пхп как хочет так и ставит тип.
Предупрежден - значит вооружен.
devKP.ru
Ответить