Динамическое меню / создать контроллер для меню? - PullRequest
0 голосов
/ 23 октября 2018

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

Спасибо!

1 Ответ

0 голосов
/ 23 октября 2018

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

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

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

Шаблон презентатора

Библиотека Presenter для ci

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...