Динамическое многоуровневое выпадающее меню в Yii2

Я хочу создать динамическое меню с моей таблицей (db). Я следовал некоторым инструкциям, которые приведены ниже:

Таблица : "менупанал"

Таблица: панель меню

Шаг 01: Я просто создаю суперконтроллер в app\components\Controller.php

Вот код:

    namespace app\components;

use app\models\MenuPanal;

class Controller extends \yii\web\Controller
{

    public $menuItems = [];

    public function init(){

     $items = MenuPanal::find()
        ->where(['c_type'  => 'MENU'])
        ->orderBy('id')
        ->all();


     $menuItems = [];
     foreach ($items as $key => $value) {
                 $this->menuItems[] = 
                      ['label' => $value['c_name'], 
                          'items'=> [
                              ['label' => $value['c_redirect'], 'url' => ['#']],
                          ],
                      ];    
            }

  parent::init();
}

Шаг 02: Изменена главная страница макета:

        echo Nav::widget([
            'options' => ['class' => 'navbar-nav navbar-right'],

            'items' => Yii::$app->controller->menuItems,
        ]);

Он работает только на одном уровне. Мой вопрос::

Вопрос: как добавить многоуровневое меню с помощью суперконтроллера?

Я новичок в Yii2. Помощь высоко ценится.


person Community    schedule 04.06.2014    source источник


Ответы (3)


  1. Создайте новый MenuHelper в папке компонента. Папки компонента по умолчанию нет. Пожалуйста, создайте сами.

    <?php
    
    namespace app\components;
    
    use app\models\MenuPanel;
    use app\models\Zuser;
    use app\models\Vwrole;
    use app\assets\AppAsset;
    
    
    class MenuHelper
    {
    
        public static function getMenu()
        {
            $role_id = 1;
            $result = static::getMenuRecrusive($role_id);
            return $result;
        }
    
        private static function getMenuRecrusive($parent)
        {
    
            $items = MenuPanel::find()
                ->where(['c_parentid' => $parent])
                ->orderBy('c_sortord')
                ->asArray()
                ->all();
    
            $result = []; 
    
            foreach ($items as $item) {
                $result[] = [
                        'label' => $item['c_name'],
                        'url' => ['#'],
                        'items' => static::getMenuRecrusive($item['id']),
                        '<li class="divider"></li>',
                    ];
            }
            return $result;
        }
    
    }
    
  2. на главной странице макета поместите следующий код

        echo Nav::widget([
            'options' => ['class' => 'navbar-nav navbar-right'],
            'items' => app\components\MenuHelper::getMenu(),
    

Наслаждайтесь кодированием!

person Selim Reza    schedule 11.06.2014

Вы можете использовать вложенные наборы. Посмотрите на это расширение для Yii: http://www.yiiframework.com/extension/nestedsetbehavior/ и его документацию. Все, что вам нужно сделать, это компонент с динамическим созданием массива пунктов меню для вложенных наборов.

Я обнаружил, что существует версия расширения Yii2: http://www.yiiframework.com/extension/yii2-nestedsetbehavior/

Удачи

person kayakkamil    schedule 04.06.2014

Вы можете использовать это расширение для многоуровневого раскрывающегося спискамногоуровневого раскрывающегося списка.

person Neophile    schedule 06.06.2014