Дерево каталогов NESTED SETS

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Дерево каталогов NESTED SETS

Сообщение nepster »

Познакомился с данной вещью, но вот возникла проблема:
Суть проблемы, не получается полноценно вывести все дерево целиком со всеми вложенностями.

Решил проблему так: (собираем глобальный массив всех категорий)

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

            // список id категорий
            $category_id = array(1,2,3,4);
            
            // общий массив для вывода
            $categories = array();
            foreach($category_id as $id)
            {
                $categories_data = $this->findAll(array('condition'=>'root='.$id,'order'=>'lft'));
                $categories = array_merge($categories,$categories_data);
            }

            $level=0; 



// вывод списком

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

           foreach($categories as $n=>$category)
            {
                if($category->level==$level)
                    echo CHtml::closeTag('li')."\n";
                else if($category->level>$level)
                    echo CHtml::openTag('ul')."\n";
                else
                {
                    echo CHtml::closeTag('li')."\n";
            
                    for($i=$level-$category->level;$i;$i--)
                    {
                        echo CHtml::closeTag('ul')."\n";
                        echo CHtml::closeTag('li')."\n";
                    }
                }
            
                echo CHtml::openTag('li');
                echo CHtml::encode($category->name);
                $level=$category->level;
            }
            
            for($i=$level;$i;$i--)
            {
                echo CHtml::closeTag('li')."\n";
                echo CHtml::closeTag('ul')."\n";
            } 


// вывод выпадающим списком

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

               echo'<select>'."\n";
            
                    foreach($categories as $n=>$category)
                    {
                        if($category->level==$level)
                        {
                           // echo CHtml::closeTag('1option')."\n";
                        }
                        else if($category->level>$level);
                        else
                        {
                            //echo CHtml::closeTag('2option')."\n";
                    
                            for($i=$level-$category->level;$i;$i--)
                            {
                                
                            }
                        }
                    
                        echo CHtml::openTag('option');
                        $level=$category->level;
                        for($i=0;$i<$level;$i++)
                        {
                            echo '- ';
                        }
                        echo CHtml::encode($category->name);
                        echo CHtml::closeTag('option')."\n";
                    }
                    
                    for($i=$level;$i;$i--)
                    {
                       // echo CHtml::closeTag('3option')."\n";
                    }
            
            echo '</select>'; 



Все работает отлично. И при этом хотелось бы узнать, как можно отойти от array_marge и вывести все дерево полноценно ?
П.С. на 1500 записей вывод производится за 1 секунду. Вроде многовато.
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Дерево каталогов NESTED SETS

Сообщение lancecoder »

рядом с "хранилищем" сего чуда была инструкция, вы ее прочли? задайте вопрос конкретно по ней, что не понятно?
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Дерево каталогов NESTED SETS

Сообщение nepster »

да конечно, но ответа на вопрос
как вывести все дерево целиком (без вот этого велосипеда) не нашел?

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

            // список id категорий
            $category_id = array(1,2,3,4);
            
            // общий массив для вывода
            $categories = array();
            foreach($category_id as $id)
            {
                $categories_data = $this->findAll(array('condition'=>'root='.$id,'order'=>'lft'));
                $categories = array_merge($categories,$categories_data);
            }
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: Дерево каталогов NESTED SETS

Сообщение alexZT »

https://github.com/yiiext/nested-set-be ... adme_ru.md

Выборка дерева целиком

Это может быть осуществлено при помощи стандартных методов Active Record.

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

Для режима «одно дерево»:

Category::model()->findAll(array('order'=>'lft'));
Для режима «много деревьев»:

Category::model()->findAll(array('condition'=>'root=?','order'=>'lft'),array($root));
 
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Дерево каталогов NESTED SETS

Сообщение nepster »

да, но тут мы выводим дерево 1 категории.
А если главных категорий 4 к примеру ?

Это нужно создавать 1 категорию рут - не где ее не афишировать и работать уже с входящими ?
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: Дерево каталогов NESTED SETS

Сообщение alexZT »

nepster писал(а):да, но тут мы выводим дерево 1 категории.
А если главных категорий 4 к примеру ?

Это нужно создавать 1 категорию рут - не где ее не афишировать и работать уже с входящими ?
дядя, какие к черту категории? написано блин черным по белому : режим одно дерево, режим много деревьев, что ты туда положишь - то там и будет. Есть механизм, есть инструменты - бери и работай, не шаришь - слазь с дерева :)
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
Ответить