Создание дерева ресурсов на основе таблицы ресурсов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
EA-EKB
Сообщения: 12
Зарегистрирован: 2017.12.02, 13:46

Создание дерева ресурсов на основе таблицы ресурсов

Сообщение EA-EKB »

Доброго времени суток!

Сижу второй день и уже такого накостылил, что $&^#@%! Проблема в том, что не получается собрать дерево ресурсов дальше второго уровня.

Как я делаю... Получаю список всех документов из базы во временный одномерный массив следующего вида:

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

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 
            [title] => О луне
            [uri] => about
        )

    [1] => Array
        (
            [id] => 2
            [parent_id] => 
            [title] => Услуги
            [uri] => services
        )

    [2] => Array
        (
            [id] => 4
            [parent_id] => 
            [title] => Новости
            [uri] => news
        )

    [3] => Array
        (
            [id] => 5
            [parent_id] => 
            [title] => Фотогалерея
            [uri] => gallery
        )

    [4] => Array
        (
            [id] => 6
            [parent_id] => 
            [title] => Как добраться
            [uri] => contacts
        )

    [5] => Array
        (
            [id] => 7
            [parent_id] => 2
            [title] => Боулинг
            [uri] => services/bouling
        )

    [6] => Array
        (
            [id] => 8
            [parent_id] => 2
            [title] => Каток
            [uri] => services/katok
        )

    и т.д.
)
Затем ресурсы у которых родитель не указан сразу переношу в итоговый массив (из которого будет формироваться меню) в виде:

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

[1] => Array
        (
            [title] => О луне
            [uri] => about
        )
, где [1] - id документа.

Временный массив преобразую к следующему виду:

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

Array
(
    [2] => Array
        (
            [children] => Array
                (
                    [7] => Array
                        (
                            [id] => 7
                            [parent_id] => 2
                            [title] => Боулинг
                            [uri] => services/bouling
                            [children] => Array
                                (
                                    [28] => Array
                                        (
                                            [id] => 28
                                            [parent_id] => 7
                                            [title] => Тарифы и акции
                                            [uri] => services/bouling/tarify-i-akcii
                                        )

                                    [29] => Array
                                        (
                                            [id] => 29
                                            [parent_id] => 7
                                            [title] => Правила игры
                                            [uri] => services/bouling/pravila-igry
                                        )

                                    [30] => Array
                                        (
                                            [id] => 30
                                            [parent_id] => 7
                                            [title] => Экскурсия в музей боулинга
                                            [uri] => services/bouling/ekskursiya-v-muzej-boulinga
                                        )

                                    [31] => Array
                                        (
                                            [id] => 31
                                            [parent_id] => 7
                                            [title] => Спец меню
                                            [uri] => services/bouling/spec-menyu
                                        )

                                )

                        )

                    [8] => Array
                        (
                            [id] => 8
                            [parent_id] => 2
                            [title] => Каток
                            [uri] => services/katok
                        )

                    [9] => Array
                        (
                            [id] => 9
                            [parent_id] => 2
                            [title] => Детский клуб
                            [uri] => services/detskij-klub
                        )

                    [10] => Array
                        (
                            [id] => 10
                            [parent_id] => 2
                            [title] => Теннисный клуб
                            [uri] => services/tennisnyj-klub
                        )

                    [11] => Array
                        (
                            [id] => 11
                            [parent_id] => 2
                            [title] => Бильярд
                            [uri] => services/bilyard
                        )

                    [12] => Array
                        (
                            [id] => 12
                            [parent_id] => 2
                            [title] => Караоке
                            [uri] => services/karaoke
                        )

                    [13] => Array
                        (
                            [id] => 13
                            [parent_id] => 2
                            [title] => Квесты в реальности
                            [uri] => services/kvesty-v-realnosti
                        )

                    [14] => Array
                        (
                            [id] => 14
                            [parent_id] => 2
                            [title] => Кондитерская
                            [uri] => services/konditerskaya
                        )

                    [15] => Array
                        (
                            [id] => 15
                            [parent_id] => 2
                            [title] => Банкетный зал
                            [uri] => services/banketnyj-zal
                        )

                    [16] => Array
                        (
                            [id] => 16
                            [parent_id] => 2
                            [title] => Кафе
                            [uri] => services/kafe
                        )

                    [17] => Array
                        (
                            [id] => 17
                            [parent_id] => 2
                            [title] => Меню
                            [uri] => services/menu
                        )

                    [18] => Array
                        (
                            [id] => 18
                            [parent_id] => 2
                            [title] => Школа балета
                            [uri] => services/shkola-baleta
                        )

                    [19] => Array
                        (
                            [id] => 19
                            [parent_id] => 2
                            [title] => Аренда
                            [uri] => services/arenda
                        )

                    [20] => Array
                        (
                            [id] => 20
                            [parent_id] => 2
                            [title] => Luna. Disco. Nicht
                            [uri] => services/luna-disco-nicht
                        )

                    [21] => Array
                        (
                            [id] => 21
                            [parent_id] => 2
                            [title] => Детский лагерь
                            [uri] => services/detskij-lager
                        )

                    [22] => Array
                        (
                            [id] => 22
                            [parent_id] => 2
                            [title] => Корпоративные мероприятия
                            [uri] => services/korporativnye-meropriyatiya
                        )

                )

        )

    [7] => Array
        (
            [children] => Array
                (
                    [28] => Array
                        (
                            [id] => 28
                            [parent_id] => 7
                            [title] => Тарифы и акции
                            [uri] => services/bouling/tarify-i-akcii
                        )

                    [29] => Array
                        (
                            [id] => 29
                            [parent_id] => 7
                            [title] => Правила игры
                            [uri] => services/bouling/pravila-igry
                        )

                    [30] => Array
                        (
                            [id] => 30
                            [parent_id] => 7
                            [title] => Экскурсия в музей боулинга
                            [uri] => services/bouling/ekskursiya-v-muzej-boulinga
                        )

                    [31] => Array
                        (
                            [id] => 31
                            [parent_id] => 7
                            [title] => Спец меню
                            [uri] => services/bouling/spec-menyu
                        )

                )

        )

)
, где индекс первого уровня - id ресурса самого верхнего уровня (того, у которого не указан родитель), индексы вложенного массива children - id ресурса второго уровня и т.д.

Максимум, что получилось это дойти до 3его уровня во временном массиве (и то очистить его от уже ненужных массивов не получается), но смержить его с итоговым массивом не получается.

Код формирующий массивы:

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

private function find_submenu_parent($array_for_search, $submenu_array, $submenu_parent_id) {
        # пробегаем по всему массиву переданному параметром $array_for_search...
        foreach ($array_for_search as $idx => $item) {
            # ... если в текущем элементе массива $array_for_search есть элемент 'children', он является массивом и содержит ключ, 
            #     равный переданному параметром $submenu_parent_id, id родителя подменю - сливаем массив $item['children'][$submenu_parent_id] 
            #     с массивом переданным параметром $submenu_array
            if (isset($item['children']) && is_array($item['children']) && array_key_exists($submenu_parent_id, $item['children'])) {
                $array_for_search[$idx]['children'][$submenu_parent_id] = array_merge($item['children'][$submenu_parent_id], $submenu_array);
                // return [1];
            
            # ... если в текущем элементе массива $array_for_search есть элемент 'children', он является массивом, но не содержит ключ, 
            #     равный переданному параметром $submenu_parent_id, id родителя подменю - вызываем $this->find_submenu_parent для массива 'children' текущего элемента
            } else if (isset($item['children']) && is_array($item['children']) && !array_key_exists($submenu_parent_id, $item['children'])) {
                $array_for_search[$idx]['children'] = $this->find_submenu_parent($item['children'], $submenu_array, $submenu_parent_id);
                // return [2];
            
            # ... иначе, если в текущем элементе массива $array_for_search не найден элемент 'children' - удаляем текущий элемент из массива $array_for_search
            }/* else {
                unset(
                    $array_for_search[$idx]
                );
                // return [3];
            }
            */
            
            # заносим в массив $iterated $idx перебранных элементов в массиве $array_for_search
            // $iterated[] = $idx;
        }
        
        return $array_for_search;
    }
    
    public function run()
    {
        # получаем все документы сайта
        $all_docs_tmp = Document::find()
                            ->select([
                                'id',
                                'parent_id',
                                'title',
                                'uri'
                            ])
                            ->where([
                                'status'       => 1,
                                'show_in_menu' => 1
                            ])
                            ->orderBy('parent_id ASC')
                            ->asarray()
                            ->all();
        
        # реструктурируем массив со всеми документами сайта
        $i = 1;
        $merged = [];
        foreach ($all_docs_tmp as $doc) {
            $doc_parent_id = $doc['parent_id'] ?: 0;
            
            # если у документа не указан родитель - заносим его в первый уровень массива $doc_tree? после чего убираем лишние поля id и parent_id ...
            if ($doc_parent_id == 0) {
                $doc_tree[$doc['id']] = $doc;
                
                # удаляем лишние поля
                unset(
                    $doc_tree[$doc['id']]['id'],
                    $doc_tree[$doc['id']]['parent_id']
                );
                
            # ... иначе создаём элемент 'children' в элементе с ключом, равным $doc_parent_id, в который заносим текущий документ, после чего удаляем 
            #     лишние поля id и parent_id добавленного документа ...
            } else {
                $all_docs[$doc_parent_id]['children'][$doc['id']] = $doc;
                
                # если в индексах первого уровня массива $doc_tree найден $doc_parent_id - сливаем массив $doc_tree[$doc_parent_id] с массивом $all_docs[$doc_parent_id] ...
                if (array_key_exists($doc_parent_id, $doc_tree)/* && !in_array($doc_parent_id, $merged)*/) {
                    $doc_tree[$doc_parent_id] = array_merge($doc_tree[$doc_parent_id], $all_docs[$doc_parent_id]);
                    
                    # удаляем обработанные элементы из массива $all_docs
                    /*
                    unset(
                        $all_docs[$doc_parent_id]
                    );
                    */
                    
                    if (!in_array($doc_parent_id, $merged)) {
                        $merged[] = $doc_parent_id;
                        /*
                        unset(
                            $all_docs[$doc_parent_id]
                        );
                        */
                    }
                
                # ... иначе ищем во всём массиве $all_docs документ с id равным $doc_parent_id (элемент с индексом $doc_parent_id) и сливаем с ним массив текущего документа
                } else {
                    $all_docs = $this->find_submenu_parent($all_docs, $all_docs[$doc_parent_id], $doc_parent_id);
                }
                
                # удаляем лишние поля
                /*
                unset(
                    $all_docs[$doc_parent_id]['children'][$doc['id']]['id'],
                    $all_docs[$doc_parent_id]['children'][$doc['id']]['parent_id']
                );
                */
            }
        }
        
        
        return $this->render('@app/modules/menu/views/default/widgets/menu.php', [
            'doc_tree'   => $doc_tree,
            'all_docs'   => $all_docs,
            'merged'     => $merged,
            'iterations' => ''
        ]);
             
        
        # строим дерево
        $i = 1; # - номер прохода по массиву $all_docs
        $iterations = '';
        
        while (count($all_docs) > 0 && $i <= 1) { # обходим массив $all_docs пока он не опустеет или пока количество проходов не достигнет 3
            foreach ($all_docs as $idx => $doc) {
                if ($doc['parent_id'] == NULL) { # если документ не имеет родителя...
                    $doc_tree[$doc['id']] = $doc;
                    
                    # добавляем id документов у которых нет родителей в массив
                    $root_docs_ids[] = $doc['id'];
                    
                    # удаление лишних полей и элементов массива $all_docs
                    unset(
                        $doc_tree[$doc['id']]['id'],
                        $doc_tree[$doc['id']]['parent_id'],
                        $all_docs[$idx]
                    );
                } elseif (in_array($doc['parent_id'], $root_docs_ids)) { # если у документа есть родитель...
                    $doc_tree[$doc['parent_id']]['children'][$doc['id']] = $doc;
                    
                    # удаление лишних полей и элементов массива $all_docs
                    unset(
                        $doc_tree[$doc['parent_id']]['children'][$doc['id']]['id'],
                        $doc_tree[$doc['parent_id']]['children'][$doc['id']]['parent_id'],
                        $all_docs[$idx]
                    );
                } else {
                    $all_docs[$doc['id']] = $doc;
                    
                    # удаление лишних полей и элементов массива $all_docs
                    unset(
                        $all_docs[$doc['id']]['id'],
                        $all_docs[$idx]
                    );
                }
                
                # удаляем обработанный документ из массива всех документов
                // unset($all_docs[$idx]);
            }
            
            $iterations .= ($iterations != '') ? ', '.$i : $i;
            
            $i++;
        }
        
        return $this->render('@app/modules/menu/views/default/widgets/menu.php', [
            'doc_tree' => $doc_tree,
            'all_docs' => $all_docs,
            'iterations' => $iterations
        ]);
Решение де**мовое, но подходящих готовых решений, к сожалению, не нашел. Пытался сделать через рекурсию (find_submenu_parent), но безуспешно, массив просто не изменяется никак.

Наверняка есть способ проще, который я из-за отсутствия большого опыта не вижу.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение proctoleha »

Если мы говорим о дереве, то мы, очевидно подразумеваем, что есть/или-нет корень, родители, дети, внуки...
По поводу корня: я поставил есть/или-нет, потому что у одного приложения может быть несколько независимых корней, или, если приложение простое, не быть вообще. Если есть несколько независимых корней, то у каждого из них своя иерархия.

Есть ли поведение, которое позволяет без головной боли выполнять команды: дай мне всех родителей вместе с детьми, или дай мне всех потомков (детей, внуков, правнуков ...) вот этого родителя?

Все давно придумано до нас: https://github.com/creocoder/yii2-nested-sets

Советую помедитировать над этой темой Nested Sets, понять как это работает, сделать разные выборки. И задавать вопросы дальше. Например, как вывести многоуровневое меню любой вложенности на сайте
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
EA-EKB
Сообщения: 12
Зарегистрирован: 2017.12.02, 13:46

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение EA-EKB »

proctoleha писал(а): 2018.06.26, 15:48 Если мы говорим о дереве, то мы, очевидно подразумеваем, что есть/или-нет корень, родители, дети, внуки...
По поводу корня: я поставил есть/или-нет, потому что у одного приложения может быть несколько независимых корней, или, если приложение простое, не быть вообще. Если есть несколько независимых корней, то у каждого из них своя иерархия.

Есть ли поведение, которое позволяет без головной боли выполнять команды: дай мне всех родителей вместе с детьми, или дай мне всех потомков (детей, внуков, правнуков ...) вот этого родителя?

Все давно придумано до нас: https://github.com/creocoder/yii2-nested-sets

Советую помедитировать над этой темой Nested Sets, понять как это работает, сделать разные выборки. И задавать вопросы дальше. Например, как вывести многоуровневое меню любой вложенности на сайте
спасибо за ссылку, поизучаю
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение andku83 »

на вход подаем массив элементов индексированных по id вида:

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

Array
(
    [5] => Array
        (
            [id] => 5
            [parent_id] => 2
            [title] => О луне
            [uri] => about
        )
        ...
)
на выходе получаем дерево

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

    protected function createTree($data)
    {
        $tree = [];
        foreach ($data as $key => &$item) {
            if (!$item['parent_id']){
                $tree[$item['id']] = &$item;
            } elseif(!empty($data[$item['parent_id']])) {
                    $data[$item['parent_id']]['items'][$item['id']] = &$item;
            }
        }
        return $tree;
    }
EA-EKB
Сообщения: 12
Зарегистрирован: 2017.12.02, 13:46

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение EA-EKB »

proctoleha писал(а): 2018.06.26, 15:48 Все давно придумано до нас: https://github.com/creocoder/yii2-nested-sets

Советую помедитировать над этой темой Nested Sets, понять как это работает, сделать разные выборки. И задавать вопросы дальше. Например, как вывести многоуровневое меню любой вложенности на сайте
Установил yii2-nested-sets и klisl/yii2-nested-sets-drag-and-drop. При попытке создания меню выдаёт ошибку "Setting unknown property: app\models\Menu::url" и ссылается на строку 88:

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

84        if ($model->load(Yii::$app->request->post())) {
85            //Если нет корневого элемента (пустая таблица)
86            if (!$root) {
87                /** @var  $rootModel Menu|NestedSetsBehavior */
88                $rootModel = new Menu(['name' => 'root', 'url' => '/']);
89                $rootModel->makeRoot(); //делаем корневой
90                $model->appendTo($rootModel);
91            } else {
92                $model->appendTo($root); //вставляем в конец корневого элемента
Как я понимаю это из-за того, что в модели не прописано поле url. Но согласно инструкции его и не должно быть. Или это просто упущение в инструкции (так как в ней рассмотрен случай с закомментированным treeAttribute в behaviors модели, у меня он раскомментирован, так как необходимо сделать несколько отдельных меню на сайте) и его надо добавить самому? Хотя в применяемой миграции опять же про него ни слова, хотя вроде как оно должно быть предусмотрено.

Добавлено позже:
Проблему решил, но появилась другая - не получается добавить элемент, выдаёт ошибку "Method "app\models\Menu::insert" is not supported for inserting new nodes." Самое интересное, что метода insert в модели Menu нет. Удаление тоже не работает.

Если создать его вручную и потом обновить через админку, то обновление работает.
Последний раз редактировалось EA-EKB 2018.06.27, 15:33, всего редактировалось 1 раз.
EA-EKB
Сообщения: 12
Зарегистрирован: 2017.12.02, 13:46

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение EA-EKB »

andku83 писал(а): 2018.06.26, 17:44 на вход подаем массив элементов индексированных по id вида:

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

Array
(
    [5] => Array
        (
            [id] => 5
            [parent_id] => 2
            [title] => О луне
            [uri] => about
        )
        ...
)
на выходе получаем дерево

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

    protected function createTree($data)
    {
        $tree = [];
        foreach ($data as $key => &$item) {
            if (!$item['parent_id']){
                $tree[$item['id']] = &$item;
            } elseif(!empty($data[$item['parent_id']])) {
                    $data[$item['parent_id']]['items'][$item['id']] = &$item;
            }
        }
        return $tree;
    }
Спасибо, но к сожалению этот вариант переносит третий уровень меню в первый и некорректно располагает подменю (например: подменю с родителем 2 размещалось в родителе с id 4). После замены его на:

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

protected function createTree($data)
    {
        $tree = [];
        
        foreach ($data as $key => &$item)
            if (!$item['parent_id'])
                $tree[$item['id']] = &$item;
            elseif(!empty($item['parent_id']))
                $tree[$item['parent_id']]['items'][$item['id']] = &$item;
        
        return $tree;
    }
меню второго уровня стало размещаться в правильном родителе, но проблема третьего уровня вложенности не решилась. А такой вариант, точнее результат, у меня был изначально.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение BalykhinAS »

возможно я не внимательно вник в проблему - вопрос в том как построить дерево из всех элементов массива?
EA-EKB
Сообщения: 12
Зарегистрирован: 2017.12.02, 13:46

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение EA-EKB »

Wizard писал(а): 2018.06.27, 14:55 возможно я не внимательно вник в проблему - вопрос в том как построить дерево из всех элементов массива?
да, нужно построить дерево из всех элементов массива, который содержит в себе все записи определённой таблицы в базе
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение BalykhinAS »

могу предложить очередной велосипед, само собой вам необходимо адаптировать под свою задачу

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

<?php

namespace app\models\page\repository;
use app\models\page\Page;

/**
 * Class PageRepository
 * @package app\models\page\repository
 */
class PageRepository
{
    public static $all = [];
    public static $slugs = [];
    public static $children = [];
    public static $subpages = [];

    public function __construct()
    {
        if( empty(self::$all) ) {
            $this->init();
        }
    }

    public function getAll()
    {
        if( !empty(self::$all) ) {
            return self::$all;
        }
        return [];
    }

    public function getById($id)
    {
        if( !empty(self::$all[$id]) ) {
            return self::$all[$id];
        }
        return false;
    }

    public function getBySlug($slug)
    {
        if( !empty(self::$slugs[$slug]) ) {
            return self::$slugs[$slug];
        }
        return false;
    }

    public function getPath($id)
    {
        $path = [];
        while ( $id )  {
            $page = $this->getById($id);
            $path[] = $page;
            $id = $page->parent_id;
        }
        return array_reverse($path);
    }

    public function getSubpages($parentId = 0)
    {
        if( !empty(self::$subpages[$parentId]) ) {
            return self::$subpages[$parentId];
        }
        return [];
    }

    public function getChildren($id, $acc = [])
    {
        $acc[] = $id;
        foreach ( $this->getSubpages($id) as $page ) {
            $acc = array_merge($acc, $this->getChildren($page->id));
        }
        return $acc;
    }

    public function init()
    {
        if(!empty(self::$all)) {
            return false;
        }

        $pages = Page::find()
            ->indexBy('id')
            ->orderBy('sort ASC')
            ->asArray()
            ->all();

        foreach($pages as $page) {
            $page = PageInit::create(
                $page['id'],
                $page['parent_id'],
                $page['name'],
                $page['slug']
            );

            self::$slugs[$page->slug] = self::$all[$page->id] = $page;
            self::$subpages[$page->parent_id][$page->id] = $page;
        }

        unset($pages);
    }
}

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

<?php

namespace app\widgets;

use yii\base\Widget;
use yii\bootstrap\Nav;
use app\models\page\Page;
use app\models\page\repository\PageRepository;

class TreePages extends Widget
{
    public $pages = [];
    public $childrens = [];

    public function init()
    {
        $this->pages = \Yii::$container->get(PageRepository::class);
        parent::init();
    }

    public function run()
    {
        $view = $this->getView();

        if( !empty($view->params['current_page']) ) {
            $this->childrens = array_map(function($page) {
                return $page->id;
            }, $this->pages->getPath($view->params['current_page']->id));
        }

        print Nav::widget([
            'id' => 'header-nav-left',
            'options' => ['class' => 'navbar-nav navbar-left'],
            'items' => $this->getPagesTree($this->pages->getSubpages())
        ]);
    }

    public function getPagesTree($items = [])
    {
        $pages = array_filter(array_map(function($page) {
            if($page->visible == Page::VISIBLE_SHOW && $page->slug !== '/') {
                $item = [
                    'label' => $page->name,
                    'url' => ['page/view', 'slug' => $page->slug],
                    'items' => $this->getPagesTree($this->pages->getSubpages($page->id))
                ];
                if( in_array($page->id, $this->childrens)) {
                    $item['active'] = true;
                }
                return $item;
            }
        }, $items));

        return $pages;
    }
}
PageInit - не обязательный
Последний раз редактировалось BalykhinAS 2018.06.27, 16:25, всего редактировалось 1 раз.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение andku83 »

EA-EKB писал(а): 2018.06.27, 13:13
Спасибо, но к сожалению этот вариант переносит третий уровень меню в первый и некорректно располагает подменю (например: подменю с родителем 2 размещалось в родителе с id 4). После замены его на:
вы точно все сделали что было указано выше?
andku83 писал(а): 2018.06.26, 17:44 на вход подаем массив элементов индексированных по id вида:
если вы используете ActiveRecord то вам поможет:

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

...::find()->indexBy('id')...
EA-EKB
Сообщения: 12
Зарегистрирован: 2017.12.02, 13:46

Re: Создание дерева ресурсов на основе таблицы ресурсов

Сообщение EA-EKB »

andku83 писал(а): 2018.06.26, 17:44 если вы используете ActiveRecord то вам поможет:

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

...::find()->indexBy('id')...
а вот про indexBy не знал, велосипедил своё, где индексы массива в цикле переназначал полем id из таблицы...
andku83 писал(а): 2018.06.27, 16:11 вы точно все сделали что было указано выше?
добавление indexBy решило проблему, спасибо.

пойду велосипедить вывод через виджет menu
Ответить