alexanderbulatov
@alexanderbulatov
Fullstack разработчик

Вывод многоуровневого меню из базы данных в Yii2?

Здравствуйте все зашедшие на мой вопрос.

Ситуация:
Нужно вывести многоуровневое меню из базы данных при этом нужно, чтобы была возможность указывать в вёрстке символьный код для того, чтобы получать то меню, которое нужно в конкретном месте.

Данные:
Имеется база данных и в ней вот такие две таблицы

первая (список меню)
796ff1c917d7466baa8e82e34584d962.png

вторая (пункты меню)
47e69af7ba1c40acb6f164b5b32c0d21.png

В layout вывод следующий:
<?php
    NavBar::begin([
        'brandLabel' => 'My Company',
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar-inverse',
        ],
    ]);
    
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav'],
        'items' => \app\modules\manager\models\MenuItemsModel::viewMenuItems(),
    ]);
    
    NavBar::end();
    ?>


В модели, которая цепляется в параметре items, код следующий:
private static function getMenuItems()
    {
        $items = [];
        
        $code = 'top-menu';
        
        $query_menu = MenuModel::find()
                        ->andWhere(['code' => $code, 'status' => 1])
                        //->andWhere([])
                        ->one();
        
        $query = self::find()
                    ->andWhere([
                        'menu_id' => $query_menu->id,
                        'status' => 1
                     ])
                    ->all();
        
        foreach ($query as $item)
        {
            if ( empty($items[$item->parent_id]) )
            {
                $items[$items->parent_id] = [];
            }
            
            $items[$item->parent_id][] = $item->attributes;
        }
        
        return $items;
    }
    
    /*
     * @inheritdoc
     */
    public static function viewMenuItems($parentId = 0)
    {        
        $array = self::getMenuItems();
        
        if ( empty($array[$parentId]) ) { return; }
        
        for ( $i = 0; $i < count($array[$parentId]); $i++ )
        {
            $result[] = [
                'label' => $array[$parentId][$i]['name'],
                'url' => $array[$parentId][$i]['url_item'],
                'items' => self::viewMenuItems($array[$parentId][$i]['id'])
            ];
        }
        
        return $result;
    }


Вопрос:
как указать вот этот символьный код не в теле метода, а в вёрстке, то есть в layout или во view ?
$code = 'top-menu';

Уже пробовал передавать get-параметр, но чего-то очень ругается система.
  • Вопрос задан
  • 2490 просмотров
Решения вопроса 1
alexanderbulatov
@alexanderbulatov Автор вопроса
Fullstack разработчик
Решил сделать просто и традиционно. Вот таким образом (может быть кому пригодиться):

Во view
if ( Choice_Menu::viewMenuItemsTop('top-menu') ) {
        echo Nav::widget([
            'options' => ['class' => 'navbar-nav'],
            'items' => Choice_Menu::viewMenuItemsTop('top-menu'),
        ]);
    }


Весь классе Choice_Menu и его методы оформлены так
namespace app\modules\manager\models;

use app\modules\manager\models\MenuModel;
use app\modules\manager\models\MenuItemsModel;

/**
 * Description of Choice_Menu
 *
 * @author Максимус
 */
class Choice_Menu 
{
    /**
     * @inheritdoc
     */
    private static function getMenuItemsTop($nameMenu)
    {
        $items = [];
        
        $code = $nameMenu;
        
        $query_menu = MenuModel::find()
                        ->andWhere(['code' => $code, 'status' => 1])
                        ->one();
        
        $query = MenuItemsModel::find()
                    ->andWhere([
                        'menu_id' => $query_menu->id,
                        'status' => 1
                     ])
                    ->all();
        
        foreach ($query as $item)
        {
            if ( empty($items[$item->parent_id]) )
            {
                $items[$items->parent_id] = [];
            }
            
            $items[$item->parent_id][] = $item->attributes;
        }
        
        return $items;
    }
    
    /*
     * @inheritdoc
     */
    public static function viewMenuItemsTop($nameMenu, $parentId = 0)
    {        
        $array = self::getMenuItemsTop($nameMenu);
        
        if ( empty($array[$parentId]) ) { return; }
        
        for ( $i = 0; $i < count($array[$parentId]); $i++ )
        {
            $result[] = [
                'label' => $array[$parentId][$i]['name'],
                'url' => [$array[$parentId][$i]['url_item'].'/index'],
                'items' => self::viewMenuItemsTop($array[$parentId][$i]['id'], $nameMenu)
            ];
        }
        
        return $result;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
в соответствующей view через параметры
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы