Задать вопрос

Как сделать древовидный список в Yii2?

Здравствуйте!

Имеется БД с категориями. Есть как главные категории, так и подкатегории.

Пример:
- Фильмы (id=1, parent_id=0)
------ Фантастика (id=3, parent_id=1)
------ Ужасы (id=4, parent_id=1)
- Сериалы (id=2, parent_id=0)

Получилось вывести список категорий такого вида:
- Фильмы (id=1, parent_id=0)
- Сериалы (id=2, parent_id=0)
- Фантастика (id=3, parent_id=1)
- Ужасы (id=4, parent_id=1)

А необходимо сделать так, чтобы подкатегории были под главными категориями.

Сортировка по id и без вложения.

Надеюсь что я понятно расписал суть того, что нужно. Заранее спасибо за помощь.
  • Вопрос задан
  • 6487 просмотров
Подписаться 7 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@LAV45
class Menu extends ActiveRecord
{
// ...
    public static function getList()
    {
        $data = static::find()
            ->select(['id', 'parent_id', 'title'])
            ->orderBy('parent_id ASC')
            ->asArray()
            ->all();

        $sort = new SortList([
                'data' => $data,
                'prefix' => '------',
        ]);
        $sortList = ArrayHelper::map($sort->getList(), 'id', 'title');
        return $sortList;
    }
}

class SortList extends Object
{
    public $data;

    public $prefix = '   ';

    protected function getPath($category_id, $prefix = false)
    {
        foreach ($this->data as $item) {
            if ($category_id == $item['id']) {
                $prefix = $prefix ? $this->prefix . $prefix : $item['title'];
                if ($item['parent_id']) {
                    return $this->getPath($item['parent_id'], $prefix);
                } else {
                    return $prefix;
                }
            }
        }
        return '';
    }

    public function getList($parent_id = 0)
    {
        $data = [];

        foreach ($this->data as $item) {
            if ($parent_id == $item['parent_id']) {
                $data[] = [
                    'id' => $item['id'],
                    'title' => $this->getPath($item['id'])
                ];
                $data = array_merge($data, $this->getList($item['id']));
            }
        }

        return $data;
    }
}
Ответ написан
Комментировать
SOb_S
@SOb_S
Мне понравилось это решение: https://github.com/creocoder/yii2-nested-set-behavior Реализована модификация веток, вставка, удаление, смена корней, множественные корни и т.д..
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы