PHP добавление пользователей в глобальные группы add_group_members

PHP добавление пользователей в глобальные группы add_group_members

от tsit ucp -
Количество ответов: 2

Здравствуйте!

Занимаюсь реализацией плагина, в одном из элементов которого необходимо записать пользователя в глобальную группу (созданы заранее). Это необходимо для того, чтобы предоставить пользователю возможность доступа к элементу курса (тесту).

Записать на курс удалось, но с добавлением в группу возникли проблемы: вызываю метод add_group_members класса core_group_external, но сталкиваюсь с ошибкой "Вы не можете выполнять функции в контексте курса (id курса:{$a->catid}). Сообщение об ошибке контекста: Обнаружена ошибка кодирования, она должна быть исправлена программистом: Cannot call moodle_page::add_body_class after output has been started."


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

Исключение возникает во фрагменте:

            $context = context_course::instance($group->courseid, IGNORE_MISSING);

            try {

                self::validate_context($context);

            } catch (Exception $e) {

                $exceptionparam = new stdClass();

                $exceptionparam->message = $e->getMessage();

                $exceptionparam->courseid = $group->courseid;

                throw new moodle_exception('errorcoursecontextnotvalid' , 'webservice', '', $exceptionparam);

            }

Насколько я понимаю, проблема в проверке контекста. Пользователь имеет глобальную роль в системе.


Есть ли возможность в такой ситуации добавить пользователя в группу? Может быть, есть другой метод класса или вообще другой способ?

В ответ на tsit ucp

Re: PHP добавление пользователей в глобальные группы add_group_members

от Vadim Tabunshchik -
Изображение пользователя Developers
Смущает несколько моментов:
1. откуда берется id курса:{$a->catid}? Что это такое?
2. глобальные группы (cohort) вы создали, а записывать то нужно в группы курса. Может, поэтому и ругается на «функции в контексте курса», ведь там групп нет. А в когорты записывают через cohort_add_member
3. Cannot call moodle_page::add_body_class - это из «другой оперы», к записи не относится. Просто при формировании страницы (просмотра плагина, какой-то формы плагина) прежде всего нужно определять класс страницы ($PAGE->add_body_class('какой-то_класс'), а только потом что-то выводить на страницу (например, echo $OUTPUT->header();)
Так думаю улыбаюсь
В ответ на Vadim Tabunshchik

Re: PHP добавление пользователей в глобальные группы add_group_members

от tsit ucp -
Спасибо!
Я всё перепутал: мне нужно было всё-таки в локальные группы курсов записывать, а не в глобальные.

Проверил запись в глобальные группы: при наличии прав с помощью метода core_cohort_external::add_cohort_members(array($cohort)) происходит запись в группу и на тот курс, в котором есть элементы, у которых указана данная группа в качестве ограничения доступа к элементу (тесту в моём случае).

РЕШЕНО:

В чём была ошибка - я пытался вызвать метод на странице, на которой вначале присутствует вывод шапки (echo $OUTPUT->header();).
Как и указывалось в исключении: "Cannot call moodle_page::add_body_class after output has been started."

Если вызывать метод до первого использования $OUTPUT или на станице, на которой он вообще не используется, то пользователь/пользователи успешно добавляются в группы.

Рабочий пример:

require("$CFG->dirroot/group/externallib.php");

core_group_external::add_group_members([
    'members' => [
        'groupid' => 1075,
        'userid' => 12487,
    ]
]);

или

require("$CFG->dirroot/group/externallib.php");

$members = Array(
'members' => [
        'groupid' => 1075,
        'userid' => 12487,
    ],
    [
        'groupid' => 1075,
        'userid' => 12488,
    ],
);

core_group_external::add_group_members($members);

Причём, если пользователь уже записан в группу, ошибок при выполнении не возникает.