判断菜单的显示
现在,我们只需要修改菜单的显示逻辑就可以。
在开发之前,我们先看一下app\Admin\bootstrap.php
中我们加的代码。
admin_inject_section(Admin::SECTION['LEFT_SIDEBAR_MENU'], function () {
$menuModel = config('admin.database.menu_model');
$builder = Admin::menu();
$html = '';
foreach (Helper::buildNestedArray((new $menuModel())->allNodes()) as $item) {
$html .= view('admin::partials.menu', ['item' => $item, 'builder' => $builder])->render();
}
return $html;
});
现在我们需要理解一下这段代码:
Admin::SECTION['LEFT_SIDEBAR_MENU']
更改菜单栏的命令。
$menuModel = config('admin.database.menu_model');
菜单栏数据模型地址。其实通过这个,可以玩出很多花样。在本章教程里,我们保持默认的菜单栏模型。
Helper::buildNestedArray((new $menuModel())->allNodes())
,主要是这个,我们打印一下,发现打印出来的是顶级栏目的菜单。
而我们的目的,其实判断的就是顶级栏目,而不是二级栏目,所以我们只需要在这个上面做文章就可以。
比如,我们想只显示顶级菜单为系统
的菜单和子菜单。那么在foreach循环里,通过以下判断就可以
if ($item['title'] == 'Admin') {
$html .= view('admin.partials.menu', ['item' => $item, 'builder' => $builder])->render();
}
如果想排除系统
菜单和下面的二级菜单。代码就是
if ($item['title'] != 'Admin') {
$html .= view('admin.partials.menu', ['item' => $item, 'builder' => $builder])->render();
}
现在我们已经可以筛选菜单了。比如只显示系统
菜单,和不显示系统菜单。
然后,我们在整理以下我们的需求:
- 在
系统
菜单下的二级菜单页面内,左侧只显示系统
菜单和二级菜单。
- 如果当前页面不是
系统
菜单下的二级菜单,那么左侧不允许出现系统
菜单。
针对这个需求,我们实现的思路如下:
- 通过路由来判断左侧显示什么菜单。
- 假如当前页面的路由,是
系统
菜单下的路由,那么左侧只显示系统菜单。如果不是系统菜单的路由,那么就显示其他菜单。
有思路就好办了,我们先定义一下,系统
菜单下的二级菜单有哪些路由,我的是下面这些
'admin/settings',
'admin/auth/users',
'admin/auth/roles',
'admin/products',
'admin/customfields'
我们把这些路由作为数组赋给一个变量
$setting_menu = [
'admin/settings',
'admin/auth/users',
'admin/auth/roles',
'admin/products',
'admin/customfields'
];
题外话,建议有时间的同学可以把这个开发成扩展,扩展的主要逻辑,也就是控制上面这个数组。并不复杂。
然后怎么获取当前页面的路由呢? 通过这个
request()->path()
我们也赋给一个变量:
$route = request()->path();
这时候,当前页面,是否是系统菜单下的页面,就很好判断了
in_array($route, $setting_menu)
最终,菜单分离的实现逻辑代码,就是这样子
foreach (Helper::buildNestedArray((new $menuModel())->allNodes()) as $item) {
if (in_array($route, $setting_menu)) {
if ($item['title'] == 'Admin') {
$html .= view('admin.partials.menu', ['item' => $item, 'builder' => $builder])->render();
}
}else {
if ($item['title'] != 'Admin') {
$html .= view('admin.partials.menu', ['item' => $item, 'builder' => $builder])->render();
}
}
}
大功告成!现在试试,在系统
菜单下的二级菜单内,左侧菜单就只有系统
菜单。否则,左侧不出现系统
和二级菜单。