С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: Yii, Yii2
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354

kartik netsted sets

22.02.2020, 16:34. Показов 1260. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, В бэкенде использую kartik-v Tree Manager. Как теперь создать дерево для frontend в виде выпадающего меню? Может быть есть какое-нибудь готовое решение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2020, 16:34
Ответы с готовыми решениями:

Yii2 kartik/fileinput
Всем привет, сразу скажу, что читал доку по kartik/fileinput, но решения на свои проблемы так и не нашел. И так, имеется обычный crud...

Yii2 Export PDF -kartik-v-
сделал по документации экспорт в PDF таблицы(gridview), но как сделать чтобы в PDF перенести допустим строчку с тегом <p> или Любую...

Правильное использование DatePicker от kartik
Всем привет, никак не могу найти ответ на вопрос сабжа. Вывожу модальное окно, разместил на нем echo DatePicker::widget( ...

8
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,814
22.02.2020, 16:59
lev_, Где-то в просторах интернета нашел такой класс, не помню где его взял
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
 
namespace app\helpers;
 
class NestedSetsTreeArray
{
    /**
     * @var string
     */
    public $depthAttribute = 'depth';
 
    /**
     * @var string
     */
    public $childrenOutAttribute = 'children';
 
    /**
     * Построение дерева Nested Sets в виде массива
     *
     * @param array $collection Массив строк из БД
     * @return array
     */
    public function tree(array $collection)
    {
 
        $trees = []; // Дерево
 
        if (count($collection) > 0) {
 
            //Добавляем свои элементы
            foreach ($collection as &$col) {
                $col = $this->addItem($col);
            }
 
            // Узел. Используется для создания иерархии
            $stack = array();
 
            foreach ($collection as $node) {
                $item = $node;
                $item[$this->childrenOutAttribute] = array();
 
                // Количество элементов узла
                $l = count($stack);
 
                // Проверка имеем ли мы дело с разными уровнями
                while($l > 0 && $stack[$l - 1][$this->depthAttribute] >= $item[$this->depthAttribute]) {
                    array_pop($stack);
                    $l--;
                }
 
                // Если это корень
                if ($l == 0) {
                    // Создание корневого элемента
                    $i = count($trees);
                    $trees[$i] = $item;
                    $stack[] = &$trees[$i];
                } else {
                    // Добавление элемента в родительский
                    $i = count($stack[$l - 1][$this->childrenOutAttribute]);
                    $stack[$l - 1][$this->childrenOutAttribute][$i] = $item;
                    $stack[] = &$stack[$l - 1][$this->childrenOutAttribute][$i];
                }
            }
        }
 
        return $trees;
    }
 
 
    /**
     * Добавляет в массив дополнительные элементы
     * @param $node array Текущий элемент массива (строка из БД)
     * @return array
     */
    protected function addItem($node)
    {
        $newNode = [];
        return array_merge($node, $newNode);
    }
}
Я работаю с другим nestedSets behavior, там вместо lvl идет depth.
Данный класс делает вложенный массив, и работает с массивами, т.е. данные нужно доставаить через asArray()

Так же я его адаптировал и под ActiveRecord -ы

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
 
namespace app\helpers;
 
class NestedSetsTree
{
 
    /**
     * Построение дерева Nested Sets в виде массива
     *
     * @param array $collection Массив строк из БД
     * @return array
     */
    public function tree(array $collection)
    {
 
        $trees = []; // Дерево
 
        if (count($collection) > 0) {
 
            // Узел. Используется для создания иерархии
            $stack = array();
 
            foreach ($collection as $node) {
                $item = [
                    'model' => $node,
                    'items' => []
                ];
 
                // Количество элементов узла
                $l = count($stack);
 
                // Проверка имеем ли мы дело с разными уровнями
                while($l > 0 && $stack[$l - 1]['model']->depth >= $node->depth) {
                    array_pop($stack);
                    $l--;
                }
 
                // Если это корень
                if ($l == 0) {
                    // Создание корневого элемента
                    $i = count($trees);
                    $trees[$i] = $item;
                    $stack[] = &$trees[$i];
                } else {
                    // Добавление элемента в родительский
                    $i = count($stack[$l - 1]['items']);
                    $stack[$l - 1]['items'][$i] = $item;
                    $stack[] = &$stack[$l - 1]['items'][$i];
                }
            }
        }
 
        return $trees;
    }
}
Который формирует вложенный массив с ключами 'model' и 'items'. Сюда можно передать массив объектов.

Добавлено через 1 минуту
Соответственно при получении из бд вы должны сортировать их по lft

Добавлено через 3 минуты
Использование
PHP
1
2
$posts = Post::find()->orderBy('lft')->all(); //или asArray() , тогда используем NestedSetsTreeArray
$tree = (new NestedSetsTree())->tree($posts);
0
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354
22.02.2020, 17:33  [ТС]
данный код не подходит, у меня таблица выглядит следующим образом:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public function up()
    {
      
        $this->createTable(self::TABLE_NAME, [
            'id' => $this->bigPrimaryKey(),
            'root' => $this->integer(),
            'lft' => $this->integer()->notNull(),
            'rgt' => $this->integer()->notNull(),
            'lvl' => $this->smallInteger(5)->notNull(),
            'name' => $this->string(60)->notNull(),
            'icon' => $this->string(255),
// различные опции 
            'icon_type' => $this->smallInteger(1)->notNull()->defaultValue(1),
            'active' => $this->boolean()->notNull()->defaultValue(true),
            'selected' => $this->boolean()->notNull()->defaultValue(false),
            'disabled' => $this->boolean()->notNull()->defaultValue(false),
            'readonly' => $this->boolean()->notNull()->defaultValue(false),
            'visible' => $this->boolean()->notNull()->defaultValue(true),
            'collapsed' => $this->boolean()->notNull()->defaultValue(false),
            'movable_u' => $this->boolean()->notNull()->defaultValue(true),
            'movable_d' => $this->boolean()->notNull()->defaultValue(true),
            'movable_l' => $this->boolean()->notNull()->defaultValue(true),
            'movable_r' => $this->boolean()->notNull()->defaultValue(true),
            'removable' => $this->boolean()->notNull()->defaultValue(true),
            'removable_all' => $this->boolean()->notNull()->defaultValue(false)
        ], $tableOptions);
        $this->createIndex('tree_NK1', self::TABLE_NAME, 'root');
        $this->createIndex('tree_NK2', self::TABLE_NAME, 'lft');
        $this->createIndex('tree_NK3', self::TABLE_NAME, 'rgt');
        $this->createIndex('tree_NK4', self::TABLE_NAME, 'lvl');
        $this->createIndex('tree_NK5', self::TABLE_NAME, 'active');
    }
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,814
22.02.2020, 17:40
lev_, Не понял почему не подходит, Я уже говорил, что у меня вместо lvl поле называется depth. Просто в классе NestedSetsTree вместо depth пропишите lvl
0
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354
22.02.2020, 17:47  [ТС]
Ошибку выдает: Class 'frontend\components\NestedSetsTree' not found
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,814
22.02.2020, 17:54
Цитата Сообщение от lev_ Посмотреть сообщение
Ошибку выдает: Модуль 'treemanager' ДОЛЖЕН быть установлен в вашем файле конфигурации Yii
lev_, Это не относится к моим классам, они вообще приложение Yii никак не используют.
Так как я этим kartik-v Tree Manager не пользуюсь, особо не могу помочь. Видимо вы подключили этот компонент в backend, а теперь его нужно подключить и во frontend.

Добавлено через 3 минуты
Цитата Сообщение от lev_ Посмотреть сообщение
Ошибку выдает: Class 'frontend\components\NestedSetsTree' not found
Так это у вас с namespase что-то. Либо не прописали корректный namespace внутри файла с классом NestedSetsTree, либо не импортировали класс.
0
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354
22.02.2020, 17:58  [ТС]
Цитата Сообщение от lev_ Посмотреть сообщение
Class 'frontend\components\NestedSetsTree' not found
моя опечатка в имени класса была.
но в представлении возвращает пустой массив(
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,814
22.02.2020, 18:03
Цитата Сообщение от lev_ Посмотреть сообщение
но в представлении возвращает пустой массив(
Я не экстрасенс, нужно смотреть код. Вообще я в вас веру, думаю если чуть больше уделите время, то сможете разобраться)
0
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354
22.02.2020, 18:07  [ТС]
спасибо, постараюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2020, 18:07
Помогаю со студенческими работами здесь

Yii2. Преобразование выводимых значений в Kartik EditableColumn
Доброго времени суток! При смене значения в EditableColumn мне выводится не преобразованное значение из базы, а мне нужно...

Yii2 ошибка при использовании kartik ExpandRow
Здравствуйте! Подскажите, может кто сталкивался, делал связанную crud по этому видео https://www.youtube.com/watch?v=7u0p8fKriy0 Всё...

Qt large data sets
Подскажите, есть ли способ на Qt держать во вьюхе модель со скажем более чем 1к строк. Мне нужно прокручивать бльшое кол-во данных, но...

C# строка [Description('Gets or sets .............')] на VB
Как написать эту строку на VB - это C#

Починить mysql nested sets
Как можно починить дерево nested sets? Много мануалов есть как создавать http://zabolotnev.com/mysql-nested-sets, но как починить,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru