#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.