首页 > 解决方案 > 根据用户角色创建 CSS 类

问题描述

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

我正在尝试在<body>基于用户角色的元素上创建一个 css 类挂钩。我了解用户的角色是上下文驱动的(可能是一门课程的学生,而另一门课程的其他人),因此我会将所有角色作为给定上下文的类输出。

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

最好我希望它在每一页上运行。在主题中,我尝试将其放置在我认为可以尽早执行以修改主体元素的几乎每个位置/功能中。要么我没有得到任何输出,要么警告表明运行add_body_class()为时已晚。

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

标签: moodle

解决方案


覆盖当前主题模板的核心渲染器上的 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 类添加到 body 标记中。


推荐阅读