我正在用CI构建一个小型应用程序。我正在使用带有单独菜单文件的预制模板。该菜单文件包含在综合浏览量中:
<?php include('include/sidebar.php'); ?>
现在,我想根据用户权限使菜单中的项目动态化。在sidebar.php中,我定义了如下菜单项:
<?php
$classname = "logs";
if (check_class($classname) == true){
?>
<li id="<? echo $classname;?>" class="<?php if($this->uri->segment(1)==$classname){echo "active";}?>">
<a href="javascript:void(0);" class="menu-toggle">
<i class="material-icons">youtube_searched_for</i>
<span><?php echo $this->lang->line('menu_logs') ?></span>
</a>
<ul class="ml-menu">
<?php
$methodname = "viewlogs";
if (check_method($classname,$methodname) == true){
?>
<li id="<? echo $classname;?>" class="<?php if($this->uri->segment(1)==$classname AND $this->uri->segment(2)==$methodname){echo "active";}?>">
<a href="<?= base_url($classname."/".$methodname); ?>"><?php echo $this->lang->line('menu_logs') ?></a>
</li>
<?php }?>
</ul>
</li>
<?php }?>
check_class和check_method当前也包含在sidebar.php文件中:
<?php
// This should not be here...
global $thisglobal;
$thisglobal = $this;
global $auth_roleglobal;
$auth_roleglobal = $auth_role;
function check_class($class) {
global $thisglobal;
//Override if admin
if ($thisglobal->auth_role == "admin") {
return true;
}
// Get current roles permissions
$role_arr_flipped = array_flip(array($thisglobal->auth_role)); // Avoid Error @ Only variables should be passed by reference
$role_arr_intersected = array_intersect_key($thisglobal->config->item('user_role_permissions'), $role_arr_flipped);
$role_perms = array_shift($role_arr_intersected);
if (array_key_exists($class, $role_perms)) {
return true;
} else {
return false;
}
}
function check_method($class,$method) {
global $thisglobal;
//Override if admin
if ($thisglobal->auth_role == "admin") {
return true;
}
// Get current roles permissions
$role_arr_flipped = array_flip(array($thisglobal->auth_role)); // Avoid Error @ Only variables should be passed by reference
$role_arr_intersected = array_intersect_key($thisglobal->config->item('user_role_permissions'), $role_arr_flipped);
$role_perms = array_shift($role_arr_intersected);
// Flip arrary
$role_perms["$class"] = array_flip($role_perms["$class"]);
if (array_key_exists($method, $role_perms["$class"])) {
return true;
} else {
return false;
}
}
?>
这可行,但是显然将那些函数包含在视图文件中是违反MVC方法的,我可能还想在其他视图中重用check_class和check_method。我已经将这些功能移到了my_controller上,但是同样,我不应该从我的观点调用这些功能。
我有点迷失于继续...
边栏没有自己的控制器。我应该创建一个单独的吗?但是然后如何加载它,因为我不能(不应该)从页面视图中调用菜单控制器。
或者我应该在加载视图之前调用check_class和check_method,但是我还不知道那时应该检查哪些菜单项。
谢谢!
答案 0 :(得分:1)
我将在其中创建一个名为Menu.php的库,并创建用于检查用户权限和内容的函数,并具有仅输出菜单的render方法。
这样,您的控制器将加载该库。向其中发送一些数据,并以字符串形式获取菜单。然后,您只需将该字符串发送到视图并回显它即可。
其他选项可能会调查演示者模式,并尝试在codeigniter中实现该模式。