我正在CI中构建一个小应用程序。我使用的是带有单独菜单文件的预制模板。该菜单文件包含在网页浏览中:
<?php include('include/sidebar.php'); ?>
现在,我想根据用户权限使菜单中的项目动态化。在我的侧边栏中.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目前也包含在侧边栏.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,但我还不知道此时应该检查哪些菜单项。
谢谢!
我会创建一个名为 Menu 的库.php在那里我会创建检查用户权限和内容的函数,并且还有一个只输出菜单的渲染方法。
这样,您的控制器将加载该库。将一些数据发送到其中并获取字符串形式的菜单。然后,您只需将该字符串发送到视图并回显它。
另一种选择是研究演示器模式并尝试在代码点火器中实现它。
演示者模式
CI 的演示者库