#mysql #moodle
#mysql #moodle
Вопрос:
Мне нужно отменить регистрацию всех пользователей сразу со всех курсов в определенной категории (выбранной по имени или короткому имени) на моем сайте moodle. Я думаю, что оператор SQL — это способ сделать это.
Курсы не пустые, поэтому удалить все курсы невозможно.
Спасибо
Комментарии:
1. Проверьте схему базы данных вашей версии moodle: docs.moodle.org/dev/Database_Schema . Возвращайтесь с включенными таблицами, и вы получите более быстрый ответ.
2. Прямые инструкции SQL обычно являются очень плохой идеей, вам нужно использовать Moodle API.
Ответ №1:
Я не тестировал следующее решение, но оно должно дать желаемый эффект:
require($CFG->libdir . '/coursecatlib.php');
require($CFG->libdir . '/enrollib.php');
$categoryid = 0; // Replace with the desired category ID.
$category = coursecat::get($categoryid);
foreach ($category->get_courses() as $course) {
// Simulates the deletion of the course, a better solution is to copy
// the logic from `enrol_course_delete` here directly.
enrol_course_delete($course);
}
Приведенный выше сценарий может занять некоторое время, поэтому вам, вероятно, следует выполнить его из командной строки.
Вы можете перебирать подкатегории с помощью:
$categories = $category->get_children();
foreach ($categories as $category) {
}
Чтобы получить идентификатор категории по короткому имени, используйте следующее:
$name = "My category";
$categoryid = $DB->get_field('course_categories', 'id', array('name' => $name), MUST_EXIST);
Обратите внимание, что категории могут иметь идентичные имена, вместо этого следует использовать категорию idnumber
.
Ответ №2:
Это будет очень сложно сделать с помощью SQL, потому что есть много плагинов для регистрации. У каждого может быть свой собственный набор данных.
Если вы посмотрите function reset_course_userdata
на /lib/moodlelib.php
этот раздел кода. Попробуйте изменить это для того, что вам нужно.
$plugins = enrol_get_plugins(true);
$instances = enrol_get_instances($data->courseid, true);
foreach ($instances as $key => $instance) {
if (!isset($plugins[$instance->enrol])) {
unset($instances[$key]);
continue;
}
}
foreach ($data->unenrol_users as $withroleid) {
if ($withroleid) {
$sql = "SELECT ue.*
FROM {user_enrolments} ue
JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid)
JOIN {context} c ON (c.contextlevel = :courselevel AND c.instanceid = e.courseid)
JOIN {role_assignments} ra ON (ra.contextid = c.id AND ra.roleid = :roleid AND ra.userid = ue.userid)";
$params = array('courseid' => $data->courseid, 'roleid' => $withroleid, 'courselevel' => CONTEXT_COURSE);
} else {
// Without any role assigned at course context.
$sql = "SELECT ue.*
FROM {user_enrolments} ue
JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid)
JOIN {context} c ON (c.contextlevel = :courselevel AND c.instanceid = e.courseid)
LEFT JOIN {role_assignments} ra ON (ra.contextid = c.id AND ra.userid = ue.userid)
WHERE ra.id IS null";
$params = array('courseid' => $data->courseid, 'courselevel' => CONTEXT_COURSE);
}
$rs = $DB->get_recordset_sql($sql, $params);
foreach ($rs as $ue) {
if (!isset($instances[$ue->enrolid])) {
continue;
}
$instance = $instances[$ue->enrolid];
$plugin = $plugins[$instance->enrol];
if (!$plugin->allow_unenrol($instance) and !$plugin->allow_unenrol_user($instance, $ue)) {
continue;
}
$plugin->unenrol_user($instance, $ue->userid);
$data->unenrolled[$ue->userid] = $ue->userid;
}
$rs->close();
}