在上一篇文章中,我们介绍了在yii2中设置完美背景和实现rbac权限控制的示例教程。如果您还没有意识到,请阅读上面的内容,然后再回头参考这篇文章,因为这篇文章是基于上面的内容。
有小伙反映,最终菜单菜单中的权限如何控制是不可理解的,也是不确定的,你好像还没看完,你这是在瞎搞!真的没那么完整。今天我们来看看如何实现菜单的完美权限。先把主要内容列出来,不需要的东西没必要看,只是给有需要的人分享一下。
使用菜单表添加菜单。
左侧菜单结果adminlte完美呈现。
自定义菜单前面的图标图标并呈现出来。
如何控制菜单的显示或隐藏?
没有权限的页面操作按钮不显示。
Gridview也只显示具有操作权限的按钮。
好吧,就这样。如果您对权限控制菜单还有其他要求,请在下面留言,让我们互相学习。
先看图预习一下大致效果,不然怎么能激起你的求知欲呢?
首先,我们访问路线页面/dmin/路线/索引,尽可能选择所有左边的页面,然后向右移动,然后记住将相关的可访问权限分配给当前用户。
接下来,访问菜单列表/管理/菜单/索引,然后单击添加菜单。如果此时您没有权限访问它,请暂时允许当前用户访问配置文件的ASAAccess文件中的任何权限,并在我们添加权限时删除ASAAccess设置。请记住,否则,不要在许可到期后再来找我。
这里我们首先填写上图中标记为红色的四个字段。
例如,我们想添加一个一级菜单“权限管理”。
请填写名称“权限管理”,因为是一级菜单,请将父名称留空,我们为路由选择“/admin/default/index”。请注意,如果有任何路线匹配,请访问路线页面,并将左侧的选择移动到右侧。
映射,其实就是排名的问题。例如,我添加了两个菜单,映射值为1的菜单位于顶部,值为2的菜单位于1的底部。我们在这里填写数字1。
我们稍后将讨论“数据”。
用刚才介绍的这种方式添加,并给出添加二级菜单‘权限控制’的例子。
只需在这里填写父名称,我们就添加了一级名称‘权限管理’。其他一切如常。如果你不能再次操作,最好在这里添加权限管理的所有菜单,因为我们需要,你可以多练练手。
此时,我们已经添加了菜单。
让我们看看下一步,并使用我们之前构建的背景框架来展示它。
使用MDM admin components MenuHelper;echo DM str widgets menu 3360: widget([' options '=[' class '=' sidebar-menu '],' items '=menu helper : getassignedmenu(yii : $ app-user-id),]);很简单吧,什么?为什么我没有dmstr?对不起,我已经说过很多次了。在结合这个菜单之前,我需要阅读上面的内容。
好的,刷新页面,看看你的菜单。虽然我们还没有完全实现我们想要的功能,但是您应该可以在这里看到您的菜单显示。
接下来,我们将进入我们的重点和难点。我们将实现菜单前面的小图标,完成菜单隐藏控件。
还记得我们第一次创建菜单时没有填写的唯一选项“数据”吗?为了方便后续操作,我们在这里填写图标和隐藏选项。我们以开始截图中的二级菜单‘后台用户管理’为例进行修改。截图让我们来看看我们菜单的当前状态。
请在其更新页面的“数据”项中填写以下代码。如果你有新的想法,请在做改变之前遵循我的想法,因为我们以后会操作。
{ ' icon ' : ' fa-fa-user ',' visible' : false}是的,我们为这个' data '项填写了一段json代码。接下来,我们还对显示菜单的代码做了一点改进。为了方便大家看代码,这里的$回调是直接写在页面上的,大家以后可以继续优化包。
使用MDM admin components MenuHelper;PHP $ callback=function($ menu){ $ data=JSON _ decode($ menu[' data '],true);$ items=$ menu[' children '];$return=[ 'label'=$menu['name'],' url'=[$menu['route'],];//处理我们的配置if($ data){//visibleisset($ data[' visible '])$ return[' visible ']=$ data[' visible '];//icon isset($ data[' icon '])$ data[' icon ']$ return[' icon ']=$ data[' icon '];//其他属性,例如类.$ return[' options ']=$ data;}//默认图标(!isset($return['icon']) ||!$ return[' icon '])$ return[' icon ']=' fa-circle-o ';$ items $ return[' items ']=$ items;return $ return};//这里我们优化了开头写的菜单菜单。echo DM str widgets menu :3360 widget([' options '=[' class '=' sidebar-menu '],' items '=menuhelper : getassignedmenu(yii : $ app-user-id,null,$callback),]);是的,你没有弄错。代码有点长。我们简单分析一下。实际上,我们这里的$回调方法只用于分析我们上面添加的菜单中的‘数据’项。不难看出,我们已经分别判断了图标和可见,并将其添加到当前菜单中。
至此,我们几经波折,终于实现了菜单加图标和设置菜单的隐藏。如果您有其他属性需要配置,可以在这里继续单独配置。
现在,我们还有两个任务要完成,我们需要完成接下来的两个任务。为了大家的方便,建议大家可以为自己的项目定制gii模板。如果不支持自定义gii模板,可以参考自定义gii模板。等你找到我们以后需要做的功能,我想你会佩服我们在这里的操作。
为了操作方便,我们在这里添加了一个测试表test,我们首先使用未修改的gii模板生成一个模型curd。首先,我们将test/*的所有权限分配给当前登录的用户,并添加一条数据。打开/测试,我们可以正常看到下面的截图。注意图中的两个标记。
然后我们打开文件test/index.php,修改两个标记的地方如下。
使用mdm admin components Helper?Php //如果(helper : check route(' create ')){ echo html :3360 a(' create test ',['create'],['class'=' btnbtn-success'])则不显示按钮;} ?=GridView:widget([ //.列'=[ //.[' class '=' yii grid action column ',' template '=helper 3360: filteraction column(' { view } { update } { delete } '),],],]);现在,让我们刷新页面/测试并看一看。似乎什么都没变。别急,先撤销当前用户的/test/create和/test/update权限,然后刷新下一页看看效果。我们来截图一下。
也就是说,我们没有权限的按钮消失了。当您手动访问/测试/创建时,您会发现您没有权限。
如果您的gii模板是用户定义的,我相信您会很快在生成的模板中为所有操作添加权限控制。是不是很幸福?
最后,我们菜单中对权限控制的解释也差不多结束了。聊了很久,没什么好想的,但希望能对你有一点帮助。