2016-10-09 2 views
0

Ich muss an- oder davon abmelden alle Benutzer sofort aus allen Kursen in einer bestimmten Kategorie (ausgewählt nach dem Namen oder Kürzel) in meinem moodle Ort. Ich denke, dass eine SQL-Anweisung der Weg ist, dies zu tun.abzumelden Moodle Benutzer in einer Kategorie mit SQL

Kurse sind nicht leer, also löschen Sie alle Kurse ist keine Option.

Danke

+0

Überprüfen Sie das Datenbankschema Ihrer Moodle-Version: https://docs.moodle.org/dev/Database_Schema. Kommen Sie mit den beteiligten Tischen zurück und Sie werden schneller reagieren. –

+0

Direkte SQL-Anweisungen sind normalerweise eine sehr schlechte Idee, Sie müssen die Moodle-API verwenden. – FMCorz

Antwort

1

ich die folgende Lösung getestet, aber es sollte die gewünschte Wirkung:

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

Das obige Skript kann eine Weile dauern, so dass Sie wahrscheinlich diese von der Kommandozeile ausgeführt werden soll .

Sie können Schleife über die Untergruppen mit:

$categories = $category->get_children(); 
foreach ($categories as $category) { 
} 

Um die ID einer Kategorie von Kurznamen zu erhalten, verwenden Sie Folgendes:

$name = "My category"; 
$categoryid = $DB->get_field('course_categories', 'id', array('name' => $name), MUST_EXIST); 

Beachten Sie, dass Kategorien identische Namen haben können, Sie sollten stattdessen die Kategorie idnumber verwenden.

1

Es wird sehr kompliziert, dies über SQL zu tun, da es viele Plugins zum Registrieren gibt. Jeder könnte seine eigenen Daten haben. Wenn Sie sich die function reset_course_userdata in /lib/moodlelib.php ansehen, gibt es diesen Codeabschnitt. Versuchen Sie, dies für das zu ändern, was Sie brauchen.

$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(); 
} 
Verwandte Themen