Почему не передается значение?

Понимаю что ни чего не понимаю. Поэтому задал вопрос как передать данные из базы данных в шаблон(layouts->main) мне посоветовали через виджет. Из всей документации про виджеты нашел только как создать HelloWidget попытался сам вот код виджета:

<?php
    namespace common\widgets;
    
    use yii\base\Widget;
    use common\models\Category;
    use yii\helpers\ArrayHelper;
    class Menus extends Widget{
        public $menu;
        public function init()
        {
            parent::init();
            $cat=Category::find()->where('tags=0')->all();
            $this->menu=ArrayHelper::toArray($cat,[
                'common\models\Category' => [
                    'id',
                    'name_category',
                    
                ],
            ]);
        }
    
        public function run()
        {
            return $this->menu;
        }
    }


вот так пытаюсь получить его в шаблоне

use common\widgets\Menus;
    ...
    
            <?=Menus::widget(); ?>


получаю просто Array (больше ни чего) объясните пожалуйста почему, и что я делаю не так?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
Menu::widget() выведет то, что возвращает функция run() в данном виджете.
Т.е. вам нужно вернуть не массив, а строку со списком ссылок.

Можете сделать view для виджета и в run() делать return $this->render('menu'). В views/menu.php у вас будет шаблон меню. Папка views должна быть там же, где сам виджет, иначе в render надо полный путь передавать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zetamen
@zetamen
В поисках нового
Запихать всю логику в виджет, это очень быстрое и простое решение, но плохое. Можно представить, что у тебя во вьюхе есть маленькая черная дыра, которая откуда-то получает информацию. Виджеты нужны только для инкапсуляции логики вывода, и никак для получения и обработки данных.

Возникает вопрос, как прокинуть данные из модели/контроллера в layout. Ответ: переопределив метод renderContent. Если контроллеров много, создайте базовый класс с реализованным renderContent и от него наследуйтесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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