Создание классов CSS на основе роли пользователя

#moodle

#moodle

Вопрос:

Работа с Moodle 3.9 и форком текущей темы Academi.

Я пытаюсь создать привязку класса css к <body> элементу, который основан на роли пользователя. Я понимаю, что роли пользователя зависят от контекста (возможно, студент одного курса и что-то еще в другом), поэтому я бы вывел все роли как классы для данного контекста.

Основываясь на некоторых обширных исследованиях на форуме moodle, у меня есть следующее:

 // User role based CSS classes
global $USER, $PAGE;
$context = context_system::instance();
$roles = get_user_roles($context, $USER->id, true);
if(is_array($roles)) {
    foreach($roles as $role) {
        $PAGE->add_body_class('role-'.$role->shortname);
    }
} else {
        $PAGE->add_body_class('role-none');
}
  

Желательно, чтобы это выполнялось на каждой странице. Из темы я попытался просто разместить это практически во всех местах / функциях, которые, по моему мнению, могли быть выполнены достаточно рано, чтобы изменить элемент body. Либо я не получаю никаких выходных данных вообще, либо предупреждение, указывающее, что запускать add_body_class() уже слишком поздно.

Я просмотрел API-интерфейсы страницы и вывода, и я все еще не понимаю, как и когда выполнять этот код. Должен ли это быть пользовательский плагин?

Комментарии:

1. Другим решением может быть изменение класса body с помощью javascript (из php)

2. К сожалению, использование js не решит основную проблему (php) получения массива ролей текущего пользователя в любом контексте страницы.

3. Я думал, что роль пользователя с помощью PHP и эхо на JS, как это: эхо «<script>document.getElementsByTagName(«body»)[0].classList.add(«».$userRole.»»)</script>»;

4. Моя проблема заключалась в том, что в PHP $roles не был возвращен массив, поэтому я вообще не подбираю роли. Таким образом, либо код не обрабатывается должным образом, либо я неправильно понимаю природу пользовательских ролей или контекстов в moodle. Это вопрос, который требует довольно глубокого понимания Moodle.

5. Возможно, у вас проблема с переменной $context, попробуйте использовать $context = get_context_instance(CONTEXT_COURSE, $courseid, true); когда вы находитесь в контексте курса

Ответ №1:

Переопределите функцию header() в основном средстве визуализации вашего текущего шаблона темы, например, на themeYOUR_THEMEclassesoutputcore_renderer.php:

     namespace theme_YOUR_THEMEoutput;

    defined('MOODLE_INTERNAL') || die;
    use context_system;

    class core_renderer extends theme_boostoutputcore_renderer {
        public function header() {
            global $USER;
        
            $roles = get_user_roles(context_system::instance(),$USER->id);
            if (is_array($roles) amp;amp; !empty($roles)){
                 foreach($roles as $role){
                     $this->page->add_body_class('role-'.$role->shortname);
                 }
             }else{
                 $this->page->add_body_class('role-none');
             }
        
            return parent::header();
        }
    }
  

Таким образом, каждая страница будет вызывать эту функцию и добавлять нужные классы css в тег body.