Отменить регистрацию пользователей Moodle в категории с использованием SQL

#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();
}