Я создаю небольшое приложение в 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 перед загрузкой представления, но я еще не знаю, какие пункты меню мне следует проверить в этот момент.
Спасибо!
Я бы создал там библиотеку под названием Menu.php, я бы создал функции, которые проверяли бы права пользователя и прочее, а также имел бы метод рендеринга, который просто выводит меню.
Таким образом, ваш контроллер загрузит эту библиотеку. Отправьте в него данные и получите меню в виде строки. Затем вы просто отправляете эту строку в представление и повторяете ее.
Другой вариант - изучить шаблон докладчика и попытаться реализовать его в codeigniter.
Я забыл упомянуть еще одну вещь: вы сказали, что одним из ваших вариантов было загрузить контроллер, который позаботится об этой части меню. Я бы сказал, что что-то подобное войдет в соглашение HMVC, а не в MVC. Есть библиотека, которая превращает ваш CI по умолчанию в HMVC. Посмотрите это тоже и посмотрите, подходит ли это вам.