我正在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
变量传递到布局/主视图?谢谢大家。
答案 0 :(得分:1)
您应将此代码提取到小部件中:
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() ?>
通过这种方式,您可以保持控制器和视图的清洁。