Я создаю небольшое приложение в 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 перед загрузкой представления, но я не знаюпока какие пункты меню мне следует проверить на этом этапе.
Спасибо!