Как передать глобальную переменную на главной странице макета перед $content в Yii2

Я пытаюсь создать динамическое меню в yii2, используя "Nav::widget". Вот мой код в разделе меню на главной странице макета:

    echo Nav::widget([
            'options' => ['class' => 'navbar-nav navbar-right'],
            'items' => [
                ['label' => 'Home', 'url' => ['/site/index']],
                ['label' => 'About', 'url' => ['/site/about']],

Пытаюсь найти решение: Пожалуйста, посмотрите::

1 Я создал суперконтроллер "components/Controller.php" в приложении:

namespace app\components;
use app\models\MenuPanal;

class Controller extends \yii\web\Controller
{

   public $menuItems = [];

public function init(){

     $items = MenuPanal::find()
        ->orderBy('id')
        ->all();

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

   parent::init();
  }
}

2 Место на главной странице макета ::

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

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

        ]);

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


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


Ответы (1)


Например, вы можете создать свой собственный суперконтроллер и добавить атрибут menuItems:

namespace app\components;

class Controller extends \yii\web\Controller
{
    public $menuItems = [
        ['label' => 'Home', 'url' => ['/site/index']],
        ['label' => 'About', 'url' => ['/site/about']]
    ];
}

Ваши контроллеры должны расширить его:

namespace app\controllers;

use app\components\Controller;

class MyController extends Controller {...}

И в вашем макете:

echo Nav::widget([
    'options' => ['class' => 'navbar-nav navbar-right'],
    'items' => Yii::$app->controller->menuItems,
]);
person soju    schedule 02.06.2014
comment
Спасибо за ваш ответ. Но в yii2 basic папки компонентов нет. В таком случае я могу использовать команды ?? Пожалуйста - person ; 02.06.2014
comment
Вы просто должны создать его. - person soju; 02.06.2014
comment
Уважаемый, я исправил эту проблему, НО возникла другая проблема для $app для проверки входа/выхода пользователя :: ERROR::: PHP Parse Error — синтаксическая ошибка yii\base\ErrorException, неожиданное '$app' (T_VARIABLE), ожидание идентификатора ( T_STRING) - person ; 02.06.2014
comment
И как я могу использовать foreach для меню (из БД) и разместить на главной странице макета? пожалуйста - person ; 02.06.2014
comment
добавить общедоступную функцию init(){} для контроллера и получить элементы меню из БД в общедоступные элементы меню, а на бэкэнде создать простой CRUD для этих элементов меню. - person user1852788; 03.06.2014
comment
Это не работает. У меня есть небольшое решение, хотя оно не работает: я обновил свой код... Пожалуйста, посмотрите. - person ; 03.06.2014
comment
вы забыли public $menuItems = []; перед public init() в вашем контроллере (проверьте код ответа). И в вашем foreach(){} замените $menuItems на $this->menuItems. - person user1852788; 03.06.2014
comment
@soju: это была ошибка, щелкнув. Извинения за это. Я не смотрел на это. Я не изменил все свои вопросы. Я только что добавил свои новые шаги по моему вопросу. Пожалуйста, посмотрите - person ; 03.06.2014
comment
@sujo :: ЭТО РАБОТАЕТ ОТЛИЧНО. Большое спасибо. Я смутил тебя своим идиотским кодом. ЕЩЕ РАЗ СПАСИБО. И извинения - person ; 03.06.2014
comment
@ user1852788 :: ЭТО РАБОТАЕТ ОТЛИЧНО. Большое спасибо. Я смутил тебя своим идиотским кодом. ЕЩЕ РАЗ СПАСИБО. И извинения - person ; 03.06.2014