Yii2 как с базы вывести категории когда у них есть подкатегориии с подкатегориями?

720
20 марта 2017, 10:43

Всем здрасте!

Вот так как на картинки хочу вывести свои категории, но я че та запутался с foreach и голова уже худом идет.

Как видно на картинки там есть 1 Спойлер это названия категории 2 У категории есть подкатегория, то она без чекбокса, если у подкатегории есть свои подкатегории то они становятся чебоксами

Подскажите пожалуйста как это грамотно реализовать!

Пример моей бд как я храню свои категории:

id | parent_id | title
 1 | 0 | Реклама
 2 | 0 | Автоуслуги
 3 | 1 | Настройка контекстной рекламы
 4 | 3 | SEO оптимизация сайта
 5 | 3 | Реклама в социальных сетях
 6 | 1 | Услуги промоутеров
 7 | 6 | Мерчендайзер
 9 | 6 | Промоутер в супермаркет
 10| 6 | Социологические опросы
 11| 2 | Кузовной ремонт
 12| 2 | Эвакуатор
 13| 2 | Зарядка аккумулятора
...|...| ..........................

Как я хочу чтоб было

1menu
 - menu
      - menu
      - menu
 - menu
      - menu
      - menu
2menu
 - menu
      - menu
      - menu
 - menu
      - menu
      - menu

Заранее спасибо!

Answer 1

надо познать суть рекурсии и построения ей дерева. Для yii есть пример http://yiiframework.ru/forum/viewtopic.php?t=14520 Кратко суть показана в Как правильно реализовать построение древа через рекурсию?

Answer 2
<?php

namespace app\components; use yii\base\Widget; use app\models\Category;

class MenuWidget extends Widget{

public $tpl;
public $data;
public $tree;
public $menuHtml;
public function init(){
    parent::init();
    if( $this->tpl === null ){
        $this->tpl = 'menu';
    }
    $this->tpl .= '.php';
}
public function run(){
    $this->data = Category::find()->indexBy('id')->asArray()->all();
    $this->tree = $this->getTree();
    $this->menuHtml = $this->getMenuHtml($this->tree);
    return $this->menuHtml;
}
protected function getTree(){
    $tree = [];
    foreach ($this->data as $id=>&$node) {
        if (!$node['parent_id'])
            $tree[$id] = &$node;
        else
            $this->data[$node['parent_id']]['childs'][$node['id']] = &$node;
    }
    return $tree;
}
protected function getMenuHtml($tree){
    $str = '';
    foreach ($tree as $category) {
        $str .= $this->catToTemplate($category);
    }
    return $str;
}
protected function catToTemplate($category){
    ob_start();
    include __DIR__ . '/menu_tpl/' . $this->tpl;
    return ob_get_clean();
}

}

READ ALSO
Точная замена символа

Точная замена символа

ЗдравствуйтеЕсть строка вида: 2,12,55,29,22,10,28 или 12,55,29,22,10,2

270
Как оптимально проверить валидность json (php)

Как оптимально проверить валидность json (php)

Имеется большой json-файлНа json_decode уходит до 4х секунд и такая скорость очень не устраивает, тем более что потребности именно парсить его и получать...

261
Как создать объект на удаленной машине в нужном процессе

Как создать объект на удаленной машине в нужном процессе

Имеется изолированная полностью контролируемая локальная сеть с машинами, вопросы безопасности не имеют значенияЕще есть несколько комовских...

260
Вычислить сумму

Вычислить сумму

Дана последовательность целых чисел x1,

243