Динамическое меню / создать контроллер для меню?

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

Спасибо!

Я забыл упомянуть еще одну вещь: вы сказали, что одним из ваших вариантов было загрузить контроллер, который позаботится об этой части меню. Я бы сказал, что что-то подобное войдет в соглашение HMVC, а не в MVC. Есть библиотека, которая превращает ваш CI по умолчанию в HMVC. Посмотрите это тоже и посмотрите, подходит ли это вам.

marcogmonteiro 24.10.2018 11:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
116
1

Ответы 1

Я бы создал там библиотеку под названием Menu.php, я бы создал функции, которые проверяли бы права пользователя и прочее, а также имел бы метод рендеринга, который просто выводит меню.

Таким образом, ваш контроллер загрузит эту библиотеку. Отправьте в него данные и получите меню в виде строки. Затем вы просто отправляете эту строку в представление и повторяете ее.

Другой вариант - изучить шаблон докладчика и попытаться реализовать его в codeigniter.

Шаблон докладчика

Библиотека презентаций для ci

Другие вопросы по теме