Построение дерева

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Построение дерева

Сообщение unknownby »

Подскажите средства при помощи которых можно построить деревья, на подобие kartik-v TreeView
Два варианта построения дерева
при помощи root, left, right, level (и т.д. поля для дерева) или через id и parent_id записей.

Чтобы была подгрузка веток (возможно ajax подгрузка), мультиселек/одинарный выбор.
Т.к. вывод сразу 12к записей притормаживают систему. (дерево отображается в форме, которую юзер заполняет часто).
Как вариант еще с подключенной версионностью данных. :D
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Построение дерева

Сообщение maleks »

Попробуйте.
Дерево выбирается одним запросом, но потом рекурсиями строится для формата удобного к выводу.
Ничто не мешает кешировать.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Построение дерева

Сообщение unknownby »

maleks писал(а): 2019.12.14, 07:21 Попробуйте.
Дерево выбирается одним запросом, но потом рекурсиями строится для формата удобного к выводу.
Ничто не мешает кешировать.
Построение дерева таким образом не устроит, т.к. справочник будет приходить из вне. И предположительно два варианта каким образом он может быть сделан через root-left-right-level или через parent_id. Да и у того же kartik-v есть кэширование в виджете.
Явно не будет в справочнике path и weight :D
А вообще может быть сделано через root-left-right-level и parent_id :D одновременно

Но суть в ajax подгрузке данных, чтобы вывело сразу первый уровень дерева, а дальше при открытии открывалось остальное.
Или придется писать свой widget с ajax подгрузкой и шл... :D

Да и просто построить дерево это не проблема. Функционировать должно точно так же как у него
Дерево kartik-v
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Построение дерева

Сообщение yiiliveext »

А где и как хранится пришедший справочник?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Построение дерева

Сообщение unknownby »

Нашел то что нужно DropdownTree, но проблема в том, что после сохранения из таблицы выводится верхний уровень дерева. Остальные идентификаторы установились, но не отображаются.
Может кто посмотрит и подскажет установку значений из БД, если внес значения уже.
Первоначальное наполнение

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

$firts_node = [];
$tree = MyClass::find()->where(['parent_id' => 0])->orderBy(['id' => SORT_ASC, 'name' => SORT_ASC])->all();
foreach($tree as $v){
        $firts_node[] = ['id' => $v->id, 'label' => $v->name, 'items' => []];
}
Установлена ajax подгрузка данных при разворачивании дерева.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Построение дерева

Сообщение unknownby »

yiiliveext писал(а): 2019.12.16, 14:53 А где и как хранится пришедший справочник?
Справочник будет храниться в БД.
Т.к. не понятно с какой структурой сделано два справочника один использует root-left-right-level для построения дерева, другой parent_id.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Построение дерева

Сообщение yiiliveext »

unknownby писал(а): 2019.12.16, 16:22
yiiliveext писал(а): 2019.12.16, 14:53 А где и как хранится пришедший справочник?
Справочник будет храниться в БД.
Т.к. не понятно с какой структурой сделано два справочника один использует root-left-right-level для построения дерева, другой parent_id.
Сделайте один с полями left, right, depth, parent_id и ставите https://github.com/creocoder/yii2-nested-sets.
Если пришло в виде nested sets, то просто загонятете в справочник данные и прописываете parent_id через model->parents(1). Если пришло в виде adjacency list то загоняете через $model->makeRoot() и $model->appendTo, прописывая также parent_id. И дальше можете использовать как nested sets виджеты (того же картика), так и adjacency list.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Построение дерева

Сообщение unknownby »

yiiliveext писал(а): 2019.12.16, 16:40 Сделайте один с полями left, right, depth, parent_id и ставите https://github.com/creocoder/yii2-nested-sets.
Если пришло в виде nested sets, то просто загонятете в справочник данные и прописываете parent_id через model->parents(1). Если пришло в виде adjacency list то загоняете через $model->makeRoot() и $model->appendTo, прописывая также parent_id. И дальше можете использовать как nested sets виджеты (того же картика), так и adjacency list.
В виджете картика используется креокодер. Суть в том, чтобы был выпадающий список в виде дерева, где будет работать ajax подгрузка данных и будет выбор как одного, так и множественный выбор с сохранением в БД. В принципе dropdowntree подходит, но он не обновлялся уже давненько и там есть ньюансы.
А именно:
1. Не подгружаются все сохраненные данные из БД, только верхний уровень показывается (над этим сейчас работать буду, предположение что не подгружаются из-за того, что дерево подгружается ajax-ом).
2. Нет множественного выбора в плане когда открывается ветка дерева и из неё нужно выбрать всё (без нажатий 20 раз на все узлы, а нажимается на один верхний и все остальные 19 узлов выбираются автоматически). У картика такое реализовано тут демо
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Построение дерева

Сообщение yiiliveext »

unknownby писал(а): 2019.12.17, 08:28 В виджете картика используется креокодер.
И? Что мешает сбилдить nested sets и прицепить это поведение?
Вот вам даже на чистом SQL ребилд таблицы с ajacency list на nested sets https://habr.com/ru/post/153861/
Ответить