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

kartik netsted sets

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, В бэкенде использую kartik-v Tree Manager. Как теперь создать дерево для frontend в виде выпадающего меню? Может быть есть какое-нибудь готовое решение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2020, 16:34
Ответы с готовыми решениями:

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

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

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

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

8
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
22.02.2020, 16:59 2
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  [ТС] 3
данный код не подходит, у меня таблица выглядит следующим образом:

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
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
22.02.2020, 17:40 4
lev_, Не понял почему не подходит, Я уже говорил, что у меня вместо lvl поле называется depth. Просто в классе NestedSetsTree вместо depth пропишите lvl
0
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354
22.02.2020, 17:47  [ТС] 5
Ошибку выдает: Class 'frontend\components\NestedSetsTree' not found
0
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
22.02.2020, 17:54 6
Цитата Сообщение от 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  [ТС] 7
Цитата Сообщение от lev_ Посмотреть сообщение
Class 'frontend\components\NestedSetsTree' not found
моя опечатка в имени класса была.
но в представлении возвращает пустой массив(
0
2232 / 1278 / 611
Регистрация: 23.08.2015
Сообщений: 3,228
22.02.2020, 18:03 8
Цитата Сообщение от lev_ Посмотреть сообщение
но в представлении возвращает пустой массив(
Я не экстрасенс, нужно смотреть код. Вообще я в вас веру, думаю если чуть больше уделите время, то сможете разобраться)
0
4 / 4 / 3
Регистрация: 26.05.2014
Сообщений: 354
22.02.2020, 18:07  [ТС] 9
спасибо, постараюсь
0
22.02.2020, 18:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.02.2020, 18:07
Помогаю со студенческими работами здесь

Yii2 ошибка при использовании kartik ExpandRow
Здравствуйте! Подскажите, может кто сталкивался, делал связанную crud по этому видео...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru