根据用户角色创建CSS类

Create CSS classes based on user role

使用 Moodle 3.9 和当前 Academi 主题的分支。

我正在尝试根据用户的角色在 <body> 元素上创建 css class 挂钩。我知道用户的角色是上下文驱动的(可能是一门课程的学生,而另一门课程的其他人),所以对于给定的上下文,我会将所有角色输出为 classes。

基于对 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');
}

我最好在每一页上 运行 都这样。在主题中,我尝试将它放在几乎每个 location/function 中,我认为可以尽早执行以修改 body 元素。要么我根本没有输出,要么收到一条警告,表明现在 运行 add_body_class().

已经太晚了

我已经浏览了 Page and Output API,但我仍然不知道如何或何时执行此代码。这应该是一个自定义插件吗?

覆盖当前主题模板核心渲染器上的 header() 函数,例如 theme\YOUR_THEME\classes\output\core_renderer。php:

    namespace theme_YOUR_THEME\output;

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

    class core_renderer extends \theme_boost\output\core_renderer {
        public function header() {
            global $USER;
        
            $roles = get_user_roles(context_system::instance(),$USER->id);
            if (is_array($roles) && !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 类 添加到正文标记中。