Yii2 Создание динамической навигации с использованием базы данных - PullRequest
0 голосов
/ 21 января 2019

Я реализую динамическую навигационную панель в Yii2, которая отображает выпадающее меню, выбирая элементы из базы данных. Теперь проблема в том, что когда я вызываю функцию, в которой я заполняю массив, происходит сбой системы с ошибкой:

"В foreach () указан неверный аргумент"

, поскольку не находит переменную с массивом элементов. Я не знаю, какой контроллер должен передавать аргументы в главное представление, мне просто нужен массив всех элементов в модели данных (т.е. курс).

Я пробовал с этим, но все еще не работает.

  /* @var $courses \app\models\Course[] */

Макеты / главный

function items($courses)
{
    $items = [];
    foreach ($courses as $course) {
        array_push($items, ['label' => $course->title, 'url' => 
        Url::to(['course', 'id' => $course->id])]);
    }
    return $items;
}

$menuItems = [
// other items ...
    'label' => 'Courses', 'items' => items($courses)
];

echo Nav::widget([
    'options' => ['class' => 'uk-navbar-item'],
    'encodeLabels' => false,
    'items' => $menuItems
 ]);

Как передать переменную $courses в макеты / основной вид? Спасибо всем заранее.

1 Ответ

0 голосов
/ 21 января 2019

Вы должны извлечь этот код в виджет:

class MainMenu extends Widget {

    public function run() {
        echo Nav::widget([
            'options' => ['class' => 'uk-navbar-item'],
            'encodeLabels' => false,
            'items' => $this->getItems(),
        ]);
    }

    protected function getItems() {
        return [
            // other items ...
            ['label' => 'Courses', 'items' => $this->getCoursesItems()],
        ];
    }

    protected function getCoursesItems() {
        $items = [];
        foreach (Course::find()->all() as $course) {
            $items[] = [
                'label' => $course->title,
                'url' => Url::to(['/course', 'id' => $course->id]),
            ];
        }
        return $items;
    }
}

Тогда в вашем макете вы просто звоните:

<?= MainMenu::widget() ?>

Таким образом, вы можете держать свой контроллер и просматривать в чистоте.

...