然之系统在前端页面整体刷新时,首先会通过createMainMenu()函数来加载导航菜单,其读取的是每个应用下的common\lang\zh-cn.php中设置的$lang->...->menu代码。但是我们看createMainMenu()函数中有如下图代码(app\sys\common\model.php 第403行)
这里的$method是通过上面说的$lang->...->menu数组设置获取的。也就是说,如果我设置的默认链接没有给权限,则这个模块其他页面给了权限,我也看不到这个模块了,因为已经跳过了。即使能看到,也是一点进来就是一个无权限页面,无法点击到我有权限的页面上去。
修复的思路是:如果默认链接没有权限访问,则获取这个模块的所有可控权限的链接,哪个有权限,哪个就替换成这个模块的默认链接。修复方法如下(在407行后添加else代码段):
整体403行后的if-else代码段如下:
if(commonModel::hasPriv($module, $method))
{
$link = helper::createLink($module, $method, $vars);
$string .= !$isMobile ? "<li$class><a href='$link'>$label</a></li>\n" : "<a$class href='$link'>$label</a>";
}
else
{
$methods = $lang->{$app->appName}->$module->menuOrder;
foreach ($methods as $method){
if(commonModel::hasPriv($module, $method))
{
$link = helper::createLink($module, $method, $vars);
$string .= !$isMobile ? "<li$class><a href='$link'>$label</a></li>\n" : "<a$class href='$link'>$label</a>";
break;
}
}
}
注:403行外层还有一个if-else,我们改的是else里的内容,因为if里的内容是单独控制setting等一些设置项页面的,这里可以不考虑,因为我们一般不会改变然之系统设置项的东西,如果需要,仿照上面的方式修改393到398行部分代码即可
以上代码基于然之开源版4.4
回贴