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

Как вывести в view многоуровневое меню. Yii2?

Делаю сайт по курсу Yii2 от webformyself. И я столкнулся с такой проблемой, что не получается вывести многоуровневое меню.
Вот контроллер:
<?php
namespace app\components;
use yii\base\Widget;
use app\models\Category;
use Yii;
class MenuWidget extends Widget 
{
    public $tpl;
    public $model;
    public $data;
    public $tree;
    public $menuHtml;
    public function init() 
    {
        parent::init();
        if( $this->tpl === null ) {
            $this->tpl = 'menu';
        }
        $this->tpl .= '.php';
    }
    public function run() 
    {
        // get cache
        if($this->tpl == 'menu.php') {
            $menu = Yii::$app->cache->get('mainMenu');                          //кэширование
            if($menu) return $menu;
        }
        $this->data = Category::find()->indexBy('category_id')->asArray()->all();
        $this->tree = $this->getTree();
        $this->menuHtml = $this->getMenuHtml($this->tree);
        //set cache
        if($this->tpl === null ) {
            Yii::$app->cache->set('mainMenu', $this->menuHtml, 60);             //кэширование
        }
        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['category_id']] = &$node;
        }
        return $tree;
    }
    protected function getMenuHtml($tree, $tab = '') 
    {
        $str = '';
        foreach ($tree as $category) {
            $str .= $this->catToTemplate($category, $tab);
        }
        return $str;
    }
    protected function catToTemplate($category, $tab) 
    {
        ob_start();
        include __DIR__ . '/menu_tpl/' . $this->tpl;
        return ob_get_clean();
    }
}


У меня получается вывести двухуровневое. Далее выводится двухуровневое.
VIEW:

<li>
    <a href="<?= \yii\helpers\Url::to(['category/view', 'id' => $category['id']]) ?>" id="mainMenu">
        <?= $category['name']?>
    </a>
    <?php if(isset($category['childs']) ): ?>
        <ul class="subMainMenu">
            <?=$this->getMenuHtml($category['childs'])?>
        </ul>
    <?php endif;?>
</li>

Это моя БД:
ec159c4cef864a1e954bd87e59009516.png
На основе всех данных, как мне вывести многоуровневое меню?
  • Вопрос задан
  • 1537 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@assets
Back-end developer
Может вам https://github.com/creocoder/yii2-nested-sets ?

Вы сделали свой велосипед от webformyself :]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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